LSP (sprogserver)-udvidelsesmodulet¶
Kodeintelligens drevet af Language Server Protocol — fejlbølgelinjer, navigation, oplysninger ved pegning, fuldførelse, signaturhjælp, formatering, find referencer, omdøbning og gå til symbol — for ethvert sprog, der har en sprogserver. Editoren taler med serveren over LSP; udvidelsesmodulet er klienten. Hvilke servere der findes, er datastyret (én lille JSON pr. sprog), så C++ og clangd nedenfor er bare én af flere medleverede definitioner.
Editoren leverer eller henter ingen servere
En sprogserver er et selvstændigt program, du installerer én gang. MTE finder en installeret server og peger den mod dit projekt; den leverer aldrig selv en. Se At skaffe en sprogserver.
Nuværende funktioner¶
| Funktion | Hvordan |
|---|---|
| Diagnostik | Fejl og advarsler fra serveren kommer frem som bølgede understregninger (rød = fejl, ravgul = advarsel, blå = info, grå = tip) og opdateres, mens du skriver. |
| Gå til definition | Sæt markøren på et symbol og tryk F12, eller brug Søg ▸ Kodenavigation ▸ Gå til definition. Springer til definitionen og åbner om nødvendigt en anden fil. |
| Find referencer | Markøren på et symbol → Shift+F12 (eller Søg ▸ Kodenavigation ▸ Find referencer). Resultaterne åbnes i et referencepanel nederst, grupperet efter fil med en forhåndsvisning af kildelinjen; dobbeltklik for at springe dertil. |
| Oplysninger ved pegning | Hold pegeren over et symbol; en boble viser dets type eller signatur og dokumentationen (gengivet fra serverens Markdown). |
| Fuldførelse | Ctrl+Mellemrum beder serveren om fuldførelser og folder dem ind i editorens fuldførelsesliste (foran de indbyggede forslag fra nøgleord og ord i bufferen), filtreret mens du skriver. |
| Signaturhjælp | Skriver du et kalds ( eller et ,, vises et kaldetip med funktionens signatur og den aktive parameter fremhævet; ) lukker det. |
| Formatér dokument | Alt+Shift+F (⌃⌥F på macOS; eller Rediger ▸ Formatér dokument) formaterer hele dokumentet igennem serveren, i ét fortrydelsestrin. Serverens egen opsætning bestemmer stilen (for clangd en .clang-format-fil). |
| Find referencer (nævnt ovenfor) | — |
| Omdøb symbol | Markøren på et symbol → Shift+F6 (eller Rediger ▸ Omdøb symbol). Angiv et nyt navn; hver brug opdateres. Strækker omdøbningen sig over flere filer, bliver du bedt om at bekræfte først — hver fil åbnes, ændres og efterlades ændret, så du kan gennemgå og gemme den. |
| Gå til symbol (i filen) | Ctrl+Shift+O åbner kommandopaletten med hvert symbol i den aktuelle fil (funktioner, klasser, metoder …); skriv for at filtrere, Enter springer dertil. Hver række viser symbolets type og det, det hører til. |
| Gå til symbol i arbejdsområdet | Ctrl+T søger efter symboler i hele projektet, mens du skriver (serveren matcher forespørgslen); Enter åbner filen ved symbolet. |
Vælgerne til gå til symbol er kommandopalettens symboltilstande — se Kommandopalet.
Kommandoerne er nedtonede, indtil en server kører
Gå til definition, Find referencer, Formatér dokument og Omdøb symbol er kun slået til, når en sprogserver for den aktuelle fils sprog er klar — og når den server meldte i sin håndtryksudveksling, at den understøtter forespørgslen. I en fil uden en opsat server, eller mens en er ved at starte eller genstarte eller har givet op, er menupunkterne nedtonede i stedet for ikke at gøre noget, når man trykker på dem. Statusvisningen nedenfor fortæller, hvad der er tilfældet. Genstart sprogservere er aldrig nedtonet: det er vejen ud af en server, der har givet op.
Referencer og omdøbning på tværs af filer kræver serverens indeks
Find referencer og Omdøb når kun ud i andre filer, når serveren har indekseret
projektet. For C/C++ betyder det en compile_commands.json (se nedenfor) og
clangds baggrundsindeks; uden det virker de kun i den aktuelle fil.
Omdøbning fortrydes fil for fil indtil videre
En omdøbning over flere filer anvendes én fil ad gangen, så hver fil er sit eget fortrydelsestrin (bekræftelsesvinduet siger det). Gennemgå de ændrede faneblade, inden du gemmer.
I editorens kontekstmenu¶
Højreklik på et symbol i teksten, så tilbyder menuen under redigeringskommandoerne Gå til definition, Find referencer, Omdøb symbol og Formatér dokument. Hver af dem vises kun, når den samme kommando i hovedmenuen ville virke lige nu — en sprogserver til filen er klar og understøtter den, og ved omdøbning og formatering er dokumentet ikke skrivebeskyttet. I en ren tekstfil, i margenen til venstre for teksten eller mens serveren starter, vises ingen af dem.
Punkterne virker på det symbol, du højreklikkede på, ikke på det under markøren; markøren og markeringen bliver, hvor de var. Omdøb foreslår markeringen som det gamle navn, når du højreklikkede inde i den, og ellers ordet under musemarkøren. Formatér dokument formaterer altid hele dokumentet. En menu, der åbnes fra tastaturet, virker ved markøren.
Hvor platformen viser genvejstaster i kontekstmenuer (Windows), viser hvert punkt sin genvejstast — den, der gælder, inklusive dine egne ændringer i Tildel genvejstaster. På macOS viser kontekstmenuer ingen genvejstaster.
Hvordan dine ændringer når serveren¶
Det at skrive sender ikke en besked pr. tastetryk. Ændringer samles i en brøkdel af et sekund og sendes så som én ændring — og som ét ændret område i stedet for hele filen, når serveren siger, den kan tage imod et (det kan de fleste). En stor fil koster derfor et par dusin byte pr. skriveudbrud i stedet for en kopi af sig selv.
Alt, der spørger serveren om teksten — oplysninger ved pegning, gå til definition, find referencer, omdøb, formatér, fuldførelse, signaturhjælp — sender den ventende ændring først, så et svar aldrig henviser til en version, du allerede er kommet forbi. Det samme sker, når du gemmer en fil.
Det at starte en server spærrer heller ikke editoren: processen startes i baggrunden,
og statusafsnittet viser …, indtil den har fuldført sin håndtryksudveksling. Et
serverprogram, der hænger ved opstart, koster dig ikke andet end det sprog.
Et loft over, hvor mange problemer der tegnes
Der tegnes højst 2000 bølgelinjer pr. dokument. Derudover er filen alligevel ulæselig, og hver ekstra markør koster editoren rigtig tid — så når en fil frembringer flere, vises de første 2000, og statuslinjen siger Viser de første 2000 af N problemer i denne fil i stedet for, at antallet i stilhed ser mindre ud, end det er. Det er som regel et tegn på, at serveren ser forkert på filen: en manglende kompileringsdatabase eller en genereret fil, der ikke er ment til at kunne kompilere alene.
Serverens statusvisning¶
Statuslinjen viser et kompakt LSP:-afsnit (til venstre for de øvrige
modulafsnit), der sammenfatter hver sprogserver, der har betydning for dine åbne
filer:
| Tegn | Betydning |
|---|---|
… |
Starter — serveren er startet og udveksler håndtryk. |
✓ |
Klar — betjener forespørgsler. |
↻n |
Genstarter — serveren stoppede uventet; automatisk genstartsforsøg n er sat i kø. |
✗ |
Ingen server installeret for dette sprog. Installér en (se nedenfor), og brug så Genstart sprogservere. |
⚠ |
Gav op — serveren blev ved med at gå ned, og de automatiske genstarter er standset. Kun en manuel genstart vækker den til live. |
Et sprog kan bære en kort tilføjelse efter tegnet — serveren kører, og noget ved dit projekt begrænser stadig, hvad den kan svare på. Der vises kun én ad gangen, den alvorligste først:
| Tilføjelse | Betydning |
|---|---|
· server not responding |
Flere forespørgsler i træk forblev ubesvarede. Serveren er i live, men sidder fast; brug Vis sprogserverlog og derefter Genstart sprogservere. Tilføjelsen forsvinder i det øjeblik, serveren svarer på noget som helst. |
· no compile database |
C/C++-serveren kører, men kan kun se den fil, du har åben — se C/C++-projekter kræver compile_commands.json. |
· no Cargo.toml, · no go.mod, · no tsconfig.json … |
Projektet har ingen af de filer, denne server skal bruge for at forstå det som et projekt. Den virker stadig i den åbne fil; svar på tværs af filer vil være ufuldstændige, indtil filen findes. Det nøjagtige navn er det, serveren helst vil have — se Hvad hver server skal bruge fra dit projekt. |
Afsnittet kommer frem, når det første dokument med et opsat sprog åbnes, følger kun de sprog, du faktisk har dokumenter åbne for — lukker du et sprogs sidste fil, fjernes dets post (åbner du en igen, kommer den øjeblikkeligt tilbage) — og skjules helt, når der ikke er flere sådanne dokumenter.
Søg ▸ Kodenavigation ▸ Vis sprogserverlog viser det seneste output fra hver kørende server. Det er der, en server forklarer sig selv: en manglende værktøjskæde, en ulæselig opsætningsfil, et projekt, den nægtede at indlæse. Vinduet er et almindeligt vindue, du kan ændre størrelse på — hvert sprog er en overskrift, der navngiver den server, der kører for det, teksten kan markeres, Kopiér lægger hele loggen på udklipsholderen, og den størrelse, du giver vinduet, huskes.
Hvis en server går ned¶
En sprogserver, der afslutter uventet, genstartes af sig selv med voksende
forsinkelse (1 s, 2 s, 4 s … med loft ved 30 s). Mens det sker, viser visningen
↻n, og en meddelelse i statuslinjen melder det første nedbrud. Efter en vellykket
genstart meldes dine åbne dokumenter til serveren igen, og diagnostikken kommer
tilbage af sig selv; forældede bølgelinjer fra den døde server ryddes med det samme.
Redigering spærres aldrig.
Efter 5 mislykkede forsøg i træk giver udvidelsesmodulet op: visningen viser
✗, en meddelelse peger dig mod indstillingerne, og sproget bliver ved med at være
mørkt, indtil du genstarter det manuelt. En server, der kørte fint i mindst et
minut, får et nyt sæt forsøg, når den senere går ned.
Manuel genstart — en af disse:
- Søg ▸ Kodenavigation ▸ Genstart sprogservere (ingen genvejstast som standard; findes også i kommandopaletten), eller
- knappen Scan igen / genstart servere under Indstillinger ▸ Sprogserver.
Vil du se, hvorfor en server er utilfreds, inden du genstarter den, så brug Søg ▸ Kodenavigation ▸ Vis sprogserverlog.
Begge lukker hver server ned, kører opdagelsen igen med de nuværende indstillinger og nulstiller fejlbudgettet — brug dem, når du har installeret en manglende server eller rettet en, der var i stykker.
At skaffe en sprogserver¶
Installér serveren til dit sprog, og sørg for, at den ligger i din PATH (eller
angiv en udtrykkelig sti i indstillingerne). Findes der
ingen, gør funktionen ganske enkelt ingenting for det sprog —
statusvisningen viser ✗, og loggen noterer et tip
én gang, men intet afbryder dig.
MTE leverer serverdefinitioner (ikke serverne) til mange sprog, så de fleste kræver bare, at serveren er installeret — ingen JSON-redigering. De medleverede definitioner dækker C/C++, Objective-C, Python, Rust, Go, TypeScript, JavaScript, C#, Java, Kotlin, Swift, HTML, CSS/SCSS/Less, JSON, YAML og skalscripts.
| Sprog | Server | Hvor du får den |
|---|---|---|
| C/C++ | clangd | winget install LLVM.LLVM (Windows), komponenten »C++ Clang tools« i Visual Studios installationsprogram, brew install llvm (macOS), eller din distributions clang-tools-extra-pakke. |
| Python | pyright eller pylsp | npm i -g pyright (kræver Node.js), eller pip install python-lsp-server (kræver kun 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 eller OmniSharp | dotnet tool install -g csharp-ls (ét enkelt dotnet-værktøj, der prøves først), eller hent en OmniSharp-udgave. |
| Java | jdtls (Eclipse JDT Language Server) | brew install jdtls (macOS), eller pak en udgave ud, og læg dens bin i din PATH. |
Kontrollér det i en terminal, f.eks. med clangd --version eller where clangd /
which clangd. Til et sprog, MTE ikke leverer en definition til, kan du tilføje en
som beskrevet under At tilføje et sprog.
Python: pyright eller pylsp¶
Python har to medleverede definitioner, og OctoEdit kører den, der faktisk er installeret:
- pyright (
pyright-langserver) prøves først. Den er en npm-pakke, så den kræver Node.js:npm i -g pyright. - pylsp (
python-lsp-server) bruges, når pyright ikke findes. Den er en pip-pakke og kræver kun Python:pip install python-lsp-server.
Er begge installeret, vinder pyright. Der er én indstillingsrække til Python (ét
flueben og én stitilsidesættelse), og den gælder, uanset hvilken server der bruges —
angiver du en udtrykkelig sti til et pylsp-program, køres pylsp med dens
startargumenter og ikke pyrights. Vis sprogserverlog navngiver den server, der
faktisk kører.
Flere servere til ét sprog
Det er en almen mekanisme og ikke et særtilfælde for Python: et sprog kan have et
vilkårligt antal medleverede definitioner, ordnet efter et priority-felt, og
den første, hvis program findes på din maskine, er den, der starter. C# virker på
samme måde — csharp-ls først, OmniSharp dernæst — for de to tager
forskellige startargumenter, og kun én af dem kan være rigtig.
Java: serverens eget arbejdsområde¶
jdtls nægter at starte uden en skrivbar arbejdsområdemappe af sin egen (-data).
OctoEdit stiller en til rådighed af sig selv, pr. projekt, under sin
udvidelsesmoduldatamappe:
Du skal aldrig oprette eller navngive den. Det er trygt at slette mappen — jdtls bygger den op igen, blot på bekostning af én genindeksering.
At sætte det op på Windows¶
En frisk Windows-maskine har som regel ingen af clangd, cmake, ninja,
node eller python i sin PATH. Dette afsnit siger, hvor hver af dem kommer fra,
og hvordan du kontrollerer det. Du behøver normalt ikke selv at redigere PATH —
OctoEdit søger også i de økosystemmapper, der er
opregnet nedenfor.
| Du vil have | Installér | Hvor den lander |
|---|---|---|
| clangd (C/C++) | winget install LLVM.LLVM |
C:\Program Files\LLVM\bin\clangd.exe |
| cmake og ninja | Komponenten »C++ CMake tools for Windows« i Visual Studios installationsprogram | …\Microsoft Visual Studio\2022\<edition>\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin og …\CMake\Ninja — ikke i din PATH, men tilgængelige gennem Visual Studios udviklermiljø (se nedenfor). En selvstændig winget install Kitware.CMake / winget install Ninja-build.Ninja lægger dem i PATH i stedet. |
| pyright (Python) | winget install OpenJS.NodeJS.LTS og derefter npm i -g pyright |
%APPDATA%\npm\pyright-langserver.cmd |
| pylsp (Python, uden Node) | Python fra Microsoft Store eller python.org og derefter pip install python-lsp-server |
%LOCALAPPDATA%\Packages\PythonSoftwareFoundation.Python.3.*_*\LocalCache\local-packages\Python3*\Scripts\pylsp.exe (Store) eller %APPDATA%\Python\Python3*\Scripts\pylsp.exe |
At kontrollere, hvad der er synligt. I en almindelig kommandoprompt eller PowerShell:
where søger kun i din PATH. Et værktøj, den ikke kan finde, kan stadig blive
fundet af OctoEdit, for søgningen dækker også økosystemmapperne ovenfor — særligt
Pythons scriptmapper ligger aldrig i PATH. Bliver et sprog ved med at være ✗,
efter at du har installeret dets server, så brug Søg ▸ Kodenavigation ▸ Genstart
sprogservere, som kører hele søgningen igen.
Genereringen af kompileringsdatabasen kører inde i Visual Studios udviklermiljø.
Når OctoEdit kører CMake for dig (nedenfor), finder den først Visual Studio — gennem
VSINSTALLDIR og ellers vswhere.exe — og pakker kaldet ind i den installations
VsDevCmd.bat -arch=x64. Det er dét, der lægger cl, Windows SDK'et og Visual
Studios egen cmake og ninja på stien for netop den ene kommando, så editoren
slet ikke har brug for dem i din PATH. Uden Visual Studio (en maskine med kun
clang eller MinGW) foretages kaldet ganske almindeligt i editorens eget miljø, og
loggen siger det; så skal du selv sørge for, at cmake og ninja kan nås, og at
der er en compiler, CMake kan genkende.
At generere igen efter behov. Søg ▸ Kodenavigation ▸ Generér
kompileringsdatabase… kører den samme generering når som helst — også når der
allerede findes en database (den konfigureres på stedet), og når du tidligere har
svaret Spørg ikke for dette projekt. Posten er altid tilgængelig — kan den ikke
generere, siger den hvorfor i statuslinjen (intet C/C++-dokument, ingen projektmappe,
ingen CMakeLists.txt i projektets rod, ingen cmake eller ingen generator her, der
kan eksportere en) i stedet for at være nedtonet af en grund, du ikke kan se.
Hvor »spørg ikke«-svaret gemmes. Spørg ikke for dette projekt gemmes pr.
projektrod i %APPDATA%\7-bits\OctoEdit.ini under
plugins/org.mte.lsp/noCompileDbPrompt/<hash> (projektstien hashes, fordi en sti
ikke er en lovlig indstillingsnøgle). Kører du Generér kompileringsdatabase…,
ryddes det for det projekt.
Hvor OctoEdit leder efter en server¶
Du bør ikke skulle sætte noget op. Når serveren er installeret, er det nok at åbne en mappe og en kildefil. Editoren prøver i denne rækkefølge:
- en udtrykkelig sti, du har sat i indstillingerne — den er afgørende: kan den ikke findes, bliver sproget mørkt i stedet for i stilhed at falde tilbage på noget andet;
- din
PATH, efter serverens kommando og hvert kendt alias (clangd-20,clangd-19…); - de installationssteder, der står i serverens definition, for dit styresystem;
- en indbygget liste over økosystemmapper.
| Økosystemmapper, der søges i | |
|---|---|
| Windows | npm's globale præfiks og %APPDATA%\npm, %LOCALAPPDATA%\Microsoft\WinGet\Links, %USERPROFILE%\.cargo\bin, %USERPROFILE%\go\bin og %LOCALAPPDATA%\go\bin, %USERPROFILE%\.dotnet\tools, %ProgramFiles%\LLVM\bin, %ProgramFiles%\nodejs samt Pythons scriptmapper pr. bruger: %APPDATA%\Python\Python3*\Scripts, %LOCALAPPDATA%\Packages\PythonSoftwareFoundation.Python.3.*_*\LocalCache\local-packages\Python3*\Scripts (Python fra Microsoft Store) og %LOCALAPPDATA%\Programs\Python\Python3*\Scripts |
| macOS | /opt/homebrew/bin og /opt/homebrew/opt/llvm/bin (Homebrews clangd ligger i den anden — den lænkes aldrig ind i den første), /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 og de samme ~/.cargo/bin, ~/go/bin, ~/.local/bin, ~/.npm-global/bin, ~/.dotnet/tools |
Posterne med * er rigtige jokertegn: den versionsmappe, Python opretter
(Python313, 3.13 eller Stores …Python.3.13_qbz5n2kfra8p0), matches mod det, der
faktisk er på disken, nyeste først. Det er der, pip install python-lsp-server
lægger pylsp, og det er derfor, det ikke kræver en ændring af PATH at installere
den.
macOS: at starte fra Finder kontra fra en terminal
Et program, der startes fra Finder eller Dock, arver ikke PATH fra din
skalprofil — macOS giver det en minimal (/usr/bin:/bin:/usr/sbin:/sbin).
Homebrew, Cargo, Go og npm ville alle være usynlige. OctoEdit spørger derfor din
logind-skal, hvad dens PATH er, og søger også i den og giver det
resulterende miljø videre til den server, den starter — så en server, der er
installeret med et af de værktøjer, findes, uanset hvordan du starter editoren.
Serveren startes én gang pr. sprog og lukkes ned sammen med editoren.
C/C++-projekter kræver compile_commands.json¶
clangd forstår kun din kode nøjagtigt, når den kender kompileringsflagene, fra en
kompileringsdatabase (compile_commands.json). Uden en falder clangd tilbage på
at gætte, og funktioner på tværs af filer (find referencer, omdøb) bliver ved med
at være begrænset til den åbne fil. clangd startes stadig i begge tilfælde.
Et C/C++-projekt tæller som opsat, når det har en af disse:
- en
compile_commands.jsoni projektets rod eller i en af de byggemapper, OctoEdit gennemsøger (build/,Build/,out/,out/build/,cmake-build-debug/,cmake-build-release/,.mte-compile-commands/); - en
compile_flags.txti projektets rod; - en
.clangd-opsætningsfil i projektets rod.
clangd læser selv de to sidste, så der meldes ingenting om dem.
Når ingen af dem findes — for hvert C/C++-projekt, uanset hvilket byggesystem
det bruger — viser statusafsnittet · no compile database, og en besked i
statuslinjen siger det én gang. Intet spærres; intet vindue afbryder din skrivning.
At lade OctoEdit generere den (CMake-projekter)¶
Har projektets rod en CMakeLists.txt og en CMake, der faktisk ville frembringe
en database, bliver du tilbudt dette én gang pr. projekt:
- Generér — kører CMake i baggrunden, kun konfigurering: intet kompileres, og
dine egne byggemapper røres ikke. Resultatet lander i
<project>/.mte-compile-commands/. Lykkes det, genstartes clangd mod den nye database; mislykkes det, vises de sidste linjer af CMake-loggen sammen med den nøjagtige kommando, der blev forsøgt, så du selv kan gentage den. - Sådan gør du det manuelt — viser den samme kommando uden at køre den.
- Spørg ikke for dette projekt — huskes pr. projektrod.
Både vinduet »sådan gør du det manuelt« og fejlvinduet viser den nøjagtige kommandolinje i et kodefelt, du kan markere i, over en enkelt Kopiér-knap, hvis værktøjstip siger, hvad den tager: kommandoen alene eller kommandoen sammen med halen af CMake-loggen, når der er en. Fejlvinduets størrelse kan ændres, og det husker den størrelse, du giver det — hvert af disse vinduer husker sin egen størrelse, så det at forstørre serverloggen får ikke et vejledningsvindue på to linjer til at åbne lige så stort.
Du er ikke bundet til det ene tilbud: Søg ▸ Kodenavigation ▸ Generér kompileringsdatabase… starter den samme generering, når du vil — efter at du har tilføjet filer, ændret byggevalg eller svaret Spørg ikke for dette projekt (som den rydder). En eksisterende database konfigureres på stedet. Posten er altid tilgængelig; kan den ikke generere, siger den hvorfor i statuslinjen.
Dine forudindstillinger kommer først. Har projektet en CMakePresets.json (eller
en CMakeUserPresets.json), konfigurerer OctoEdit med en af dine forudindstillinger
i stedet for at opfinde en kommandolinje — cmake --preset <name> -B
<project>/.mte-compile-commands -DCMAKE_EXPORT_COMPILE_COMMANDS=ON. På den måde er
generatoren, værktøjssættet og forudindstillingens environment-blok (en QT6_DIR,
en SDK-sti) dem, projektet allerede bygger på, og CMake anvender dem selv.
Forudindstillinger, der er skjulte, som en condition udelukker på dit styresystem,
eller som konfigurerer med en generator, der ikke kan eksportere, springes over; et
navn, der indeholder debug, foretrækkes. Din egen byggemappe røres aldrig —
editoren omdirigerer altid resultatet med -B.
På Windows køres CMake inde i et Visual Studio-udviklermiljø. En editor, der er
startet fra Stifinder eller startmenuen, har ingen cl i sin PATH, og CMake ville
så i stilhed nøjes med den anden compiler, den finder — herunder den clang.exe, der
følger med inde i en Visual Studio-installation, og som straks fejler på
MSVC-specifikke indstillinger. OctoEdit finder derfor Visual Studio med vswhere og
pakker kaldet ind i VsDevCmd.bat -arch=x64. Er der ingen Visual Studio installeret
(en maskine med kun MinGW eller clang), foretages kaldet ganske almindeligt, og
loggen siger det.
Et tidligere mislykket forsøg ryddes op inden et nyt: dets CMakeCache.txt ville
ellers fastlåse den compiler, der fejlede. En mappe, der allerede indeholder en
fungerende compile_commands.json, konfigureres på stedet og slettes aldrig.
Hvorfor tilbuddet nogle gange ikke kommer frem
CMAKE_EXPORT_COMPILE_COMMANDS respekteres kun af generatorerne Ninja og
Makefile; Visual Studio-generatoren ser bort fra den og skriver ingen
database. På Windows kommer tilbuddet derfor kun frem for et projekt uden en
brugbar forudindstilling, når ninja ligger i din PATH. Er et projekts
eneste anvendelige forudindstillinger Visual Studio-forudindstillinger, og er der
heller ingen Ninja, siger OctoEdit, hvilken forudindstilling der stod i vejen, i
stedet for at tilbyde at køre noget, der ikke kunne virke.
At generere den selv (CMake)¶
CMAKE_EXPORT_COMPILE_COMMANDS respekteres kun af generatorerne Ninja og
Makefile — Visual Studio-generatoren ser bort fra den (den frembringer ingen
compile_commands.json, heller ikke med flaget sat). Generér derfor databasen med
Ninja, ind i en særskilt mappe, adskilt fra den, du normalt bygger i: CMake
nægter at konfigurere en eksisterende byggemappe igen med en anden generator, så et
projekt, du plejer at bygge med Visual Studio, skal have sin egen Ninja-mappe.
Det er et skridt med kun konfigurering (der kræves ingen fuld bygning). Fra projektets rod:
.mte-compile-commands/er en af de mapper, MTE gennemsøger, så den resulterendecompile_commands.jsonfindes af sig selv. Enhver gennemsøgt mappe virker også (build/,out/,cmake-build-*eller projektets rod) — hold den bare adskilt fra en mappe, der er konfigureret med en anden generator.- Kør den fra et miljø, hvor projektet faktisk lader sig konfigurere: den rigtige
compiler i
PATH(f.eks. en x64 Native Tools Command Prompt på Windows) og de variabler, dit projekt har brug for (såsomQT6_DIRi et Qt-projekt). Kancmakeikke finde din compiler eller dit SDK, ender databasen tom eller uden inkluderingsstier, og clangd indekserer ikke godt. - Åbn mappen igen bagefter. Loggen bør ikke længere sige »no compile_commands.json«; giv clangd et øjeblik til at bygge sit baggrundsindeks, inden referencer og omdøbning strækker sig over filer.
Andre byggesystemer: Bear (bear -- make), compiledb, Meson, Bazel og andre kan
alle frembringe en compile_commands.json, som udvidelsesmodulet vil finde.
Hvilken server der betjener hvilken fil¶
Filnavnet afgør det. Hver serverdefinition opregner de filendelser, den betjener,
og den første definition, der tager en fils filendelse, er den, der starter. Matchet
ser bort fra store og små bogstaver, og kun det sidste punktum tæller —
Deploy.Prod.SH er et skalscript.
Det er med vilje uafhængigt af syntaksfarvningen. At slå farvningen fra, eller at åbne en fil, der er større end farvningens størrelsesgrænse, koster dig ikke længere sprogserveren oveni.
Farvelæggerens id er stadig en reserve
Er der ingen definition, der tager filendelsen, falder OctoEdit tilbage på det sprog-id, farvelægningsmotoren tildelte. Det holder en håndskrevet definition i gang, når den navngiver et sprog, men ikke opregner nogen filendelser.
Det navn, serveren får at vide, er en anden og særskilt ting: LSP har sit eget
ordforråd af sprog-id'er, og flere af dem passer ikke til OctoEdits. En .sh-fil
meldes som shellscript, en .scss som scss, en .jsx som javascriptreact, en
.mm som objective-cpp. Servere, der opfører sig forskelligt fra sprog til sprog
— CSS-serveren, TypeScript-serveren — har brug for, at det er rigtigt.
| Filendelse | Betjenes af | Meldes som |
|---|---|---|
.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 |
.h tages af C/C++-definitionen og ikke af Objective-C-definitionen — begge kører
clangd, som selv afgør, hvad en headerfil indeholder.
Hvad hver server skal bruge fra dit projekt¶
Flere servere virker kun ordentligt, når en bestemt fil ligger i projektets rod. Mangler den, siger statusvisningen det i stedet for at lade som om alt er i orden:
| Sprog | Vil have | Uden den |
|---|---|---|
| Rust | Cargo.toml |
rust-analyzer indlæser slet ikke pakken. |
| Go | go.mod |
gopls kan ikke bestemme modulet. |
| TypeScript | tsconfig.json (eller package.json) |
svar på tværs af projektet er ikke til rådighed. |
| JavaScript | jsconfig.json (eller package.json) |
som ovenfor. |
| Python (pyright) | pyproject.toml / pyrightconfig.json / setup.py |
pyright virker stadig; den bruger bare standardværdier for importrødder og striks kontrol. |
| Java | pom.xml / build.gradle |
jdtls kan ikke bygge en klassesti. |
| C/C++ | compile_commands.json |
se afsnittet ovenfor. |
At tilføje et sprog¶
Servere beskrives af JSON-filer, som udvidelsesmodulet indlæser ved opstart fra
<editor>/lsp-servers/*.json plus din egen mappe.
Hver post knytter et sprog til sin kommando plus fingerpeg til opdagelsen:
{
"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}"
}
languageer OctoEdits eget id for sproget — den nøgle, som indstillingssiden, statusafsnittet og forbindelsen grupperes efter.command/aliaseser de programnavne, der prøves iPATH.extensionser den primære sammenkobling af fil og sprog (se ovenfor). Tag punktummet med.argser ét tabelelement pr. argument.["--background-index", "--log=verbose"]sender to argumenter;["--background-index --log=verbose"]sender ét argument, der tilfældigvis indeholder et mellemrum, og det afviser enhver server — og fordi den så afslutter med det samme, ligner resultatet en nedbrudsløkke og ikke en tastefejl. OctoEdit advarer om den form i diagnostikloggen, når den indlæser din fil.languageId(valgfrit) er det id, der sendes til serveren ididOpen; det er som standardlanguage. Brug det, når LSP-specifikationens navn er et andet end vores (bash→shellscript,objc→objective-c).languageIds(valgfrit) tilsidesætterlanguageIdpr. filendelse, for én server, der betjener flere sprog i specifikationen.projectMarkers(valgfrit) er de filnavne, serveren vil have i projektets rod. Er ingen af dem der, siger statusafsnittetingen <first marker>; det standser aldrig serveren.searchDirser listen over installationssteder på Windows;searchDirsMacogsearchDirsLinuxer dens modstykker pr. platform. Alle tre udfolder${VAR}, og POSIX-listerne udfolder også et indledende~. En post, hvis variabler ikke er sat, springes over i stedet for at blive til en meningsløs sti.argsmå bruge to pladsholdere:${dataDir}, udvidelsesmodulets skrivbare datamappe, og${rootHash}, et kort, stabilt id for det aktuelle projekt. Sådan får jdtls sit-data <dir>. En pladsholder, der ikke kan findes, bliver stående bogstaveligt i argumentet i stedet for at blive udfoldet til ingenting.compileCommandsArg(valgfrit) føjes til, med${dir}erstattet af den fundne databasemappe — sådan peges clangd modcompile_commands.json.priority(valgfrit,0som standard) ordner flere definitioner af samme sprog: det laveste tal prøves først, og den første definition, hvis program findes, er den, der starter. Sådan får Python pyright (priority: 0) med pylsp (priority: 10) som reserve.
Dine egne serverdefinitioner¶
De medleverede definitioner ligger inde i installationsmappen, som ikke er din at redigere i (Program Files på Windows, et signeret programbundt på macOS). Læg dine egne ved siden af dem i stedet: Indstillinger ▸ Sprogserver ▸ Åbn mappen med brugerdefinerede serverdefinitioner opretter og åbner
Hver *.json i den indlæses efter det medleverede sæt, og:
- en fil, hvis
languageogcommandpasser til en medleveret definition, erstatter den — sådan ændrer du clangds argumenter eller tilføjer en søgemappe; - alt andet tilføjes — en server nummer to til et sprog, vi leverer, eller et sprog, OctoEdit slet ikke leverer noget til.
En fil, der ikke er gyldig JSON, eller som mangler language eller command,
springes over og meldes i diagnostikloggen i stedet for i stilhed at koste dig et
sprog.
Definitionerne læses én gang, ved opstart: genstart editoren, når du har redigeret dem (knappen Scan igen / genstart servere kører søgningen igen, ikke indlæsningen).
{
"language": "zig",
"command": "zls",
"extensions": [".zig", ".zon"],
"projectMarkers": ["build.zig"],
"searchDirs": ["${LOCALAPPDATA}/zls"],
"searchDirsMac": ["/opt/homebrew/bin", "~/.local/bin"],
"searchDirsLinux": ["~/.local/bin"]
}
Hvilken mappe serveren får¶
En sprogserver skal vide, hvor projektet er: rust-analyzer indlæser ikke en pakke
uden det, gopls skal bruge modulets rod, pyright læser pyrightconfig.json derfra,
og clangd leder efter sin database der.
- Med en mappe åben (Filer ▸ Åbn mappe) hører filer inde i den til den mappe.
- For en fil uden for den åbne mappe, eller uden nogen mappe åben, går OctoEdit
opad fra filen og leder efter
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, en.sln,.gitog til sidst en.editorconfig, der erklærerroot = true. Filens egen mappe er reserven, så en server står aldrig uden et projekt. - Det virker at åbne mappen efter filen. Servere, der forstår ændringer af arbejdsområdets mapper, får besked om den nye mappe; resten genstartes, og dine åbne dokumenter meldes til dem igen af sig selv. Der kræves ingen manuel genstart.
Fejlfinding¶
| Symptom | Hvad du skal se efter |
|---|---|
LSP:-afsnittet kommer aldrig frem |
Ingen serverdefinition tager denne fils filendelse. Se hvilken server der betjener hvilken fil, eller tilføj en definition. |
· server not responding |
Serveren er holdt op med at svare. Brug Vis sprogserverlog og derefter Genstart sprogservere. |
✗ for et sprog, du har installeret en server til |
Kontrollér, at programmet virkelig er der: where clangd (Windows) / which clangd (macOS, Linux). Brug derefter Søg ▸ Kodenavigation ▸ Genstart sprogservere, som kører hele søgningen igen. |
⚠ |
Serveren startede og blev så ved med at gå ned. Vis sprogserverlog navngiver som regel årsagen; ret den, og brug så Genstart sprogservere. |
· no compile database i et C/C++-projekt |
Se ovenfor. Find referencer og Omdøb ser kun den åbne fil, indtil det er rettet. |
| Fuldførelsen giver ingenting i én C++-fil | Den fil mangler sandsynligvis i compile_commands.json (en headerfil, som ingen oversættelsesenhed inkluderer, eller en fil, der er kommet til, siden databasen blev genereret). Generér den igen. |
| Alt virker, når editoren startes fra en terminal, men ikke fra Finder | Meld det — opslaget af logind-skallens PATH skal netop gøre de to ens. Vis sprogserverlog og diagnostikloggen noterer, hvad der blev søgt i. |
| En server skal bruge en projektfil, du ikke har | typescript-language-server skal bruge typescript-pakken, gopls en go.mod, rust-analyzer en Cargo.toml og pyright en pyrightconfig.json eller pyproject.toml for at kunne svare på tværs af projektet. |
Indstillinger for sprogservere¶
Indstillinger ▸ Sprogserver opregner hvert sprog, der findes en serverdefinition til. Pr. sprog kan du:
- Slå serveren til eller fra (et frakoblet sprog starter aldrig en).
- Angive en udtrykkelig sti til programmet (med Gennemse…). Den
tilsidesættelse vinder over søgningen i
PATHogsearchDirsovenfor — nyttig, når serveren ikke ligger iPATH, eller når du vil have en bestemt bygning. - Tilføje ekstra argumenter, der føjes efter definitionens egne — for eksempel
--log=verbosetil clangd. Linjen deles op, som en kommandolinje deles op, så sæt anførselstegn om en værdi, der indeholder mellemrum.
Stifeltet er en sti, ikke en kommandolinje
Skriver du C:\tools\clangd.exe --log=verbose i Sti til program, beder du
OctoEdit om at finde en fil, hvis navn ender på .exe --log=verbose, og den
findes ikke — sproget melder så slet ingen server. Læg programmet i stifeltet og
dets argumenter i Ekstra argumenter. Sker det alligevel, siger
diagnostikloggen det lige ud.
Ændringer får virkning, når du trykker på OK / Anvend: har et flueben eller en sti faktisk ændret sig, genstartes serverne af sig selv med de nye indstillinger (en urørt side forstyrrer aldrig de kørende servere). Knappen Scan igen / genstart servere fremtvinger derudover en nedlukning og en ny opdagelse med de nuværende indstillinger — nyttig efter at du har installeret en server, editoren tidligere ikke kunne finde, og den nulstiller også budgettet for genstart efter nedbrud.
Åbn mappen med brugerdefinerede serverdefinitioner opretter og åbner den mappe, der er beskrevet under Dine egne serverdefinitioner.
Begrænsninger¶
- Kodens farvelægning inde i bobler med oplysninger ved pegning anvendes ikke (teksten formateres — fed skrift, overskrifter, fast tegnbredde — men syntaksfarves ikke).
- Nøjagtigheden afhænger af serveren: for C/C++ falder clangd uden
compile_commands.jsontilbage på tommelfingerregler, og resultaterne kan være ufuldstændige. - OctoEdit installerer eller henter aldrig en server. Den finder en, du har installeret, og starter den; er der ingen, bliver funktionen mørk, og statusafsnittet siger det.
- Én serverproces pr. sprog, delt af hvert åbent projekt på det sprog. Et projekt nummer to tilføjes som en arbejdsområdemappe, når serveren understøtter det; ellers betjenes det under det første projekts rod.
- Kotlin, Swift og Objective-C får kodeintelligens, men ingen syntaksfarvning — editoren har endnu ingen farvelægger til dem. De to ting er uafhængige nu, så serveren virker uanset hvad.
- Serverdefinitioner læses én gang ved opstart; at redigere dem (dine egne eller de medleverede) kræver en genstart af editoren.