Wtyczka LSP (serwer języka)¶
Inteligencja kodu napędzana Language Server Protocol — wężyki błędów, nawigacja, dymki, uzupełnianie, pomoc sygnatur, formatowanie, szukanie odwołań, zmiana nazwy i skok do symbolu — dla każdego języka, który ma serwer języka. Edytor rozmawia z serwerem po LSP; wtyczka jest klientem. To, jakie serwery istnieją, jest sterowane danymi (jeden mały JSON na język), więc C++/clangd poniżej to tylko jedna z kilku dołączonych definicji.
Edytor nie dołącza ani nie pobiera serwerów
Serwer języka to osobny program, który instalujesz raz. MTE wykrywa zainstalowany serwer i kieruje go na Twój projekt; nigdy żadnego nie dostarcza. Zobacz Pobieranie serwera języka.
Bieżące funkcje¶
| Funkcja | Jak |
|---|---|
| Diagnostyka | Błędy/ostrzeżenia z serwera pojawiają się jako faliste podkreślenia (czerwone = błąd, bursztynowe = ostrzeżenie, niebieskie = informacja, szare = wskazówka), aktualizowane podczas pisania. |
| Idź do definicji | Ustaw kursor na symbolu i naciśnij F12 albo użyj Szukaj ▸ Nawigacja po kodzie ▸ Idź do definicji. Skacze do definicji, otwierając w razie potrzeby inny plik. |
| Znajdź odwołania | Kursor na symbolu → Shift+F12 (albo Szukaj ▸ Nawigacja po kodzie ▸ Znajdź odwołania). Wyniki otwierają się w dolnym panelu Odwołania, pogrupowane po plikach z podglądem linii źródłowej; dwuklik skacze. |
| Dymek | Zatrzymaj wskaźnik nad symbolem; okienko pokazuje jego typ/sygnaturę i dokumentację (renderowaną z Markdownu serwera). |
| Uzupełnianie | Ctrl+Space prosi serwer o uzupełnienia i włącza je do okienka uzupełniania edytora (przed wbudowanymi podpowiedziami słów kluczowych/słów z buforów), filtrując podczas pisania. |
| Pomoc sygnatur | Wpisanie ( wywołania albo , pokazuje podpowiedź z sygnaturą funkcji i podświetlonym aktywnym parametrem; ) ją zamyka. |
| Formatuj dokument | Alt+Shift+F (albo Edycja ▸ Formatuj dokument) formatuje cały dokument przez serwer, jako jeden krok cofania. Styl określa konfiguracja samego serwera (dla clangd — plik .clang-format). |
| Znajdź odwołania (wyżej) | — |
| Zmień nazwę symbolu | Kursor na symbolu → Shift+F6 (albo Edycja ▸ Zmień nazwę symbolu). Podaj nową nazwę; każde użycie zostaje zaktualizowane. Gdy zmiana obejmuje kilka plików, najpierw pada prośba o potwierdzenie — każdy plik jest otwierany, zmieniany i zostawiany zmodyfikowany do przeglądu i zapisu. |
| Idź do symbolu (w pliku) | Ctrl+Shift+O otwiera Paletę poleceń z listą wszystkich symboli bieżącego pliku (funkcje, klasy, metody…); pisz, aby filtrować, Enter skacze. Każdy wiersz pokazuje rodzaj symbolu i jego kontener. |
| Idź do symbolu w przestrzeni roboczej | Ctrl+T przeszukuje symbole w całym projekcie podczas pisania (zapytanie dopasowuje serwer); Enter otwiera plik na symbolu. |
Wybieraki skoku do symbolu to tryby symboli Palety poleceń — zobacz Paletę poleceń.
Odwołania i zmiana nazwy między plikami wymagają indeksu serwera
Znajdź odwołania i Zmień nazwę sięgają do innych plików dopiero, gdy serwer
zaindeksuje projekt. Dla C/C++ oznacza to compile_commands.json (niżej) i
indeks działający w tle clangd; bez tego działają tylko na bieżącym pliku.
Zmiana nazwy cofa się na razie per plik
Wieloplikowa zmiana nazwy jest stosowana plik po pliku, więc każdy plik to osobny krok cofania (okno potwierdzenia o tym mówi). Przejrzyj zmodyfikowane karty przed zapisem.
Wskaźnik stanu serwera¶
Pasek stanu pokazuje zwarty segment LSP: (na lewo od innych segmentów
wtyczek), podsumowujący każdy serwer języka istotny dla otwartych plików:
| Glif | Znaczenie |
|---|---|
… |
Start — serwer został uruchomiony i trwa uzgadnianie. |
✓ |
Gotowy — obsługuje żądania. |
↻n |
Restart — serwer zakończył się nieoczekiwanie; zaplanowana jest automatyczna próba restartu nr n. |
✗ |
Ciemny — albo nie ma zainstalowanego serwera dla języka, albo serwer ciągle się wywalał i automatyczne restarty się poddały. |
Segment pojawia się przy otwarciu pierwszego dokumentu skonfigurowanego języka, śledzi tylko języki, dla których faktycznie masz otwarte dokumenty — zamknięcie ostatniego pliku języka usuwa jego wpis (ponowne otwarcie natychmiast go przywraca) — i znika całkowicie, gdy nie zostaje żaden taki dokument.
Gdy serwer się zawiesi¶
Serwer języka, który kończy się nieoczekiwanie, jest restartowany
automatycznie z rosnącym opóźnieniem (1 s, 2 s, 4 s… z limitem 30 s). W tym
czasie wskaźnik pokazuje ↻n, a powiadomienie na pasku stanu zgłasza pierwszą
awarię. Po udanym restarcie otwarte dokumenty są ponownie zgłaszane serwerowi
i diagnostyka wraca sama; nieaktualne wężyki po martwym serwerze są czyszczone
od razu. Edycja nigdy nie jest blokowana.
Po 5 nieudanych próbach z rzędu wtyczka się poddaje: wskaźnik pokazuje
✗, powiadomienie kieruje do ustawień, a język pozostaje ciemny, dopóki nie
zrestartujesz go ręcznie. Serwer, który działał poprawnie przez co najmniej
minutę, przy późniejszej awarii dostaje świeżą pulę prób.
Restart ręczny — jedno z dwojga:
- Szukaj ▸ Nawigacja po kodzie ▸ Zrestartuj serwery języka (bez domyślnego skrótu; dostępne też z Palety poleceń), albo
- przycisk Przeskanuj / zrestartuj serwery w Preferencje ▸ Serwer języka.
Oba zatrzymują wszystkie serwery, ponawiają wykrywanie z bieżącymi ustawieniami i resetują budżet awarii — użyj po zainstalowaniu brakującego serwera albo naprawieniu zepsutego.
Pobieranie serwera języka¶
Zainstaluj serwer dla swojego języka i upewnij się, że jest w PATH (albo
ustaw jawną ścieżkę w ustawieniach). Jeśli nie
zostanie znaleziony, funkcja po prostu nic nie robi dla tego języka —
wskaźnik stanu pokazuje ✗, a log notuje
jednorazową wskazówkę, ale nic Ci nie przeszkadza.
MTE dostarcza definicje serwerów (nie serwery) dla wielu języków, więc większość wymaga tylko instalacji serwera — bez edycji JSON-a. Dołączone definicje obejmują C/C++, Pythona, Rusta, Go, TypeScript, JavaScript, C#, Javę, HTML, CSS, JSON, YAML i Bash (plus przyszłościowe wpisy Kotlin, Swift i Objective-C, które aktywują się, gdy te języki dostaną kolorowanie składni).
| Język | Serwer | Skąd wziąć |
|---|---|---|
| C/C++ | clangd | winget install LLVM.LLVM (Windows), komponent „C++ Clang tools" w instalatorze Visual Studio, brew install llvm (macOS) albo pakiet clang-tools-extra Twojej dystrybucji. |
| Python | pyright | npm i -g pyright. |
| TypeScript/JS | typescript-language-server | npm i -g typescript-language-server typescript. |
| Rust | rust-analyzer | rustup component add rust-analyzer. |
| Go | gopls | go install golang.org/x/tools/gopls@latest. |
Zweryfikuj w terminalu, np. clangd --version. Dla języka bez dołączonej
definicji dodaj własną jak w Dodawaniu języka.
Projekty C/C++ potrzebują compile_commands.json¶
clangd rozumie Twój kod dokładnie tylko wtedy, gdy zna flagi kompilacji — z
bazy kompilacji (compile_commands.json). Bez niej clangd zgaduje, a
funkcje międzyplikowe (znajdź odwołania, zmiana nazwy) pozostają ograniczone
do otwartego pliku.
MTE znajduje compile_commands.json automatycznie — przeszukuje korzeń
projektu i typowe katalogi budowania (build/, out/, cmake-build-*,
.mte-compile-commands/) i wskazuje go clangd. Bazę generujesz Ty; edytor
tego nie robi (niezawodne skonfigurowanie dowolnego projektu wymaga
środowiska Twojego toolchaina/SDK, którego edytor nie ma). Gdy projekt C/C++
jej nie ma, MTE pokazuje jednorazową wskazówkę (z opcją Nie pokazuj
ponownie) prowadzącą tutaj.
Generowanie (CMake)¶
CMAKE_EXPORT_COMPILE_COMMANDS honorują tylko generatory Ninja i
Makefile — generator Visual Studio go ignoruje (nie tworzy
compile_commands.json nawet z ustawioną flagą). Generuj więc bazę
Ninją, do dedykowanego katalogu, osobnego od tego, w którym zwykle
budujesz: CMake odmawia rekonfiguracji istniejącego katalogu budowania innym
generatorem, więc projekt budowany zwykle Visual Studio potrzebuje własnego
katalogu Ninja.
To krok wyłącznie konfiguracyjny (pełny build nie jest potrzebny). Z korzenia projektu:
.mte-compile-commands/to jeden ze skanowanych katalogów, więc wynikowycompile_commands.jsonzostaje znaleziony automatycznie. Zadziała też każdy inny skanowany katalog (build/,out/,cmake-build-*albo korzeń projektu) — trzymaj go tylko osobno od katalogu skonfigurowanego innym generatorem.- Uruchom to w środowisku, w którym projekt naprawdę się konfiguruje: właściwy
kompilator w
PATH(np. x64 Native Tools Command Prompt na Windows) i zmienne, których projekt wymaga (jakQT6_DIRdla projektu Qt). Jeślicmakenie znajdzie kompilatora lub SDK, baza wyjdzie pusta albo bez ścieżek include i clangd nie zaindeksuje dobrze. - Potem otwórz folder ponownie. Log nie powinien już mówić „no compile_commands.json"; daj clangd chwilę na zbudowanie indeksu w tle, zanim odwołania/zmiana nazwy obejmą pliki.
Inne systemy budowania: Bear (bear -- make), compiledb, Meson, Bazel i
inne też potrafią wytworzyć compile_commands.json, który wtyczka znajdzie.
Dodawanie języka¶
Serwery opisują pliki JSON ładowane przez wtyczkę przy starcie z
<editor>/lsp-servers/*.json. Każdy wpis mapuje język na jego polecenie plus
wskazówki wykrywania:
{
"language": "cpp",
"command": "clangd",
"aliases": ["clangd-18", "clangd-17"],
"args": ["--background-index"],
"extensions": [".cpp", ".h", ".hpp"],
"searchDirs": ["${LLVM}/bin", "${ProgramFiles}/LLVM/bin"],
"docsAnchor": "cpp-clangd",
"compileCommandsArg": "--compile-commands-dir=${dir}"
}
languageodpowiada wykrytemu przez edytor identyfikatorowi języka;command/aliasesto nazwy plików wykonywalnych próbowane wPATH;searchDirs(z rozwijaniem${VAR}) to dodatkowe lokalizacje instalacji.compileCommandsArg(opcjonalny) jest dołączany z${dir}zastąpionym znalezionym katalogiem bazy — tak clangd zostaje skierowany nacompile_commands.json.
Jak lokalizowany jest serwer¶
Dla pasującego dokumentu wtyczka rozwiązuje serwer po kolei: jawnie
skonfigurowana ścieżka → command i jego aliases w PATH → searchDirs
wpisu i lokalizacje ekosystemowe. Serwer startuje raz na język i jest
zamykany razem z edytorem.
Ustawienia serwera języka¶
Preferencje ▸ Serwer języka wymienia każdy język z istniejącą definicją serwera. Per język możesz:
- Włączyć / wyłączyć serwer (wyłączony język nigdy go nie uruchamia).
- Ustawić jawną ścieżkę pliku wykonywalnego (z Przeglądaj…). To
nadpisanie wygrywa z powyższym wyszukiwaniem
PATH/searchDirs— przydatne, gdy serwera nie ma wPATHalbo chcesz konkretny build.
Zmiany działają po OK / Zastosuj: jeśli którakolwiek flaga włączenia lub ścieżka faktycznie się zmieniła, serwery restartują się z nowymi ustawieniami automatycznie (niedotknięta strona nigdy nie rusza działających serwerów). Przycisk Przeskanuj / zrestartuj serwery dodatkowo wymusza zatrzymanie i ponowne wykrycie z bieżącymi ustawieniami — przydatne po instalacji serwera, którego edytor wcześniej nie znajdował; resetuje też budżet restartów po awarii.
Ograniczenia¶
- Kolorowanie kodu w dymkach nie jest stosowane (tekst jest formatowany — pogrubienia, nagłówki, kod o stałej szerokości — ale bez kolorowania składni).
- Dokładność zależy od serwera: dla C/C++ bez
compile_commands.jsonclangd wraca do heurystyk i wyniki mogą być niepełne.