Gå til indholdet

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:

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

  1. pyright (pyright-langserver) prøves først. Den er en npm-pakke, så den kræver Node.js: npm i -g pyright.
  2. 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:

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

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 clangd
where cmake
where ninja
where pyright-langserver
where pylsp

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:

  1. 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;
  2. din PATH, efter serverens kommando og hvert kendt alias (clangd-20, clangd-19 …);
  3. de installationssteder, der står i serverens definition, for dit styresystem;
  4. 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.json i 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.txt i 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:

cmake -S . -B .mte-compile-commands -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
  • .mte-compile-commands/ er en af de mapper, MTE gennemsøger, så den resulterende compile_commands.json findes 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åsom QT6_DIR i et Qt-projekt). Kan cmake ikke 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}"
}
  • language er OctoEdits eget id for sproget — den nøgle, som indstillingssiden, statusafsnittet og forbindelsen grupperes efter. command/aliases er de programnavne, der prøves i PATH.
  • extensions er den primære sammenkobling af fil og sprog (se ovenfor). Tag punktummet med.
  • args er é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 i didOpen; det er som standard language. Brug det, når LSP-specifikationens navn er et andet end vores (bash → shellscript, objc → objective-c).
  • languageIds (valgfrit) tilsidesætter languageId pr. 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 statusafsnittet ingen <first marker>; det standser aldrig serveren.
  • searchDirs er listen over installationssteder på Windows; searchDirsMac og searchDirsLinux er 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.
  • args må 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 mod compile_commands.json.
  • priority (valgfrit, 0 som 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

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

Hver *.json i den indlæses efter det medleverede sæt, og:

  • en fil, hvis language og command passer 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).

En minimal brugerdefinition: <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"]
}

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, .git og til sidst en .editorconfig, der erklærer root = 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 PATH og searchDirs ovenfor — nyttig, når serveren ikke ligger i PATH, eller når du vil have en bestemt bygning.
  • Tilføje ekstra argumenter, der føjes efter definitionens egne — for eksempel --log=verbose til 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.json tilbage 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.