Hyppää sisältöön

LSP (kielipalvelin) -liitännäinen

Koodiälyä, jota ajaa Language Server Protocol — virheiden aaltoviivat, navigointi, tiedot osoittaessa, täydennys, allekirjoitusohje, muotoilu, etsi viittaukset, uudelleennimeäminen ja siirry symboliin — mille tahansa kielelle, jolla on kielipalvelin. Editori puhuu palvelimen kanssa LSP:n yli; liitännäinen on asiakas. Se, mitä palvelimia on olemassa, on datavetoista (yksi pieni JSON kieltä kohti), joten C++ ja clangd alla ovat vain yksi useista mukana tulevista määrityksistä.

Editori ei toimita eikä lataa palvelimia

Kielipalvelin on erillinen ohjelma, jonka asennat kerran. MTE tunnistaa asennetun palvelimen ja osoittaa sen projektiisi; se ei koskaan toimita sellaista. Katso Kielipalvelimen hankkiminen.

Nykyiset ominaisuudet

Ominaisuus Miten
Diagnostiikka Palvelimen virheet ja varoitukset näkyvät aaltoviiva-alleviivauksina (punainen = virhe, meripihkan värinen = varoitus, sininen = tieto, harmaa = vihje), päivittyen kirjoittaessasi.
Siirry määrittelyyn Aseta kohdistin symbolin päälle ja paina F12, tai käytä komentoa Haku ▸ Koodinavigointi ▸ Siirry määrittelyyn. Hyppää määrittelyyn avaten tarvittaessa toisen tiedoston.
Etsi viittaukset Kohdistin symbolin päällä → Shift+F12 (tai Haku ▸ Koodinavigointi ▸ Etsi viittaukset). Tulokset avautuvat alalaidan Viittaukset-paneeliin, ryhmiteltyinä tiedostoittain lähderivin esikatselun kera; kaksoisnapsauta hypätäksesi.
Tiedot osoittaessa Pidä osoitinta symbolin päällä; ponnahdusikkuna näyttää sen tyypin tai allekirjoituksen ja dokumentaation (piirrettynä palvelimen Markdownista).
Täydennys Ctrl+välilyönti pyytää täydennyksiä palvelimelta ja sulauttaa ne editorin täydennysluetteloon (sisäänrakennettujen avainsana- ja puskurisanaehdotusten edelle), suodatettuna kirjoittaessasi.
Allekirjoitusohje Kutsun (-merkin tai ,-merkin kirjoittaminen näyttää kutsuvihjeen funktion allekirjoituksineen ja aktiivinen parametri korostettuna; ) sulkee sen.
Muotoile asiakirja Alt+Shift+F (⌃⌥F macOS:ssä; tai Muokkaa ▸ Muotoile asiakirja) muotoilee koko asiakirjan palvelimen kautta, yhdessä kumoamisaskeleessa. Palvelimen oma kokoonpano ohjaa tyyliä (clangdilla .clang-format-tiedosto).
Etsi viittaukset (lueteltu yllä) —
Nimeä symboli uudelleen Kohdistin symbolin päällä → Shift+F6 (tai Muokkaa ▸ Nimeä symboli uudelleen). Anna uusi nimi; jokainen käyttö päivitetään. Kun uudelleennimeäminen ulottuu useaan tiedostoon, sinua pyydetään vahvistamaan ensin — kukin tiedosto avataan, muutetaan ja jätetään muutetuksi, jotta voit tarkistaa ja tallentaa sen.
Siirry symboliin (tiedostossa) Ctrl+Shift+O avaa komentopaletin, jossa on jokainen nykyisen tiedoston symboli (funktiot, luokat, metodit …); kirjoita suodattaaksesi, Enter hyppää. Kukin rivi näyttää symbolin lajin ja sen säiliön.
Siirry symboliin työtilassa Ctrl+T hakee symboleja koko projektista kirjoittaessasi (palvelin sovittaa kyselyn); Enter avaa tiedoston symbolin kohdalta.

Siirry symboliin -valitsimet ovat komentopaletin symbolitiloja — katso Komentopaletti.

Komennot ovat harmaana, kunnes palvelin on käynnissä

Siirry määrittelyyn, Etsi viittaukset, Muotoile asiakirja ja Nimeä symboli uudelleen ovat käytössä vain, kun nykyisen tiedoston kielen kielipalvelin on valmis — ja kun tuo palvelin ilmoitti kättelyssään tukevansa pyyntöä. Tiedostossa, jolle ei ole määritettyä palvelinta, tai palvelimen käynnistyessä, käynnistyessä uudelleen tai luovutettuaan valikkokohdat ovat harmaana sen sijaan että ne eivät tekisi mitään painettaessa. Alla oleva tilailmaisin kertoo, kumpi on kyseessä. Käynnistä kielipalvelimet uudelleen ei ole koskaan harmaana: se on tie ulos luovuttaneesta palvelimesta.

Tiedostojen väliset viittaukset ja uudelleennimeäminen vaativat palvelimen hakemiston

Etsi viittaukset ja Nimeä uudelleen yltävät muihin tiedostoihin vasta, kun palvelin on indeksoinut projektin. C/C++:n osalta se tarkoittaa compile_commands.json-tiedostoa (katso alta) ja clangdin taustahakemistoa; ilman sitä ne toimivat vain nykyisessä tiedostossa.

Uudelleennimeäminen kumotaan toistaiseksi tiedostoittain

Monitiedostoinen uudelleennimeäminen otetaan käyttöön yksi tiedosto kerrallaan, joten kukin tiedosto on oma kumoamisaskeleensa (vahvistusikkuna kertoo tämän). Tarkista muutetut välilehdet ennen tallentamista.

Editorin kontekstivalikossa

Napsauta tekstissä olevaa symbolia hiiren oikealla, niin valikko tarjoaa muokkauskomentojen alla kohdat Siirry määrittelyyn, Etsi viittaukset, Nimeä symboli uudelleen ja Muotoile asiakirja. Kukin näkyy vain, kun sama komento päävalikossa toimisi juuri nyt — tiedostolle on valmiina kielipalvelin, joka tukee sitä, ja uudelleennimeämisessä ja muotoilussa asiakirja ei ole vain luku -tilassa. Pelkässä tekstitiedostossa, tekstin vasemmalla puolella olevassa marginaalissa tai palvelimen käynnistyessä niistä ei näy yhtäkään.

Kohdat toimivat symbolissa, jota napsautit hiiren oikealla, eivät kohdistimen alla olevassa; kohdistin ja valinta pysyvät paikallaan. Nimeä uudelleen ehdottaa vanhaksi nimeksi valintaa, kun napsautit sen sisällä, ja muuten osoittimen alla olevaa sanaa. Muotoile asiakirja muotoilee aina koko asiakirjan. Näppäimistöltä avattu valikko toimii kohdistimen kohdalla.

Siellä, missä alusta näyttää pikanäppäimet kontekstivalikoissa (Windows), kukin kohta näyttää pikanäppäimensä — voimassa olevan, omat muutoksesi Pikanäppäinten määrityksessä mukaan lukien. macOS:ssä kontekstivalikot eivät näytä pikanäppäimiä.

Miten muutoksesi yltävät palvelimelle

Kirjoittaminen ei lähetä viestiä näppäinpainallusta kohti. Muutokset kootaan sekunnin murto-osan ajan ja lähetetään sitten yhtenä muutoksena — ja yhtenä muokattuna alueena koko tiedoston sijaan aina, kun palvelin sanoo voivansa ottaa sellaisen vastaan (useimmat voivat). Suuri tiedosto maksaa siis muutamia kymmeniä tavuja kirjoituspursketta kohti eikä kopiota itsestään.

Kaikki, mikä kysyy palvelimelta tekstistä — tiedot osoittaessa, siirry määrittelyyn, etsi viittaukset, nimeä uudelleen, muotoile, täydennys, allekirjoitusohje — lähettää odottavan muutoksen ensin, jottei vastaus koskaan viittaa versioon, jonka olet jo ohittanut. Sama tapahtuu, kun tallennat tiedoston.

Palvelimen käynnistäminen ei myöskään estä editoria: prosessi käynnistetään taustalla, ja tilaosio näyttää merkkiä …, kunnes se on saanut kättelynsä valmiiksi. Käynnistyksessä jumittuva palvelinohjelma ei maksa sinulle muuta kuin tuon kielen.

Katto sille, montako ongelmaa piirretään

Asiakirjaa kohti piirretään enintään 2000 aaltoviivaa. Sen yli tiedosto on joka tapauksessa lukukelvoton, ja kukin lisämerkki maksaa editorille oikeaa aikaa — joten kun tiedosto tuottaa enemmän, ensimmäiset 2000 näytetään ja tilarivillä lukee Näytetään ensimmäiset 2000 tästä tiedostosta löytyneestä N ongelmasta, sen sijaan että lukumäärä näyttäisi hiljaisesti pienemmältä kuin se on. Se on yleensä merkki siitä, että palvelin katsoo tiedostoa väärin: puuttuva käännöstietokanta tai generoitu tiedosto, jonka ei ole tarkoituskaan kääntyä yksinään.

Palvelimen tilailmaisin

Tilarivi näyttää tiiviin LSP:-osion (muiden liitännäisosioiden vasemmalla puolella), joka tiivistää jokaisen avoimiin tiedostoihisi liittyvän kielipalvelimen:

LSP: cpp ✓ · no compile database  python ↻2  rust ✗
Merkki Merkitys
… Käynnistyy — palvelin on käynnistetty ja kättelee.
✓ Valmis — palvelee pyyntöjä.
↻n Käynnistyy uudelleen — palvelin pysähtyi odottamattomasti; automaattinen uudelleenkäynnistysyritys n on aikataulutettu.
✗ Tälle kielelle ei ole asennettua palvelinta. Asenna sellainen (katso alta) ja käytä sitten komentoa Käynnistä kielipalvelimet uudelleen.
⚠ Luovutti — palvelin kaatui toistuvasti ja automaattiset uudelleenkäynnistykset pysähtyivät. Vain käsin tehty uudelleenkäynnistys herättää sen.

Kieli voi kantaa merkin jälkeen lyhyen tarkenteen — palvelin on käynnissä, ja jokin projektissasi rajoittaa silti sitä, mihin se voi vastata. Kerrallaan näytetään vain yksi, vakavin ensin:

Tarkenne Merkitys
· server not responding Useaan peräkkäiseen pyyntöön ei vastattu. Palvelin on elossa mutta jumissa; käytä komentoa Näytä kielipalvelimen loki ja sitten Käynnistä kielipalvelimet uudelleen. Tarkenne katoaa sillä hetkellä, kun palvelin vastaa mihin tahansa.
· no compile database C/C++-palvelin on käynnissä mutta se näkee vain avaamasi tiedoston — katso C/C++-projektit vaativat compile_commands.json.
· no Cargo.toml, · no go.mod, · no tsconfig.json … Projektissa ei ole yhtäkään niistä tiedostoista, joita tämä palvelin tarvitsee ymmärtääkseen sen projektina. Se toimii silti avoimessa tiedostossa; tiedostojen väliset vastaukset ovat puutteellisia, kunnes tiedosto on olemassa. Täsmällinen nimi on se, jota palvelin eniten kaipaa — katso Mitä kukin palvelin tarvitsee projektiltasi.

Osio ilmestyy, kun ensimmäinen asiakirja, jolla on määritetty kieli, avataan, seuraa vain niitä kieliä, joille sinulla todella on asiakirjoja auki — kielen viimeisen tiedoston sulkeminen poistaa sen kohdan (sellaisen avaaminen uudelleen tuo sen takaisin heti) — ja piiloutuu kokonaan, kun tällaisia asiakirjoja ei ole enää jäljellä.

Haku ▸ Koodinavigointi ▸ Näytä kielipalvelimen loki näyttää kunkin käynnissä olevan palvelimen uusimman tulosteen. Siellä palvelin selittää itsensä: puuttuva työkaluketju, lukukelvoton kokoonpanotiedosto, projekti, jonka lataamisesta se kieltäytyi. Ikkuna on tavallinen, kooltaan muutettava ikkuna — kukin kieli on otsikko, joka nimeää sille käynnissä olevan palvelimen, tekstin voi valita, Kopioi laittaa koko lokin leikepöydälle, ja ikkunalle antamasi koko muistetaan.

Jos palvelin kaatuu

Odottamattomasti päättyvä kielipalvelin käynnistetään uudelleen automaattisesti kasvavalla viiveellä (1 s, 2 s, 4 s … kattona 30 s). Tämän tapahtuessa ilmaisin näyttää merkintää ↻n ja tilarivin ilmoitus kertoo ensimmäisestä kaatumisesta. Onnistuneen uudelleenkäynnistyksen jälkeen avoimet asiakirjasi ilmoitetaan palvelimelle uudelleen ja diagnostiikka palaa itsestään; kuolleen palvelimen vanhentuneet aaltoviivat tyhjennetään heti. Muokkausta ei koskaan estetä.

Viiden peräkkäisen epäonnistuneen yrityksen jälkeen liitännäinen luovuttaa: ilmaisin näyttää merkkiä ✗, ilmoitus ohjaa sinut asetuksiin, ja kieli pysyy pimeänä, kunnes käynnistät sen uudelleen käsin. Palvelin, joka toimi hyvin vähintään minuutin, saa uuden sarjan yrityksiä, kun se myöhemmin kaatuu.

Käsin tehtävä uudelleenkäynnistys — jompikumpi näistä:

  • Haku ▸ Koodinavigointi ▸ Käynnistä kielipalvelimet uudelleen (ei oletuspikanäppäintä; saatavilla myös komentopaletista) tai
  • painike Skannaa uudelleen / käynnistä palvelimet uudelleen kohdassa Asetukset ▸ Kielipalvelin.

Jos haluat nähdä, miksi palvelin on tyytymätön, ennen sen uudelleenkäynnistämistä, käytä komentoa Haku ▸ Koodinavigointi ▸ Näytä kielipalvelimen loki.

Molemmat purkavat jokaisen palvelimen, ajavat etsinnän uudelleen nykyisillä asetuksilla ja nollaavat epäonnistumisbudjetin — käytä niitä puuttuvan palvelimen asentamisen tai rikkinäisen korjaamisen jälkeen.

Kielipalvelimen hankkiminen

Asenna kielesi palvelin ja varmista, että se on PATH-muuttujassasi (tai aseta nimenomainen polku asetuksissa). Jos sellaista ei löydy, ominaisuus ei yksinkertaisesti tee mitään tuon kielen osalta — tilailmaisin näyttää merkkiä ✗ ja loki kirjaa kertaluonteisen vihjeen, mutta mikään ei keskeytä sinua.

MTE toimittaa palvelinmäärityksiä (ei palvelimia) monille kielille, joten useimmat vaativat vain palvelimen asentamisen — ei JSON-muokkausta. Mukana tulevat määritykset kattavat kielet C/C++, Objective-C, Python, Rust, Go, TypeScript, JavaScript, C#, Java, Kotlin, Swift, HTML, CSS/SCSS/Less, JSON, YAML ja komentotulkkiskriptit.

Kieli Palvelin Mistä sen saa
C/C++ clangd winget install LLVM.LLVM (Windows), »C++ Clang tools« -osa Visual Studion asennusohjelmassa, brew install llvm (macOS) tai jakelusi clang-tools-extra-paketti.
Python pyright tai pylsp npm i -g pyright (vaatii Node.js:n) tai pip install python-lsp-server (vaatii vain Pythonin).
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 tai OmniSharp dotnet tool install -g csharp-ls (yksi dotnet-työkalu, jota kokeillaan ensin) tai lataa OmniSharp-julkaisu.
Java jdtls (Eclipse JDT Language Server) brew install jdtls (macOS) tai pura julkaisu ja laita sen bin PATH-muuttujaasi.

Tarkista päätteessä, esimerkiksi komennoilla clangd --version tai where clangd / which clangd. Kielelle, jolle MTE ei toimita määritystä, voit lisätä sellaisen kohdan Kielen lisääminen mukaisesti.

Python: pyright vai pylsp

Pythonilla on kaksi mukana tulevaa määritystä, ja OctoEdit ajaa sen, joka on todella asennettu:

  1. pyright (pyright-langserver) kokeillaan ensin. Se on npm-paketti, joten se vaatii Node.js:n: npm i -g pyright.
  2. pylsp (python-lsp-server) käytetään, kun pyrightiä ei löydy. Se on pip-paketti ja vaatii vain Pythonin: pip install python-lsp-server.

Jos molemmat on asennettu, pyright voittaa. Pythonille on yksi asetusrivi (yksi käyttöönottolippu, yksi polun ohitus), ja se koskee sitä palvelinta, jota käytetään — nimenomaisen polun asettaminen pylsp-ohjelmaan ajaa pylsp:n sen käynnistysargumenteilla eikä pyrightin. Näytä kielipalvelimen loki nimeää sen palvelimen, joka todella on käynnissä.

Useita palvelimia yhdelle kielelle

Tämä on yleinen mekanismi eikä Pythonin erikoistapaus: kielellä voi olla mikä tahansa määrä mukana tulevia määrityksiä, järjestettyinä priority-kentän mukaan, ja ensimmäinen, jonka ohjelma löytyy koneeltasi, on se, joka käynnistyy. C# toimii samalla tavalla — csharp-ls ensin, OmniSharp toisena — koska nuo kaksi ottavat eri käynnistysargumentit ja vain toinen niistä voi olla oikea.

Java: palvelimen oma työtila

jdtls kieltäytyy käynnistymästä ilman omaa kirjoitettavaa työtilahakemistoa (-data). OctoEdit tarjoaa sellaisen automaattisesti, projektikohtaisesti, liitännäisen datakansiossaan:

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

Sinun ei tarvitse koskaan luoda tai nimetä sitä. Kansion poistaminen on turvallista — jdtls rakentaa sen uudelleen yhden uudelleenindeksoinnin hinnalla.

Käyttöönotto Windowsissa

Tuoreessa Windows-koneessa ei yleensä ole yhtäkään ohjelmista clangd, cmake, ninja, node tai python PATH-muuttujassaan. Tämä osio kertoo, mistä kukin niistä tulee ja miten sen tarkistaa. Sinun ei yleensä tarvitse muokata PATH-muuttujaa itse — OctoEdit hakee myös alla luetelluista ekosysteemihakemistoista.

Haluat Asenna Mihin se päätyy
clangd (C/C++) winget install LLVM.LLVM C:\Program Files\LLVM\bin\clangd.exe
cmake ja ninja »C++ CMake tools for Windows« -osa Visual Studion asennusohjelmassa …\Microsoft Visual Studio\2022\<edition>\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin ja …\CMake\Ninja — ei PATH-muuttujassasi, mutta tavoitettavissa Visual Studion kehittäjäympäristön kautta (katso alta). Erillinen winget install Kitware.CMake / winget install Ninja-build.Ninja laittaa ne sen sijaan PATH-muuttujaan.
pyright (Python) winget install OpenJS.NodeJS.LTS ja sitten npm i -g pyright %APPDATA%\npm\pyright-langserver.cmd
pylsp (Python, ei Nodea) Python Microsoft Storesta tai osoitteesta python.org ja sitten pip install python-lsp-server %LOCALAPPDATA%\Packages\PythonSoftwareFoundation.Python.3.*_*\LocalCache\local-packages\Python3*\Scripts\pylsp.exe (Store) tai %APPDATA%\Python\Python3*\Scripts\pylsp.exe

Sen tarkistaminen, mikä on näkyvissä. Tavallisessa komentokehotteessa tai PowerShellissä:

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

where hakee vain PATH-muuttujastasi. Työkalun, jota se ei löydä, saattaa OctoEdit silti löytää, koska haku kattaa myös yllä olevat ekosysteemihakemistot — varsinkaan Pythonin skriptihakemistot eivät ole koskaan PATH-muuttujassa. Jos kieli pysyy merkinnässä ✗ palvelimen asentamisen jälkeen, käytä komentoa Haku ▸ Koodinavigointi ▸ Käynnistä kielipalvelimet uudelleen, joka ajaa koko haun uudelleen.

Käännöstietokannan luonti ajetaan Visual Studion kehittäjäympäristössä. Kun OctoEdit ajaa CMaken puolestasi (alla), se paikantaa ensin Visual Studion — muuttujan VSINSTALLDIR kautta, muutoin ohjelmalla vswhere.exe — ja kääri kutsun tuon asennuksen VsDevCmd.bat -arch=x64 -komentoon. Se on se, mikä laittaa cl-kääntäjän, Windows SDK:n ja Visual Studion oman cmake- ja ninja-ohjelman polkuun tuota yhtä komentoa varten, joten editori ei tarvitse niitä PATH-muuttujassasi lainkaan. Ilman Visual Studiota (pelkkä clang- tai MinGW-kone) kutsu tehdään tavallisesti editorin omassa ympäristössä, ja loki kertoo sen; silloin tarvitset itse cmake- ja ninja-ohjelmat tavoitettavina sekä kääntäjän, jonka CMake tunnistaa.

Uudelleenluonti tarvittaessa. Haku ▸ Koodinavigointi ▸ Luo käännöstietokanta… ajaa saman luonnin milloin tahansa — myös silloin kun tietokanta on jo olemassa (se uudelleenmääritetään paikallaan) ja kun olet aiemmin vastannut Älä kysy tältä projektilta. Kohta on aina käytettävissä — kun se ei voi luoda, se kertoo tilarivillä miksi (ei C/C++-asiakirjaa, ei projektikansiota, ei CMakeLists.txt-tiedostoa projektin juuressa, ei cmake-ohjelmaa tai ei generaattoria, joka voisi viedä sellaisen) sen sijaan että olisi harmaana syystä, jota et näe.

Mihin »älä kysy« -vastaus tallennetaan. Älä kysy tältä projektilta säilytetään projektijuurikohtaisesti tiedostossa %APPDATA%\7-bits\OctoEdit.ini avaimen plugins/org.mte.lsp/noCompileDbPrompt/<hash> alla (projektipolku tiivistetään, koska polku ei ole kelvollinen asetusavain). Komennon Luo käännöstietokanta… ajaminen tyhjentää sen tuon projektin osalta.

Mistä OctoEdit etsii palvelinta

Sinun ei pitäisi joutua määrittämään mitään. Palvelimen asentamisen jälkeen kansion ja lähdetiedoston avaaminen riittää. Editori kokeilee järjestyksessä:

  1. nimenomaista polkua, jonka asetit asetuksissa — se on ratkaiseva: jos se ei ratkea, kieli pysyy pimeänä sen sijaan että turvautuisi hiljaisesti johonkin muuhun;
  2. PATH-muuttujaasi, palvelimen komennon ja kunkin tunnetun aliaksen osalta (clangd-20, clangd-19 …);
  3. palvelimen määrityksessä olevia asennuspaikkoja käyttöjärjestelmällesi;
  4. sisäänrakennettua luetteloa ekosysteemihakemistoista.
Haettavat ekosysteemihakemistot
Windows npm:n yleinen etuliite ja %APPDATA%\npm, %LOCALAPPDATA%\Microsoft\WinGet\Links, %USERPROFILE%\.cargo\bin, %USERPROFILE%\go\bin ja %LOCALAPPDATA%\go\bin, %USERPROFILE%\.dotnet\tools, %ProgramFiles%\LLVM\bin, %ProgramFiles%\nodejs sekä Pythonin käyttäjäkohtaiset skriptihakemistot: %APPDATA%\Python\Python3*\Scripts, %LOCALAPPDATA%\Packages\PythonSoftwareFoundation.Python.3.*_*\LocalCache\local-packages\Python3*\Scripts (Microsoft Storen Python) ja %LOCALAPPDATA%\Programs\Python\Python3*\Scripts
macOS /opt/homebrew/bin ja /opt/homebrew/opt/llvm/bin (Homebrew'n clangd sijaitsee jälkimmäisessä — sitä ei koskaan linkitetä ensimmäiseen), /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 sekä samat ~/.cargo/bin, ~/go/bin, ~/.local/bin, ~/.npm-global/bin, ~/.dotnet/tools

*-kohdat ovat oikeita jokerimerkkejä: se versiohakemisto, jonka Python luo (Python313, 3.13 tai Storen …Python.3.13_qbz5n2kfra8p0), täsmätään siihen, mitä levyllä todella on, uusin ensin. Sinne pip install python-lsp-server laittaa pylsp-ohjelman, ja siksi sen asentaminen ei vaadi PATH-muokkausta.

macOS: Finderistä käynnistäminen vastaan päätteestä

Finderistä tai Dockista käynnistetty sovellus ei peri PATH-muuttujaa komentotulkkiprofiilistasi — macOS antaa sille minimaalisen (/usr/bin:/bin:/usr/sbin:/sbin). Homebrew, Cargo, Go ja npm olisivat kaikki näkymättömiä. Siksi OctoEdit kysyy kirjautumistulkiltasi, mikä sen PATH on, ja hakee myös sieltä, ja antaa näin saadun ympäristön käynnistämälleen palvelimelle — joten millä tahansa noista työkaluista asennettu palvelin löytyy riippumatta siitä, miten käynnistät editorin.

Palvelin käynnistetään kerran kieltä kohti ja suljetaan editorin mukana.

C/C++-projektit vaativat compile_commands.json

clangd ymmärtää koodiasi tarkasti vain, kun se tuntee käännösliput käännöstietokannasta (compile_commands.json). Ilman sellaista clangd turvautuu arvailuun ja tiedostojen väliset ominaisuudet (etsi viittaukset, nimeä uudelleen) pysyvät rajattuina avoimeen tiedostoon. clangd käynnistetään silti kummassakin tapauksessa.

C/C++-projekti lasketaan määritetyksi, kun sillä on jokin näistä:

  • compile_commands.json projektin juuressa tai jossakin niistä käännöshakemistoista, joita OctoEdit käy läpi (build/, Build/, out/, out/build/, cmake-build-debug/, cmake-build-release/, .mte-compile-commands/);
  • compile_flags.txt projektin juuressa;
  • .clangd-kokoonpanotiedosto projektin juuressa.

clangd lukee kaksi jälkimmäistä itse, joten niistä ei raportoida mitään.

Kun yhtäkään niistä ei ole — jokaisen C/C++-projektin osalta, käytti se mitä tahansa käännösjärjestelmää — tilaosio näyttää merkintää · no compile database ja tilarivin viesti kertoo siitä kerran. Mikään ei esty; mikään ikkuna ei keskeytä kirjoittamistasi.

OctoEditin antaminen luoda se (CMake-projektit)

Jos projektin juuressa on CMakeLists.txt ja CMake, joka todella tuottaisi tietokannan, sinulle tarjotaan tätä kerran projektia kohti:

  • Luo — ajaa CMaken taustalla, vain määrityksen: mitään ei käännetä eikä omiin käännöshakemistoihisi kosketa. Tulos menee hakemistoon <project>/.mte-compile-commands/. Onnistuessa clangd käynnistetään uudelleen uutta tietokantaa vasten; epäonnistuessa näytetään CMake-lokin viimeiset rivit sekä täsmällinen kokeiltu komento, jotta voit toistaa sen itse.
  • Miten se tehdään käsin — näyttää saman komennon ajamatta sitä.
  • Älä kysy tältä projektilta — muistetaan projektijuurikohtaisesti.

Sekä »miten se tehdään käsin« -ikkuna että virheikkuna näyttävät täsmällisen komentorivin valittavassa koodiruudussa, yhden Kopioi-painikkeen yläpuolella, jonka työkaluvihje kertoo, mitä se ottaa: komennon yksin tai komennon yhdessä CMake-lokin lopun kanssa, kun sellainen on. Virheikkunan kokoa voi muuttaa ja se muistaa antamasi koon — kukin näistä ikkunoista muistaa oman kokonsa, joten palvelinlokin suurentaminen ei saa kaksirivistä ohjeikkunaa avautumaan yhtä suurena.

Et ole rajattu tuohon yhteen tarjoukseen: Haku ▸ Koodinavigointi ▸ Luo käännöstietokanta… käynnistää saman luonnin milloin haluat — tiedostojen lisäämisen, käännösvalintojen muuttamisen tai Älä kysy tältä projektilta -vastauksen jälkeen (jonka se tyhjentää). Olemassa oleva tietokanta uudelleenmääritetään paikallaan. Kohta on aina käytettävissä; kun se ei voi luoda, se kertoo tilarivillä miksi.

Esiasetuksesi tulevat ensin. Jos projektissa on CMakePresets.json (tai CMakeUserPresets.json), OctoEdit määrittää jollakin sinun esiasetuksistasi sen sijaan että keksisi komentorivin — cmake --preset <name> -B <project>/.mte-compile-commands -DCMAKE_EXPORT_COMPILE_COMMANDS=ON. Siten generaattori, työkalusarja ja esiasetuksen environment-lohko (QT6_DIR, SDK-polku) ovat ne, joihin projekti jo nojaa, ja CMake ottaa ne itse käyttöön. Esiasetukset, jotka ovat piilotettuja, jotka condition sulkee pois käyttöjärjestelmässäsi tai jotka määrittävät generaattorilla, joka ei voi viedä, ohitetaan; debug-sanan sisältävää nimeä suositaan. Omaan käännöshakemistoosi ei koskaan kosketa — editori ohjaa tulosteen aina muualle valitsimella -B.

Windowsissa CMake ajetaan Visual Studion kehittäjäympäristössä. Resurssienhallinnasta tai käynnistysvalikosta käynnistetyllä editorilla ei ole cl-kääntäjää PATH-muuttujassaan, ja CMake tyytyisi silloin hiljaisesti mihin tahansa muuhun löytämäänsä kääntäjään — mukaan lukien se clang.exe, joka tulee Visual Studio -asennuksen mukana ja joka epäonnistuu heti MSVC-kohtaisissa asetuksissa. Siksi OctoEdit paikantaa Visual Studion ohjelmalla vswhere ja käärii kutsun komentoon VsDevCmd.bat -arch=x64. Jos Visual Studiota ei ole asennettu (MinGW- tai pelkkä clang-kone), kutsu tehdään tavallisesti ja loki kertoo sen.

Aiempi epäonnistunut yritys siivotaan pois ennen uutta yritystä: sen CMakeCache.txt naulaisi muuten sen kääntäjän, joka epäonnistui. Hakemisto, joka jo sisältää toimivan compile_commands.json-tiedoston, määritetään uudelleen paikallaan eikä koskaan poisteta.

Miksi tarjous ei joskus ilmesty

CMAKE_EXPORT_COMPILE_COMMANDS huomioidaan vain Ninja- ja Makefile-generaattoreissa; Visual Studio -generaattori ohittaa sen eikä kirjoita tietokantaa. Niinpä Windowsissa, projektille jolla ei ole käyttökelpoista esiasetusta, tarjous ilmestyy vain, kun ninja on PATH-muuttujassasi. Kun projektin ainoat soveltuvat esiasetukset ovat Visual Studio -esiasetuksia eikä Ninjaakaan ole, OctoEdit kertoo, mikä esiasetus oli tiellä, sen sijaan että tarjoutuisi ajamaan jotain, mikä ei voisi toimia.

Sen luominen itse (CMake)

CMAKE_EXPORT_COMPILE_COMMANDS huomioidaan vain Ninja- ja Makefile-generaattoreissa — Visual Studio -generaattori ohittaa sen (se ei tuota compile_commands.json-tiedostoa edes lipun ollessa asetettuna). Luo siis tietokanta Ninjalla, omistettuun hakemistoon, erilleen siitä, jossa normaalisti käännät: CMake kieltäytyy määrittämästä olemassa olevaa käännöshakemistoa uudelleen eri generaattorilla, joten projekti, jonka yleensä käännät Visual Studiolla, tarvitsee oman Ninja-hakemistonsa.

Tämä on vain määritysvaihe (täyttä käännöstä ei tarvita). Projektin juuresta:

cmake -S . -B .mte-compile-commands -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
  • .mte-compile-commands/ on yksi niistä hakemistoista, joita MTE käy läpi, joten syntyvä compile_commands.json löytyy automaattisesti. Mikä tahansa läpikäytävä hakemisto toimii myös (build/, out/, cmake-build-* tai projektin juuri) — pidä se vain erillään hakemistosta, joka on määritetty toisella generaattorilla.
  • Aja se ympäristöstä, jossa projekti todella määrittyy: oikea kääntäjä PATH-muuttujassa (esimerkiksi x64 Native Tools Command Prompt Windowsissa) ja ne muuttujat, joita projektisi tarvitsee (kuten QT6_DIR Qt-projektille). Jos cmake ei löydä kääntäjääsi tai SDK:tasi, tietokanta jää tyhjäksi tai siitä puuttuu sisällytyspolkuja eikä clangd indeksoi hyvin.
  • Avaa kansio uudelleen jälkeenpäin. Lokissa ei pitäisi enää lukea »no compile_commands.json«; anna clangdille hetki rakentaa taustahakemistonsa, ennen kuin viittaukset ja uudelleennimeäminen ulottuvat tiedostojen yli.

Muut käännösjärjestelmät: Bear (bear -- make), compiledb, Meson, Bazel ja muut voivat kaikki tuottaa compile_commands.json-tiedoston, jonka liitännäinen löytää.

Mikä palvelin palvelee mitäkin tiedostoa

Tiedostonimi ratkaisee. Kukin palvelinmääritys luettelee palvelemansa tiedostopäätteet, ja ensimmäinen määritys, joka vaatii tiedoston päätettä itselleen, on se, joka käynnistyy. Täsmäys ohittaa kirjainkoon, ja vain viimeinen piste lasketaan — Deploy.Prod.SH on komentotulkkiskripti.

Tämä on tarkoituksella riippumaton syntaksivärjäyksestä. Värjäyksen kytkeminen pois tai värjäyksen kokorajaa suuremman tiedoston avaaminen ei enää maksa sinulle myös kielipalvelinta.

Värjääjän tunniste on edelleen varana

Jos mikään määritys ei vaadi päätettä, OctoEdit turvautuu siihen kielitunnisteeseen, jonka värjäysmoottori antoi. Se pitää käsin kirjoitetun määrityksen toimivana, kun se nimeää kielen muttei luettele päätteitä.

Se nimi, joka palvelimelle kerrotaan, on toinen, erillinen asia: LSP:llä on oma kielitunnisteiden sanastonsa, eikä usea niistä vastaa OctoEditin omia. .sh-tiedosto ilmoitetaan muodossa shellscript, .scss muodossa scss, .jsx muodossa javascriptreact, .mm muodossa objective-cpp. Palvelimet, jotka käyttäytyvät eri tavoin eri kielillä — CSS-palvelin, TypeScript-palvelin — tarvitsevat tämän oikein.

Pääte Palvelee Ilmoitetaan muodossa
.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-päätteen vaatii itselleen C/C++-määritys eikä Objective-C-määritys — molemmat ajavat clangdia, joka päättää itse, mitä otsikkotiedosto sisältää.

Mitä kukin palvelin tarvitsee projektiltasi

Useat palvelimet toimivat kunnolla vain, kun tietty tiedosto sijaitsee projektin juuressa. Kun se puuttuu, tilailmaisin kertoo siitä sen sijaan että teeskentelisi kaiken olevan hyvin:

Kieli Haluaa Ilman sitä
Rust Cargo.toml rust-analyzer ei lataa pakettia lainkaan.
Go go.mod gopls ei voi ratkaista moduulia.
TypeScript tsconfig.json (tai package.json) projektinlaajuiset vastaukset eivät ole käytettävissä.
JavaScript jsconfig.json (tai package.json) kuten yllä.
Python (pyright) pyproject.toml / pyrightconfig.json / setup.py pyright toimii silti; se vain käyttää oletuksia tuontijuurille ja tiukkuudelle.
Java pom.xml / build.gradle jdtls ei voi rakentaa luokkapolkua.
C/C++ compile_commands.json katso yllä oleva osio.

Kielen lisääminen

Palvelimia kuvataan JSON-tiedostoilla, jotka liitännäinen lataa käynnistyksessä polusta <editor>/lsp-servers/*.json sekä omasta kansiostasi. Kukin kohta kuvaa kielen komennokseen sekä etsintävihjeet:

{
    "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 on OctoEditin oma tunniste kielelle — se avain, jonka mukaan asetussivu, tilaosio ja yhteys ryhmitellään. command/aliases ovat ne ohjelmanimet, joita PATH-muuttujasta kokeillaan.
  • extensions on ensisijainen tiedosto–kieli-kuvaus (katso yltä). Ota piste mukaan.
  • args on yksi taulukkoalkio argumenttia kohti. ["--background-index", "--log=verbose"] välittää kaksi argumenttia; ["--background-index --log=verbose"] välittää yhden argumentin, joka sattuu sisältämään välilyönnin, ja jokainen palvelin hylkää sen — ja koska se silloin päättyy heti, tulos näyttää kaatumissilmukalta eikä kirjoitusvirheeltä. OctoEdit varoittaa tuosta muodosta diagnostiikkalokissa ladatessaan tiedostosi.
  • languageId (valinnainen) on se tunniste, joka lähetetään palvelimelle didOpen-viestissä; oletuksena se on language. Käytä sitä, kun LSP-spesifikaation nimi eroaa omastamme (bash → shellscript, objc → objective-c).
  • languageIds (valinnainen) ohittaa arvon languageId päätekohtaisesti, yhdelle palvelimelle, joka palvelee useita spesifikaation kieliä.
  • projectMarkers (valinnainen) ovat ne tiedostonimet, joita palvelin haluaa projektin juureen. Kun yhtäkään niistä ei ole, tilaosiossa lukee ei <first marker>; se ei koskaan pysäytä palvelinta.
  • searchDirs on Windowsin asennuspaikkaluettelo; searchDirsMac ja searchDirsLinux ovat sen alustakohtaiset vastineet. Kaikki kolme laajentavat muodon ${VAR}, ja POSIX-luettelot laajentavat myös alussa olevan ~-merkin. Kohta, jonka muuttujia ei ole asetettu, ohitetaan sen sijaan että siitä tulisi järjetön polku.
  • args voi käyttää kahta paikkamerkkiä: ${dataDir}, liitännäisen kirjoitettava datakansio, ja ${rootHash}, lyhyt vakaa tunniste nykyiselle projektille. Siten jdtls saa arvonsa -data <dir>. Paikkamerkki, joka ei ratkea, jätetään argumenttiin sanatarkasti sen sijaan että se laajennettaisiin tyhjäksi.
  • compileCommandsArg (valinnainen) lisätään perään, ja ${dir} korvataan paikannetulla tietokantahakemistolla — siten clangd osoitetaan tiedostoon compile_commands.json.
  • priority (valinnainen, oletus 0) järjestää saman kielen useita määrityksiä: pienin numero kokeillaan ensin, ja ensimmäinen määritys, jonka ohjelma löytyy, on se, joka käynnistyy. Siten Python saa pyrightin (priority: 0) ja pylsp:n (priority: 10) varalle.

Omat palvelinmäärityksesi

Mukana tulevat määritykset sijaitsevat asennushakemistossa, joka ei ole sinun muokattavanasi (Program Files Windowsissa, allekirjoitettu sovelluspaketti macOS:ssä). Laita omasi sen sijaan niiden viereen: Asetukset ▸ Kielipalvelin ▸ Avaa käyttäjän palvelinmääritysten kansio luo ja avaa kansion

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

Jokainen siellä oleva *.json ladataan mukana tulevan joukon jälkeen, ja:

  • tiedosto, jonka language ja command vastaavat mukana tulevaa määritystä, korvaa sen — siten muutat clangdin argumentteja tai lisäät hakuhakemiston;
  • kaikki muu lisätään — toinen palvelin kielelle, jonka toimitamme, tai kieli, jolle OctoEdit ei toimita mitään.

Tiedosto, joka ei ole kelvollista JSONia tai josta puuttuu language tai command, ohitetaan ja siitä ilmoitetaan diagnostiikkalokissa sen sijaan että se hiljaisesti maksaisi sinulle kielen.

Määritykset luetaan kerran, käynnistyksessä: käynnistä editori uudelleen muokattuasi niitä (painike Skannaa uudelleen / käynnistä palvelimet uudelleen ajaa haun uudelleen, ei latausta).

Vähimmäismuotoinen käyttäjän määritys: <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"]
}

Mikä kansio palvelimelle annetaan

Kielipalvelimen täytyy tietää, missä projekti on: rust-analyzer ei lataa pakettia ilman sitä, gopls tarvitsee moduulin juuren, pyright lukee sieltä tiedoston pyrightconfig.json, ja clangd etsii sieltä tietokantaansa.

  • Kun kansio on auki (Tiedosto ▸ Avaa kansio), sen sisällä olevat tiedostot kuuluvat tuohon kansioon.
  • Tiedostolle, joka on avoimen kansion ulkopuolella, tai kun kansiota ei ole lainkaan auki, OctoEdit kulkee tiedostosta ylöspäin etsien tiedostoja 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, .sln, .git ja lopuksi .editorconfig, joka ilmoittaa root = true. Tiedoston oma kansio on varalla, joten palvelin ei koskaan jää ilman projektia.
  • Kansion avaaminen tiedoston jälkeen toimii. Palvelimille, jotka ymmärtävät työtilan kansiomuutokset, kerrotaan uudesta kansiosta; loput käynnistetään uudelleen, ja avoimet asiakirjasi ilmoitetaan niille uudelleen automaattisesti. Käsin tehtävää uudelleenkäynnistystä ei tarvita.

Vianetsintä

Oire Mitä tarkistaa
LSP:-osio ei koskaan ilmesty Mikään palvelinmääritys ei vaadi tämän tiedoston päätettä. Katso mikä palvelin palvelee mitäkin tiedostoa tai lisää määritys.
· server not responding Palvelin on lakannut vastaamasta. Käytä komentoa Näytä kielipalvelimen loki ja sitten Käynnistä kielipalvelimet uudelleen.
✗ kielelle, jolle asensit palvelimen Varmista, että ohjelma on todella siellä: where clangd (Windows) / which clangd (macOS, Linux). Käytä sitten komentoa Haku ▸ Koodinavigointi ▸ Käynnistä kielipalvelimet uudelleen, joka ajaa koko haun uudelleen.
⚠ Palvelin käynnistyi ja kaatui sitten toistuvasti. Näytä kielipalvelimen loki nimeää yleensä syyn; korjaa se ja käytä sitten komentoa Käynnistä kielipalvelimet uudelleen.
· no compile database C/C++-projektissa Katso yltä. Etsi viittaukset ja Nimeä uudelleen näkevät vain avoimen tiedoston, kunnes se on korjattu.
Täydennys ei palauta mitään yhdessä C++-tiedostossa Tuo tiedosto puuttuu todennäköisesti tiedostosta compile_commands.json (otsikkotiedosto, jota mikään käännösyksikkö ei sisällytä, tai tiedosto, joka on lisätty tietokannan luonnin jälkeen). Luo se uudelleen.
Kaikki toimii päätteestä käynnistettäessä muttei Finderistä Ilmoita siitä — kirjautumistulkin PATH-haun on tarkoitus tehdä näistä kahdesta samanlaiset. Näytä kielipalvelimen loki ja diagnostiikkaloki kirjaavat, mistä haettiin.
Palvelin tarvitsee projektitiedoston, jota sinulla ei ole typescript-language-server tarvitsee typescript-paketin, gopls tiedoston go.mod, rust-analyzer tiedoston Cargo.toml ja pyright tiedoston pyrightconfig.json tai pyproject.toml projektinlaajuisia vastauksia varten.

Kielipalvelinasetukset

Asetukset ▸ Kielipalvelin luettelee jokaisen kielen, jolle palvelinmääritys on olemassa. Kieltä kohti voit:

  • Ottaa käyttöön tai poistaa käytöstä palvelimen (käytöstä poistettu kieli ei koskaan käynnistä sellaista).
  • Asettaa nimenomaisen ohjelmapolun (painikkeella Selaa…). Tämä ohitus voittaa yllä kuvatun PATH- ja searchDirs-haun — hyödyllinen, kun palvelin ei ole PATH-muuttujassa tai kun haluat tietyn käännöksen.
  • Lisätä lisäargumentteja, jotka lisätään määrityksen omien perään — esimerkiksi --log=verbose clangdille. Rivi pilkotaan kuten komentorivi, joten laita lainausmerkit arvon ympärille, joka sisältää välilyöntejä.

Polkukenttä on polku eikä komentorivi

Jos kirjoitat C:\tools\clangd.exe --log=verbose kenttään Ohjelman polku, pyydät OctoEditiä etsimään tiedostoa, jonka nimi päättyy merkkijonoon .exe --log=verbose, ja sellaista ei ole — kieli ilmoittaa silloin, ettei palvelinta ole lainkaan. Laita ohjelma polkukenttään ja sen argumentit kenttään Lisäargumentit. Jos niin silti käy, diagnostiikkaloki kertoo sen suoraan.

Muutokset tulevat voimaan, kun painat OK / Ota käyttöön: jos jokin käyttöönottolippu tai polku todella muuttui, palvelimet käynnistetään uudelleen uusilla asetuksilla automaattisesti (koskematon sivu ei koskaan häiritse käynnissä olevia palvelimia). Painike Skannaa uudelleen / käynnistä palvelimet uudelleen pakottaa lisäksi purkamisen ja uuden etsinnän nykyisillä asetuksilla — hyödyllinen sellaisen palvelimen asentamisen jälkeen, jota editori ei aiemmin löytänyt, ja se myös nollaa kaatumisen uudelleenkäynnistysbudjetin.

Avaa käyttäjän palvelinmääritysten kansio luo ja avaa sen kansion, joka on kuvattu kohdassa Omat palvelinmäärityksesi.

Rajoitukset

  • Koodin värjäystä osoitusponnahdusikkunoiden sisällä ei sovelleta (teksti muotoillaan — lihavointi, otsikot, tasalevyinen koodi — mutta sitä ei syntaksivärjätä).
  • Tarkkuus riippuu palvelimesta: C/C++:n osalta clangd turvautuu ilman compile_commands.json-tiedostoa heuristiikkaan ja tulokset voivat olla puutteellisia.
  • OctoEdit ei koskaan asenna tai lataa palvelinta. Se löytää asentamasi ja käynnistää sen; kun sellaista ei ole, ominaisuus pysyy pimeänä ja tilaosio kertoo siitä.
  • Yksi palvelinprosessi kieltä kohti, jaettuna jokaisen tuon kielen avoimen projektin kesken. Toinen projekti lisätään työtilakansiona, kun palvelin tukee sitä; muutoin sitä palvellaan ensimmäisen projektin juuren alla.
  • Kotlin, Swift ja Objective-C saavat koodiälyä mutta ei syntaksivärjäystä — editorilla ei ole niille vielä värjääjää. Nämä kaksi ovat nyt riippumattomia, joten palvelin toimii siitä huolimatta.
  • Palvelinmääritykset luetaan kerran käynnistyksessä; niiden muokkaaminen (omiesi tai mukana tulevien) vaatii editorin uudelleenkäynnistyksen.