Preskočiť na obsah

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:

LSP: cpp ✓ · no compile database  python ↻2  rust ✗
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á:

  1. Ako prvý sa skúša pyright (pyright-langserver). Je to balík npm, takže potrebuje Node.js: npm i -g pyright.
  2. 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:

<user data>/plugins/org.mte.lsp/jdtls-workspaces/<project id>/

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:

where clangd
where cmake
where ninja
where pyright-langserver
where pylsp

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:

  1. 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;
  2. vašu premennú PATH, a to pre príkaz servera aj pre každý známy alias (clangd-20, clangd-19, …);
  3. miesta inštalácie uvedené v definícii servera pre váš operačný systém;
  4. 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.json v 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.txt v koreni projektu;
  • konfiguračný súbor .clangd v 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:

cmake -S . -B .mte-compile-commands -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
  • .mte-compile-commands/ je jedným z priečinkov, ktoré MTE prehľadáva, takže sa výsledný compile_commands.json ná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íklad QT6_DIR pri projekte s Qt). Ak cmake nená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}"
}
  • language je vlastné id jazyka v OctoEdite — kľúč, podľa ktorého sa zoskupuje stránka nastavení, segment stavu aj spojenie. command/aliases sú názvy spustiteľných súborov skúšané v premennej PATH.
  • extensions je hlavné mapovanie súboru na jazyk (pozri vyššie). Bodku uveďte.
  • args obsahuje 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 v didOpen; 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ýva languageId pre 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í.
  • searchDirs je zoznam miest inštalácie pre Windows; searchDirsMac a searchDirsLinux sú 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.
  • args môž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 na compile_commands.json.
  • priority (voliteľné, predvolene 0) 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í

<user data>/plugins/org.mte.lsp/lsp-servers/

Každý súbor *.json v ňom sa načíta po dodávanej sade, pričom:

  • súbor, ktorého language a command sa 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).

Minimálna používateľská definícia: <user data>/…/lsp-servers/zig.json
{
    "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, .git a napokon .editorconfig, ktorý deklaruje root = 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 PATH a searchDirs — hodí sa, keď server nie je v PATH alebo keď chcete konkrétnu zostavu;
  • pridať ďalšie argumenty, ktoré sa pripoja za vlastné argumenty definície — napríklad --log=verbose pre 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.json vracia 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.