Zásuvný modul LSP (jazykový server)¶
Inteligencia kódu postavená na Language Server Protocol — vlnovky pri chybách, navigácia, informácie pri najazdení, dopĺňanie, pomoc so signatúrou, formátovanie, hľadanie odkazov, premenovanie a prechod na symbol — pre ľubovoľný jazyk, ktorý má jazykový server. Editor sa so serverom rozpráva cez LSP; zásuvný modul je klientom. Ktoré servery existujú, určujú údaje (jeden malý súbor JSON na jazyk), takže C/C++ a clangd nižšie sú iba jednou z niekoľkých dodávaných definícií.
Editor servery nedodáva ani nesťahuje
Jazykový server je samostatný program, ktorý si raz nainštalujete. MTE nainštalovaný server rozpozná a nasmeruje ho na váš projekt; nikdy žiadny nedodáva. Pozri Získanie jazykového servera.
Súčasné funkcie¶
| Funkcia | Ako |
|---|---|
| Diagnostika | Chyby a upozornenia zo servera sa objavujú ako vlnovkové podčiarknutia (červená = chyba, jantárová = upozornenie, modrá = informácia, sivá = rada), aktualizované počas písania. |
| Prejsť na definíciu | Umiestnite kurzor na symbol a stlačte F12, prípadne použite Hľadať ▸ Navigácia v kóde ▸ Prejsť na definíciu. Skočí na definíciu a v prípade potreby otvorí iný súbor. |
| Nájsť odkazy | Kurzor na symbole → Shift+F12 (alebo Hľadať ▸ Navigácia v kóde ▸ Nájsť odkazy). Výsledky sa otvoria v spodnom paneli Odkazy, zoskupené podľa súboru s náhľadom zdrojového riadka; dvojklikom na ne skočíte. |
| Informácie pri najazdení | Podržte ukazovateľ nad symbolom; vyskakovacie okno zobrazí jeho typ či signatúru a dokumentáciu (vykreslenú zo servera z formátu Markdown). |
| Dopĺňanie | Ctrl+Space vyžiada doplnenia zo servera a zapracuje ich do vyskakovacieho okna dopĺňania v editore (pred vstavané návrhy z kľúčových slov a bufferov), filtrované počas písania. |
| Pomoc so signatúrou | Napísaním ( alebo , vo volaní sa zobrazí bublina so signatúrou funkcie a so zvýrazneným aktívnym parametrom; ) ju zatvorí. |
| Formátovať dokument | Alt+Shift+F (⌃⌥F na macOS; prípadne Úpravy ▸ Formátovať dokument) preformátuje cez server celý dokument, v jedinom kroku späť. O štýl sa stará vlastná konfigurácia servera (pri clangde súbor .clang-format). |
| Nájsť odkazy (uvedené vyššie) | — |
| Premenovať symbol | Kurzor na symbole → Shift+F6 (alebo Úpravy ▸ Premenovať symbol). Zadajte nový názov; aktualizuje sa každé použitie. Keď premenovanie zasahuje do viacerých súborov, najprv sa vyžiada potvrdenie — každý súbor sa otvorí, zmení a ponechá zmenený, aby ste ho mohli posúdiť a uložiť. |
| Prejsť na symbol (v súbore) | Ctrl+Shift+O otvorí Paletu príkazov so zoznamom každého symbolu v aktuálnom súbore (funkcie, triedy, metódy…); písaním filtrujete, Enter skočí. Každý riadok zobrazuje druh symbolu a jeho kontajner. |
| Prejsť na symbol v pracovnom priestore | Ctrl+T počas písania prehľadáva symboly v celom projekte (zhody hľadá server); Enter otvorí súbor na mieste symbolu. |
Výbery na prechod na symbol sú režimy symbolov v Palete príkazov — pozri Paletu príkazov.
Príkazy sú zosivené, kým server nebeží
Prejsť na definíciu, Nájsť odkazy, Formátovať dokument a Premenovať symbol sú dostupné iba vtedy, keď je jazykový server pre jazyk aktuálneho súboru pripravený — a keď server pri nadviazaní spojenia ohlásil, že danú požiadavku podporuje. Pri súbore bez nastaveného servera, prípadne kým sa server spúšťa, reštartuje alebo to vzdal, sú položky ponuky zosivené, namiesto aby po stlačení neurobili nič. Ktorá z týchto možností nastala, vám povie nižšie opísaný ukazovateľ stavu. Reštartovať jazykové servery nie je zosivené nikdy: je to cesta von zo servera, ktorý to vzdal.
Odkazy a premenovanie naprieč súbormi potrebujú index servera
Nájsť odkazy a Premenovať siahnu do ďalších súborov, až keď server projekt zaindexuje. Pri
C/C++ to znamená compile_commands.json (pozri nižšie) a index clangdu na pozadí; bez neho
pracujú iba s aktuálnym súborom.
Premenovanie sa zatiaľ vracia po súboroch
Premenovanie naprieč viacerými súbormi sa uplatňuje súbor po súbore, takže je každý súbor vlastným krokom späť (potvrdzovací dialóg to uvádza). Pred uložením si zmenené karty prezrite.
V kontextovej ponuke editora¶
Kliknite pravým tlačidlom na symbol v texte a ponuka pod editačnými príkazmi ponúkne Prejsť na definíciu, Nájsť odkazy, Premenovať symbol a Formátovať dokument. Každá položka sa zobrazí len vtedy, keď by rovnaký príkaz v hlavnej ponuke práve teraz fungoval — jazykový server pre súbor je pripravený a príkaz podporuje a pri premenovaní a formátovaní dokument nie je iba na čítanie. V obyčajnom textovom súbore, na okraji naľavo od textu alebo počas spúšťania servera sa nezobrazí žiadna z nich.
Položky pôsobia na symbol, na ktorý ste klikli pravým tlačidlom, nie na symbol pod kurzorom; kurzor aj výber zostanú, kde boli. Premenovanie navrhne ako starý názov výber, ak ste klikli doň, inak slovo pod ukazovateľom. Formátovať dokument vždy formátuje celý dokument. Ponuka otvorená z klávesnice pôsobí na pozícii kurzora.
Tam, kde platforma v kontextových ponukách zobrazuje klávesové skratky (Windows), ukazuje každá položka svoju skratku — tú, ktorá práve platí, vrátane vašich vlastných zmien v Mapovaní skratiek. V macOS kontextové ponuky skratky nezobrazujú.
Ako sa vaše úpravy dostanú k serveru¶
Písanie neposiela správu pri každom stlačení klávesu. Úpravy sa na zlomok sekundy zhromaždia a potom sa odošlú ako jedna zmena — a to ako jediný upravený rozsah, nie celý súbor, vždy keď server oznámi, že to zvládne (väčšina áno). Veľký súbor tak stojí pri dávke písania pár desiatok bajtov namiesto vlastnej kópie.
Všetko, čo sa servera na text pýta — informácie pri najazdení, prechod na definíciu, hľadanie odkazov, premenovanie, formátovanie, dopĺňanie, pomoc so signatúrou — najprv odošle čakajúcu úpravu, takže sa odpoveď nikdy netýka verzie, ktorú ste už opustili. To isté robí uloženie súboru.
Ani spustenie servera editor neblokuje: proces sa spúšťa na pozadí a segment stavu zobrazuje
…, kým nedokončí nadviazanie spojenia. Binárny súbor servera, ktorý sa pri štarte zasekne, vás
nestojí nič okrem daného jazyka.
Strop na počet vykreslených problémov
Na dokument sa vykreslí najviac 2000 vlnoviek. Za touto hranicou je súbor aj tak nečitateľný a každá ďalšia značka stojí editor skutočný čas — takže keď súbor vyprodukuje viac, zobrazí sa prvých 2000 a stavový riadok uvedie Zobrazených je prvých 2000 z N problémov v tomto súbore, namiesto aby počet potichu vyzeral menší, než je. Zvyčajne je to známka toho, že sa server na súbor pozerá zle: chýbajúca databáza prekladu alebo generovaný súbor, ktorý sa nemá prekladať samostatne.
Ukazovateľ stavu servera¶
Stavový riadok zobrazuje kompaktný segment LSP: (naľavo od ostatných segmentov zásuvných
modulov), ktorý zhŕňa každý jazykový server relevantný pre vaše otvorené súbory:
| Znak | Význam |
|---|---|
… |
Spúšťa sa — server bol spustený a nadväzuje spojenie. |
✓ |
Pripravený — obsluhuje požiadavky. |
↻n |
Reštartuje sa — server sa nečakane zastavil; je naplánovaný automatický pokus o reštart číslo n. |
✗ |
Pre tento jazyk nie je nainštalovaný žiadny server. Nainštalujte ho (pozri nižšie) a potom použite Reštartovať jazykové servery. |
⚠ |
Vzdal to — server opakovane padal a automatické reštarty sa zastavili. Oživí ho iba ručný reštart. |
Za znakom môže jazyk niesť krátky spresňujúci údaj — server beží, no niečo vo vašom projekte naďalej obmedzuje, na čo dokáže odpovedať. Zobrazuje sa vždy iba jeden, a to najzávažnejší:
| Spresňujúci údaj | Význam |
|---|---|
· server neodpovedá |
Niekoľko požiadaviek za sebou ostalo bez odpovede. Server žije, ale zasekol sa; použite Zobraziť log jazykového servera a potom Reštartovať jazykové servery. Údaj zmizne v okamihu, keď server na čokoľvek odpovie. |
· žiadna databáza prekladu |
Server pre C/C++ beží, ale vidí iba súbor, ktorý máte otvorený — pozri Projekty v C/C++ potrebujú compile_commands.json. |
· žiadny Cargo.toml, · žiadny go.mod, · žiadny tsconfig.json, … |
Projekt nemá ani jeden zo súborov, ktoré tento server potrebuje na to, aby mu rozumel ako projektu. S otvoreným súborom naďalej funguje; odpovede naprieč súbormi budú neúplné, kým súbor nevznikne. Presný názov je ten, ktorý server chce najviac — pozri Čo každý server potrebuje od vášho projektu. |
Segment sa objaví, keď sa otvorí prvý dokument s nastaveným jazykom, sleduje iba jazyky, pre ktoré máte skutočne otvorené dokumenty — zatvorením posledného súboru daného jazyka jeho položka zmizne (opätovným otvorením sa hneď vráti) — a keď žiadny taký dokument neostane, skryje sa úplne.
Hľadať ▸ Navigácia v kóde ▸ Zobraziť log jazykového servera zobrazí najnovší výstup každého bežiaceho servera. Práve tam sa server vysvetľuje: chýbajúci nástrojový reťazec, nečitateľný konfiguračný súbor, projekt, ktorý odmietol načítať. Okno je bežné, meniteľné veľkosťou — každý jazyk je nadpisom, ktorý pomenúva server bežiaci pre daný jazyk, text sa dá označiť, tlačidlo Kopírovať vloží celý log do schránky a veľkosť, akú oknu dáte, sa zapamätá.
Keď server spadne¶
Jazykový server, ktorý sa nečakane skončí, sa automaticky reštartuje s narastajúcim
oneskorením (1 s, 2 s, 4 s… so stropom 30 s). Kým sa to deje, ukazovateľ zobrazuje ↻n
a upozornenie v stavovom riadku ohlási prvý pád. Po úspešnom reštarte sa vaše otvorené dokumenty
serveru znova ohlásia a diagnostika sa vráti sama; zastarané vlnovky z mŕtveho servera sa hneď
vymažú. Úpravy sa nikdy neblokujú.
Po 5 neúspešných pokusoch za sebou to zásuvný modul vzdá: ukazovateľ zobrazí ✗,
upozornenie vás nasmeruje do nastavení a jazyk ostane temný, kým ho ručne nereštartujete. Server,
ktorý bežal bez problémov aspoň minútu, dostane pri neskoršom páde novú sadu pokusov.
Ručný reštart — jedno z týchto dvoch:
- Hľadať ▸ Navigácia v kóde ▸ Reštartovať jazykové servery (bez predvolenej skratky; dostupné aj z Palety príkazov), alebo
- tlačidlo Znova prehľadať / reštartovať servery v Predvoľby ▸ Jazykový server.
Ak sa chcete pred reštartom pozrieť, prečo je server nespokojný, použite Hľadať ▸ Navigácia v kóde ▸ Zobraziť log jazykového servera.
Obidve možnosti každý server zrušia, znova spustia vyhľadávanie s aktuálnymi nastaveniami a vynulujú rozpočet zlyhaní — použite ich po nainštalovaní chýbajúceho servera alebo po oprave pokazeného.
Získanie jazykového servera¶
Nainštalujte server pre svoj jazyk a uistite sa, že je vo vašej premennej PATH (prípadne
nastavte výslovnú cestu v nastaveniach). Ak sa nenájde žiadny,
funkcia pre daný jazyk jednoducho neurobí nič — ukazovateľ stavu
zobrazí ✗ a log zaznamená jednorazovú poznámku, no nič vás nevyruší.
MTE dodáva definície serverov (nie servery samotné) pre mnoho jazykov, takže väčšine stačí server nainštalovať — bez úprav súborov JSON. Dodávané definície pokrývajú C/C++, Objective-C, Python, Rust, Go, TypeScript, JavaScript, C#, Javu, Kotlin, Swift, HTML, CSS/SCSS/Less, JSON, YAML a shellové skripty.
| Jazyk | Server | Kde ho získať |
|---|---|---|
| C/C++ | clangd | winget install LLVM.LLVM (Windows), komponent „C++ Clang tools“ v inštalátore Visual Studia, brew install llvm (macOS) alebo balík clang-tools-extra vašej distribúcie. |
| Python | pyright alebo pylsp | npm i -g pyright (potrebuje Node.js), alebo pip install python-lsp-server (potrebuje iba Python). |
| 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. |
| C# | csharp-ls alebo OmniSharp | dotnet tool install -g csharp-ls (jediný nástroj dotnet, skúša sa prvý) alebo stiahnite vydanie OmniSharpu. |
| Java | jdtls (Eclipse JDT Language Server) | brew install jdtls (macOS) alebo rozbaľte vydanie a jeho priečinok bin pridajte do premennej PATH. |
Overte si to v termináli, napríklad príkazom clangd --version alebo where clangd /
which clangd. Pre jazyk, na ktorý MTE definíciu nedodáva, si ju pridajte podľa kapitoly
Pridanie jazyka.
Python: pyright alebo pylsp¶
Python má dve dodávané definície a OctoEdit spustí tú, ktorá je skutočne nainštalovaná:
- Ako prvý sa skúša pyright (
pyright-langserver). Je to balík npm, takže potrebuje Node.js:npm i -g pyright. - pylsp (
python-lsp-server) sa použije, keď sa pyright nenájde. Je to balík pip a potrebuje iba Python:pip install python-lsp-server.
Ak sú nainštalované obidva, vyhráva pyright. Pre Python existuje jediný riadok nastavení (jeden
prepínač zapnutia, jedno prekrytie cesty) a platí pre ten server, ktorý sa použije — nastavením
výslovnej cesty k spustiteľnému súboru pylsp sa spustí pylsp so svojimi argumentmi na
spustenie, nie s argumentmi pyrightu. Zobraziť log jazykového servera pomenúva server, ktorý
skutočne beží.
Niekoľko serverov pre jeden jazyk
Je to všeobecný mechanizmus, nie výnimka pre Python: jazyk môže mať ľubovoľný počet
dodávaných definícií, zoradených podľa poľa priority, a spustí sa prvá z nich, ktorej
spustiteľný súbor sa na vašom počítači nájde. Rovnako funguje C# — najprv csharp-ls,
potom OmniSharp — pretože každý z nich prijíma iné argumenty na spustenie a správny môže
byť iba jeden.
Java: vlastný pracovný priestor servera¶
jdtls sa odmieta spustiť bez vlastného zapisovateľného priečinka pracovného priestoru
(-data). OctoEdit mu ho dodá automaticky, pre každý projekt zvlášť, v priečinku s údajmi
zásuvného modulu:
Nikdy ho nemusíte vytvárať ani pomenúvať. Odstránenie priečinka je bezpečné — jdtls ho vytvorí znova, za cenu jedného opätovného indexovania.
Nastavenie vo Windows¶
Čerstvý počítač s Windows zvyčajne nemá v premennej PATH ani jeden z nástrojov clangd,
cmake, ninja, node či python. Táto kapitola uvádza, odkiaľ každý z nich pochádza a ako si
ho overiť. Premennú PATH zvyčajne upravovať nemusíte — OctoEdit prehľadáva aj nižšie uvedené
priečinky ekosystémov.
| Chcete | Nainštalujte | Kam sa dostane |
|---|---|---|
| clangd (C/C++) | winget install LLVM.LLVM |
C:\Program Files\LLVM\bin\clangd.exe |
| cmake a ninja | Komponent „C++ CMake tools for Windows“ v inštalátore Visual Studia | …\Microsoft Visual Studio\2022\<edition>\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin a …\CMake\Ninja — nie sú vo vašej premennej PATH, ale sú dostupné cez vývojárske prostredie Visual Studia (pozri nižšie). Samostatná inštalácia winget install Kitware.CMake / winget install Ninja-build.Ninja ich namiesto toho pridá do PATH. |
| pyright (Python) | winget install OpenJS.NodeJS.LTS a potom npm i -g pyright |
%APPDATA%\npm\pyright-langserver.cmd |
| pylsp (Python, bez potreby Node.js) | Python z Microsoft Store alebo z python.org a potom pip install python-lsp-server |
%LOCALAPPDATA%\Packages\PythonSoftwareFoundation.Python.3.*_*\LocalCache\local-packages\Python3*\Scripts\pylsp.exe (Store) alebo %APPDATA%\Python\Python3*\Scripts\pylsp.exe |
Overenie, čo je viditeľné. V bežnom príkazovom riadku alebo v prostredí PowerShell:
Príkaz where prehľadáva iba vašu premennú PATH. Nástroj, ktorý nenájde, môže OctoEdit
napriek tomu nájsť, pretože jeho hľadanie pokrýva aj vyššie uvedené priečinky ekosystémov —
priečinky so skriptmi Pythonu obzvlášť nikdy v PATH nie sú. Ak jazyk po inštalácii servera
ostáva na ✗, použite Hľadať ▸ Navigácia v kóde ▸ Reštartovať jazykové servery, čím sa celé
hľadanie spustí znova.
Generovanie databázy prekladu prebieha vo vývojárskom prostredí Visual Studia. Keď za vás
OctoEdit spúšťa CMake (pozri nižšie), najprv nájde Visual Studio — cez VSINSTALLDIR, inak cez
vswhere.exe — a volanie obalí do VsDevCmd.bat -arch=x64 danej inštalácie. Práve to pre
tento jeden príkaz sprístupní cl, Windows SDK a vlastný cmake/ninja Visual Studia, takže
ich editor vôbec nepotrebuje mať vo vašej premennej PATH. Bez Visual Studia (na počítači
iba s clangom alebo s MinGW) sa volanie urobí jednoducho vo vlastnom prostredí editora a log to
uvedie; potom si musíte cmake a ninja sprístupniť sami, aj prekladač, ktorý CMake rozpozná.
Generovanie na požiadanie. Hľadať ▸ Navigácia v kóde ▸ Vygenerovať databázu prekladu…
spustí to isté generovanie kedykoľvek — aj keď databáza už existuje (prekonfiguruje sa na
mieste) a aj keď ste predtým odpovedali Pri tomto projekte sa nepýtať. Položka je dostupná
vždy — keď generovať nemôže, uvedie v stavovom riadku prečo (žiadny dokument v C/C++, žiadny
priečinok projektu, žiadny CMakeLists.txt v koreni projektu, žiadny cmake alebo žiadny
generátor, ktorý by tu databázu vedel exportovať), namiesto aby bola zosivená z dôvodu, ktorý
nevidíte.
Kde sa uchováva odpoveď „nepýtať sa“. Pri tomto projekte sa nepýtať sa uchováva pre každý
koreň projektu v súbore %APPDATA%\7-bits\OctoEdit.ini pod kľúčom
plugins/org.mte.lsp/noCompileDbPrompt/<hash> (cesta k projektu je zahašovaná, pretože cesta
nie je platným kľúčom nastavení). Spustením Vygenerovať databázu prekladu… sa pre daný
projekt zruší.
Kde OctoEdit server hľadá¶
Nemali by ste musieť nič nastavovať. Po nainštalovaní servera stačí otvoriť priečinok a zdrojový súbor. Editor postupne skúša:
- výslovnú cestu, ktorú ste nastavili v nastaveniach — je záväzná: ak sa nedá vyhodnotiť, jazyk ostane temný, namiesto aby sa potichu vrátil k niečomu inému;
- vašu premennú
PATH, a to pre príkaz servera aj pre každý známy alias (clangd-20,clangd-19, …); - miesta inštalácie uvedené v definícii servera pre váš operačný systém;
- vstavaný zoznam priečinkov ekosystémov.
| Prehľadávané priečinky ekosystémov | |
|---|---|
| Windows | globálna predpona npm a %APPDATA%\npm, %LOCALAPPDATA%\Microsoft\WinGet\Links, %USERPROFILE%\.cargo\bin, %USERPROFILE%\go\bin a %LOCALAPPDATA%\go\bin, %USERPROFILE%\.dotnet\tools, %ProgramFiles%\LLVM\bin, %ProgramFiles%\nodejs a používateľské priečinky so skriptmi Pythonu: %APPDATA%\Python\Python3*\Scripts, %LOCALAPPDATA%\Packages\PythonSoftwareFoundation.Python.3.*_*\LocalCache\local-packages\Python3*\Scripts (Python z Microsoft Store) a %LOCALAPPDATA%\Programs\Python\Python3*\Scripts |
| macOS | /opt/homebrew/bin a /opt/homebrew/opt/llvm/bin (clangd z Homebrew sa nachádza v druhom — do prvého sa nikdy neodkazuje), /usr/local/bin, /usr/local/opt/llvm/bin, ~/.cargo/bin, ~/go/bin, ~/.local/bin, ~/.npm-global/bin, ~/.dotnet/tools, ~/Library/Python/3.*/bin |
| Linux | /usr/local/bin, /usr/lib/llvm*/bin, Linuxbrew a tie isté ~/.cargo/bin, ~/go/bin, ~/.local/bin, ~/.npm-global/bin, ~/.dotnet/tools |
Položky s * sú skutočné zástupné znaky: priečinok s verziou, ktorý Python vytvorí
(Python313, 3.13 alebo …Python.3.13_qbz5n2kfra8p0 z obchodu Store), sa porovnáva s tým, čo
je skutočne na disku, od najnovšieho. Práve tam pip install python-lsp-server umiestni pylsp
a práve preto jeho inštalácia nevyžaduje úpravu premennej PATH.
macOS: spustenie z Findera verzus z terminálu
Aplikácia spustená z Findera alebo z Docku nededí premennú PATH z profilu vášho
shellu — macOS jej dá minimálnu (/usr/bin:/bin:/usr/sbin:/sbin). Homebrew, Cargo, Go aj
npm by boli neviditeľné. OctoEdit sa preto pýta vášho prihlasovacieho shellu, akú má
premennú PATH, a prehľadáva aj tú, pričom výsledné prostredie odovzdá serveru, ktorý
spúšťa — takže sa server nainštalovaný ktorýmkoľvek z týchto nástrojov nájde bez ohľadu na
to, ako editor spustíte.
Server sa spúšťa raz na jazyk a ukončuje sa s editorom.
Projekty v C/C++ potrebujú compile_commands.json¶
clangd rozumie vášmu kódu presne iba vtedy, keď pozná prepínače prekladu z databázy prekladu
(compile_commands.json). Bez nej clangd háda a funkcie naprieč súbormi (hľadanie odkazov,
premenovanie) ostávajú obmedzené na otvorený súbor. clangd sa aj tak spustí v obidvoch
prípadoch.
Projekt v C/C++ sa považuje za nastavený, keď má ktorúkoľvek z týchto vecí:
- súbor
compile_commands.jsonv koreni projektu alebo v jednom z priečinkov zostavenia, ktoré MTE prehľadáva (build/,Build/,out/,out/build/,cmake-build-debug/,cmake-build-release/,.mte-compile-commands/); - súbor
compile_flags.txtv koreni projektu; - konfiguračný súbor
.clangdv koreni projektu.
Posledné dva si clangd načíta sám, takže sa pre ne nič nehlási.
Keď nie je prítomné ani jedno z toho — pri každom projekte v C/C++, nech používa
ktorýkoľvek systém zostavenia — segment stavu zobrazí · žiadna databáza prekladu a stavový
riadok to raz oznámi správou. Nič sa neblokuje; písanie neprerušuje žiadny dialóg.
Nechajte OctoEdit, nech ju vygeneruje (projekty s CMake)¶
Ak má koreň projektu súbor CMakeLists.txt a CMake, ktorý by databázu skutočne vytvoril,
dostanete raz na projekt túto ponuku:
- Vygenerovať — spustí CMake na pozadí, iba v režime konfigurácie: nič sa neprekladá
a vaše vlastné priečinky zostavenia ostanú nedotknuté. Výsledok pristane
v
<project>/.mte-compile-commands/. Po úspechu sa clangd reštartuje s novou databázou; po neúspechu sa zobrazia posledné riadky logu CMake spolu s presným príkazom, ktorý sa vyskúšal, aby ste ho mohli zopakovať sami. - Ako to urobiť ručne — zobrazí ten istý príkaz bez jeho spustenia.
- Pri tomto projekte sa nepýtať — zapamätá sa pre každý koreň projektu.
Okno „ako to urobiť ručne“ aj okno s neúspechom zobrazujú presný príkazový riadok v označiteľnom poli s kódom, nad ktorým je jediné tlačidlo Kopírovať, ktorého bublina uvádza, čo skopíruje: samotný príkaz, prípadne príkaz aj s koncom logu CMake, keď nejaký je. Okno s neúspechom sa dá meniť veľkosťou a pamätá si veľkosť, akú mu dáte — každé z týchto okien si pamätá vlastnú veľkosť, takže zväčšením logu servera sa dvojriadkové okno s pokynmi neotvorí rovnako veľké.
Nie ste odkázaní na túto jedinú ponuku: Hľadať ▸ Navigácia v kóde ▸ Vygenerovať databázu prekladu… spustí to isté generovanie, kedykoľvek budete chcieť — po pridaní súborov, po zmene možností zostavenia alebo po tom, čo ste odpovedali Pri tomto projekte sa nepýtať (čo tým zrušíte). Existujúca databáza sa prekonfiguruje na mieste. Položka je dostupná vždy; keď generovať nemôže, uvedie v stavovom riadku prečo.
Vaše predvoľby majú prednosť. Ak má projekt CMakePresets.json (alebo
CMakeUserPresets.json), nakonfiguruje OctoEdit vašou predvoľbou namiesto vymýšľania
príkazového riadka — cmake --preset <name> -B <project>/.mte-compile-commands
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON. Vďaka tomu sú generátor, nástrojová sada aj blok
environment predvoľby (QT6_DIR, cesta k SDK) tie, na ktorých projekt už stojí, a CMake ich
uplatní sám. Predvoľby, ktoré sú skryté, ktoré na vašom operačnom systéme vylučuje condition
alebo ktoré konfigurujú generátorom neschopným exportu, sa preskakujú; uprednostňuje sa názov
obsahujúci debug. Vášho vlastného priečinka zostavenia sa to nikdy nedotkne — editor výstup
vždy presmeruje pomocou -B.
Vo Windows sa CMake spúšťa vo vývojárskom prostredí Visual Studia. Editor spustený
z Prieskumníka alebo z ponuky Štart nemá v premennej PATH cl a CMake by sa potom potichu
uspokojil s ktorýmkoľvek iným prekladačom, ktorý nájde — vrátane clang.exe, ktorý sa dodáva
vnútri inštalácie Visual Studia a ktorý okamžite zlyhá na nastaveniach špecifických pre MSVC.
OctoEdit preto nájde Visual Studio pomocou vswhere a volanie obalí do VsDevCmd.bat
-arch=x64. Ak nie je nainštalované žiadne Visual Studio (počítač s MinGW alebo iba s clangom),
volanie sa urobí jednoducho a log to uvedie.
Predchádzajúci neúspešný pokus sa pred opakovaním vyčistí: jeho CMakeCache.txt by inak
zafixoval prekladač, ktorý zlyhal. Priečinok, ktorý už obsahuje funkčný compile_commands.json,
sa prekonfiguruje na mieste, nikdy sa neodstráni.
Prečo sa ponuka niekedy neobjaví
CMAKE_EXPORT_COMPILE_COMMANDS rešpektujú iba generátory Ninja a Makefile; generátor
Visual Studia ho ignoruje a nezapíše žiadnu databázu. Vo Windows sa preto pri projekte bez
použiteľnej predvoľby ponuka objaví iba vtedy, keď máte v premennej PATH ninja. Keď sú
jedinými použiteľnými predvoľbami projektu tie pre Visual Studio a Ninja tiež nie je,
OctoEdit uvedie, ktorá predvoľba stála v ceste, namiesto aby ponúkol spustenie niečoho, čo
by nemohlo fungovať.
Vygenerovanie vlastnými silami (CMake)¶
CMAKE_EXPORT_COMPILE_COMMANDS rešpektujú iba generátory Ninja a Makefile — generátor
Visual Studia ho ignoruje (compile_commands.json nevytvorí ani s nastaveným prepínačom).
Databázu preto generujte pomocou Ninja, do vyhradeného priečinka oddeleného od toho,
v ktorom bežne zostavujete: CMake odmieta prekonfigurovať existujúci priečinok zostavenia iným
generátorom, takže projekt, ktorý zvyčajne zostavujete vo Visual Studiu, potrebuje vlastný
priečinok pre Ninja.
Ide o krok iba s konfiguráciou (nie je potrebné úplné zostavenie). Z koreňa projektu:
.mte-compile-commands/je jedným z priečinkov, ktoré MTE prehľadáva, takže sa výslednýcompile_commands.jsonnájde automaticky. Funguje aj ktorýkoľvek iný prehľadávaný priečinok (build/,out/,cmake-build-*alebo koreň projektu) — len ho nechajte oddelený od priečinka nakonfigurovaného iným generátorom.- Spúšťajte to z prostredia, v ktorom sa projekt skutočne nakonfiguruje: so správnym
prekladačom v premennej
PATH(napr. z x64 Native Tools Command Prompt vo Windows) a s premennými, ktoré váš projekt potrebuje (napríkladQT6_DIRpri projekte s Qt). Akcmakenenájde váš prekladač alebo SDK, databáza skončí prázdna alebo bez ciest k hlavičkám a clangd nezaindexuje dobre. - Potom priečinok znova otvorte. Log by už nemal uvádzať „no compile_commands.json“; dajte clangdu chvíľu, nech si vybuduje index na pozadí, kým začnú odkazy a premenovanie siahať naprieč súbormi.
Iné systémy zostavenia: Bear (bear -- make), compiledb, Meson, Bazel a ďalšie dokážu
vytvoriť compile_commands.json, ktorý zásuvný modul nájde.
Ktorý server obsluhuje ktorý súbor¶
Rozhoduje názov súboru. Každá definícia servera uvádza prípony, ktoré obsluhuje, a spustí sa
prvá definícia, ktorá si nárokuje príponu daného súboru. Porovnávanie ignoruje veľkosť písmen
a počíta sa iba posledná bodka — Deploy.Prod.SH je shellový skript.
Je to zámerne nezávislé od farebného zvýrazňovania syntaxe. Vypnutie zvýrazňovania ani otvorenie súboru väčšieho než limit veľkosti pre zvýrazňovanie vás už nestojí aj jazykový server.
Id zvýrazňovača je stále záložnou možnosťou
Ak si príponu nenárokuje žiadna definícia, vráti sa OctoEdit k id jazyka, ktoré súboru priradil mechanizmus zvýrazňovania. Vďaka tomu funguje ručne napísaná definícia, ktorá pomenúva jazyk, ale neuvádza žiadne prípony.
Názov, ktorý sa serveru oznámi, je druhá, samostatná vec: LSP má vlastnú slovnú zásobu id
jazykov a niekoľko z nich sa s tými v OctoEdite nezhoduje. Súbor .sh sa ohlási ako
shellscript, .scss ako scss, .jsx ako javascriptreact a .mm ako objective-cpp.
Servery, ktoré sa správajú pri jednotlivých jazykoch inak — server pre CSS, server pre
TypeScript — potrebujú, aby to bolo správne.
| Prípona | Obsluhuje | Ohlási sa ako |
|---|---|---|
.cpp .cxx .cc .h .hpp .hh .hxx .ipp .inl |
clangd | cpp |
.c |
clangd | c |
.m / .mm |
clangd | objective-c / objective-cpp |
.sh .bash .zsh .ksh |
bash-language-server | shellscript |
.css / .scss / .less |
vscode-css-language-server | css / scss / less |
.ts .mts .cts / .tsx |
typescript-language-server | typescript / typescriptreact |
.js .mjs .cjs / .jsx |
typescript-language-server | javascript / javascriptreact |
.json / .jsonc .json5 |
vscode-json-language-server | json / jsonc |
Príponu .h si nárokuje definícia pre C/C++, a nie tá pre Objective-C — obidve spúšťajú clangd,
ktorý si sám rozhodne, čo hlavička obsahuje.
Čo každý server potrebuje od vášho projektu¶
Niekoľko serverov funguje poriadne iba vtedy, keď je v koreni projektu konkrétny súbor. Keď chýba, ukazovateľ stavu to uvedie namiesto predstierania, že je všetko v poriadku:
| Jazyk | Chce | Bez toho |
|---|---|---|
| Rust | Cargo.toml |
rust-analyzer crate vôbec nenačíta. |
| Go | go.mod |
gopls nedokáže vyhodnotiť modul. |
| TypeScript | tsconfig.json (alebo package.json) |
odpovede pre celý projekt nie sú k dispozícii. |
| JavaScript | jsconfig.json (alebo package.json) |
ako vyššie. |
| Python (pyright) | pyproject.toml / pyrightconfig.json / setup.py |
pyright naďalej funguje; iba použije predvolené hodnoty pre korene importov a prísnosť. |
| Java | pom.xml / build.gradle |
jdtls nedokáže zostaviť triednu cestu. |
| C/C++ | compile_commands.json |
pozri kapitolu vyššie. |
Pridanie jazyka¶
Servery opisujú súbory JSON, ktoré zásuvný modul načítava pri spustení z
<editor>/lsp-servers/*.json, plus z vášho vlastného priečinka.
Každá položka priraďuje jazyku jeho príkaz a pomôcky na vyhľadanie:
{
"language": "cpp",
"languageId": "cpp",
"languageIds": { ".c": "c" },
"command": "clangd",
"aliases": ["clangd-20", "clangd-19"],
"args": ["--background-index", "--log=verbose"],
"extensions": [".cpp", ".h", ".hpp", ".c"],
"projectMarkers": [],
"searchDirs": ["${LLVM}/bin", "${ProgramFiles}/LLVM/bin"],
"searchDirsMac": ["/opt/homebrew/opt/llvm/bin"],
"searchDirsLinux": ["/usr/lib/llvm-20/bin"],
"docsAnchor": "cpp-clangd",
"compileCommandsArg": "--compile-commands-dir=${dir}"
}
languageje vlastné id jazyka v OctoEdite — kľúč, podľa ktorého sa zoskupuje stránka nastavení, segment stavu aj spojenie.command/aliasessú názvy spustiteľných súborov skúšané v premennejPATH.extensionsje hlavné mapovanie súboru na jazyk (pozri vyššie). Bodku uveďte.argsobsahuje jeden prvok poľa na jeden argument.["--background-index", "--log=verbose"]odovzdá dva argumenty;["--background-index --log=verbose"]odovzdá jeden argument, ktorý náhodou obsahuje medzeru, čo každý server odmietne — a keďže sa potom okamžite skončí, výsledok vyzerá skôr ako slučka pádov než ako preklep. OctoEdit na takýto tvar pri načítaní vášho súboru upozorní v diagnostickom logu.languageId(voliteľné) je id odosielané serveru vdidOpen; predvolene sa rovnálanguage. Použite ho, keď sa názov zo špecifikácie LSP líši od nášho (bash→shellscript,objc→objective-c).languageIds(voliteľné) prekrývalanguageIdpre jednotlivé prípony, ak jeden server obsluhuje niekoľko jazykov podľa špecifikácie.projectMarkers(voliteľné) sú názvy súborov, ktoré server chce mať v koreni projektu. Keď tam nie je ani jeden z nich, segment stavu uvediežiadny <first marker>; server sa preto nikdy nezastaví.searchDirsje zoznam miest inštalácie pre Windows;searchDirsMacasearchDirsLinuxsú jeho náprotivkami pre jednotlivé platformy. Všetky tri rozvíjajú${VAR}a zoznamy pre POSIX rozvíjajú aj úvodné~. Položka, ktorej premenné nie sú nastavené, sa preskočí, namiesto aby sa z nej stala nezmyselná cesta.argsmôže používať dva zástupné výrazy:${dataDir}, teda zapisovateľný priečinok s údajmi zásuvného modulu, a${rootHash}, čo je krátke stabilné id aktuálneho projektu. Takto dostane jdtls-data <dir>. Zástupný výraz, ktorý sa nedá vyhodnotiť, ostane v argumente doslovne, namiesto aby sa rozvinul na nič.compileCommandsArg(voliteľné) sa pripája, pričom${dir}sa nahradí nájdeným priečinkom databázy — takto sa clangd nasmeruje nacompile_commands.json.priority(voliteľné, predvolene0) zoraďuje niekoľko definícií toho istého jazyka: najnižšie číslo sa skúša ako prvé a spustí sa prvá definícia, ktorej spustiteľný súbor sa nájde. Takto dostane Python pyright (priority: 0) s pylsp (priority: 10) ako záložnou možnosťou.
Vaše vlastné definície serverov¶
Dodávané definície sa nachádzajú v inštalačnom priečinku, ktorý nie je váš na upravovanie (Program Files vo Windows, podpísaný balík aplikácie na macOS). Svoje vlastné umiestnite vedľa nich: Predvoľby ▸ Jazykový server ▸ Otvoriť priečinok s používateľskými definíciami serverov vytvorí a otvorí
Každý súbor *.json v ňom sa načíta po dodávanej sade, pričom:
- súbor, ktorého
languageacommandsa zhodujú s dodávanou definíciou, ju nahradí — takto zmeníte argumenty clangdu alebo pridáte prehľadávaný priečinok; - všetko ostatné sa pridá — druhý server pre jazyk, ktorý dodávame, alebo jazyk, na ktorý OctoEdit nedodáva vôbec nič.
Súbor, ktorý nie je platným JSON alebo ktorému chýba language či command, sa preskočí
a ohlási v diagnostickom logu, namiesto aby vás potichu pripravil o jazyk.
Definície sa čítajú raz, pri spustení: po ich úprave editor reštartujte (tlačidlo Znova prehľadať / reštartovať servery spustí znova hľadanie, nie načítanie).
{
"language": "zig",
"command": "zls",
"extensions": [".zig", ".zon"],
"projectMarkers": ["build.zig"],
"searchDirs": ["${LOCALAPPDATA}/zls"],
"searchDirsMac": ["/opt/homebrew/bin", "~/.local/bin"],
"searchDirsLinux": ["~/.local/bin"]
}
Ktorý priečinok server dostane¶
Jazykový server potrebuje vedieť, kde je projekt: rust-analyzer bez toho crate nenačíta, gopls
potrebuje koreň modulu, pyright si z neho číta pyrightconfig.json a clangd tam hľadá svoju
databázu.
- Keď je otvorený priečinok (Súbor ▸ Otvoriť priečinok), súbory v ňom patria tomuto priečinku.
- Pri súbore mimo otvoreného priečinka alebo vtedy, keď nie je otvorený žiadny, postupuje
OctoEdit od súboru nahor a hľadá
compile_commands.json,compile_flags.txt,.clangd,CMakeLists.txt,Cargo.toml,go.mod,pyrightconfig.json,pyproject.toml,setup.py,tsconfig.json,package.json,pom.xml,build.gradle, súbor.sln,.gita napokon.editorconfig, ktorý deklarujeroot = true. Záložnou možnosťou je vlastný priečinok súboru, takže server nikdy neostane bez projektu. - Otvorenie priečinka až po súbore funguje. Servery, ktoré rozumejú zmenám priečinka pracovného priestoru, sa o novom priečinku dozvedia; ostatné sa reštartujú a vaše otvorené dokumenty sa im automaticky znova ohlásia. Ručný reštart nie je potrebný.
Riešenie problémov¶
| Príznak | Čo overiť |
|---|---|
Segment LSP: sa nikdy neobjaví |
Príponu tohto súboru si nenárokuje žiadna definícia servera. Pozrite si ktorý server obsluhuje ktorý súbor, prípadne pridajte definíciu. |
· server neodpovedá |
Server prestal odpovedať. Použite Zobraziť log jazykového servera a potom Reštartovať jazykové servery. |
✗ pri jazyku, pre ktorý ste server nainštalovali |
Overte, či je spustiteľný súbor naozaj tam: where clangd (Windows) / which clangd (macOS, Linux). Potom použite Hľadať ▸ Navigácia v kóde ▸ Reštartovať jazykové servery, čím sa celé hľadanie spustí znova. |
⚠ |
Server sa spustil a potom opakovane padal. Zobraziť log jazykového servera zvyčajne pomenuje dôvod; opravte ho a potom použite Reštartovať jazykové servery. |
· žiadna databáza prekladu pri projekte v C/C++ |
Pozri vyššie. Nájsť odkazy a Premenovať budú vidieť iba otvorený súbor, kým sa to nenapraví. |
| Dopĺňanie v jednom súbore C++ nevracia nič | Tento súbor pravdepodobne chýba v compile_commands.json (hlavička, ktorú nezahŕňa žiadna prekladová jednotka, alebo súbor pridaný po vygenerovaní databázy). Vygenerujte ju znova. |
| Zo spustenia v termináli všetko funguje, z Findera nie | Nahláste to — vyhľadanie premennej PATH z prihlasovacieho shellu má obidve cesty urobiť rovnakými. Zobraziť log jazykového servera a diagnostický log zaznamenávajú, čo sa prehľadávalo. |
| Server potrebuje súbor projektu, ktorý nemáte | typescript-language-server potrebuje balík typescript, gopls go.mod, rust-analyzer Cargo.toml a pyright pyrightconfig.json/pyproject.toml na odpovede pre celý projekt. |
Nastavenia jazykového servera¶
Predvoľby ▸ Jazykový server vypisujú každý jazyk, pre ktorý existuje definícia servera. Pri každom jazyku môžete:
- zapnúť či vypnúť server (vypnutý jazyk žiadny nespustí);
- nastaviť výslovnú cestu k spustiteľnému súboru (tlačidlom Prehľadávať…). Toto
prekrytie vyhráva nad vyššie opísaným hľadaním v
PATHasearchDirs— hodí sa, keď server nie je vPATHalebo keď chcete konkrétnu zostavu; - pridať ďalšie argumenty, ktoré sa pripoja za vlastné argumenty definície — napríklad
--log=verbosepre clangd. Riadok sa delí tak ako príkazový riadok, takže hodnotu s medzerami dajte do úvodzoviek.
Pole cesty je cesta, nie príkazový riadok
Napísaním C:\tools\clangd.exe --log=verbose do poľa Cesta k spustiteľnému súboru
žiadate OctoEdit, aby našiel súbor, ktorého názov sa končí na .exe --log=verbose, čo
neexistuje — jazyk potom nehlási žiadny server. Do poľa s cestou dajte spustiteľný súbor
a jeho argumenty do poľa Ďalšie argumenty. Ak sa to aj tak stane, diagnostický log to
povie doslova.
Zmeny sa prejavia po stlačení OK/Použiť: ak sa skutočne zmenil niektorý prepínač zapnutia alebo cesta, servery sa automaticky reštartujú s novými nastaveniami (nedotknutá stránka bežiace servery nikdy nevyruší). Tlačidlo Znova prehľadať / reštartovať servery navyše vynúti zrušenie a opätovné vyhľadanie s aktuálnymi nastaveniami — hodí sa po nainštalovaní servera, ktorý editor predtým nedokázal nájsť, a zároveň vynuluje rozpočet reštartov po páde.
Otvoriť priečinok s používateľskými definíciami serverov vytvorí a otvorí priečinok opísaný v kapitole Vaše vlastné definície serverov.
Obmedzenia¶
- Farebné zvýrazňovanie kódu vnútri vyskakovacích okien s informáciami pri najazdení sa neuplatňuje (text je formátovaný — tučné písmo, nadpisy, neproporcionálny kód — ale bez zvýraznenej syntaxe).
- Presnosť závisí od servera: pri C/C++ sa clangd bez
compile_commands.jsonvracia k heuristike a výsledky môžu byť neúplné. - OctoEdit server nikdy neinštaluje ani nesťahuje. Nájde ten, ktorý ste si nainštalovali, a spustí ho; keď žiadny nie je, funkcia ostane temná a segment stavu to uvedie.
- Jeden serverový proces na jazyk, zdieľaný každým otvoreným projektom v tomto jazyku. Druhý projekt sa pridá ako priečinok pracovného priestoru, keď to server podporuje; inak sa obsluhuje pod koreňom prvého projektu.
- Kotlin, Swift a Objective-C majú inteligenciu kódu, ale nie farebné zvýrazňovanie syntaxe — editor pre ne zatiaľ nemá zvýrazňovač. Obidve veci sú už nezávislé, takže server funguje bez ohľadu na to.
- Definície serverov sa čítajú raz pri spustení; po ich úprave (vašich aj dodávaných) je potrebný reštart editora.