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:
| 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:
- pyright (
pyright-langserver) kokeillaan ensin. Se on npm-paketti, joten se vaatii Node.js:n:npm i -g pyright. - 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:
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 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ä:
- nimenomaista polkua, jonka asetit asetuksissa — se on ratkaiseva: jos se ei ratkea, kieli pysyy pimeänä sen sijaan että turvautuisi hiljaisesti johonkin muuhun;
PATH-muuttujaasi, palvelimen komennon ja kunkin tunnetun aliaksen osalta (clangd-20,clangd-19…);- palvelimen määrityksessä olevia asennuspaikkoja käyttöjärjestelmällesi;
- 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.jsonprojektin 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.txtprojektin 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:
.mte-compile-commands/on yksi niistä hakemistoista, joita MTE käy läpi, joten syntyväcompile_commands.jsonlö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 (kutenQT6_DIRQt-projektille). Joscmakeei 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}"
}
languageon OctoEditin oma tunniste kielelle — se avain, jonka mukaan asetussivu, tilaosio ja yhteys ryhmitellään.command/aliasesovat ne ohjelmanimet, joitaPATH-muuttujasta kokeillaan.extensionson ensisijainen tiedosto–kieli-kuvaus (katso yltä). Ota piste mukaan.argson 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 palvelimelledidOpen-viestissä; oletuksena se onlanguage. Käytä sitä, kun LSP-spesifikaation nimi eroaa omastamme (bash→shellscript,objc→objective-c).languageIds(valinnainen) ohittaa arvonlanguageIdpää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 lukeeei <first marker>; se ei koskaan pysäytä palvelinta.searchDirson Windowsin asennuspaikkaluettelo;searchDirsMacjasearchDirsLinuxovat 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.argsvoi 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 tiedostooncompile_commands.json.priority(valinnainen, oletus0) 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
Jokainen siellä oleva *.json ladataan mukana tulevan joukon jälkeen, ja:
- tiedosto, jonka
languagejacommandvastaavat 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).
{
"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,.gitja lopuksi.editorconfig, joka ilmoittaaroot = 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- jasearchDirs-haun — hyödyllinen, kun palvelin ei olePATH-muuttujassa tai kun haluat tietyn käännöksen. - Lisätä lisäargumentteja, jotka lisätään määrityksen omien perään — esimerkiksi
--log=verboseclangdille. 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.