Sainkohan viimein otettua niskastani kiinni ja setvimään Vim-hakemiston sotkuja kuntoon. Henkilökohtainen ~/.vim
-hakemistoni ei toki ole suurin kaikista, mutta kun näyttää siltä, että se vain tulee kasvamaan, jotain tolkkua olisi hyvä saada aikaiseksi.
.vim
-hakemiston rakenne
Lyhyesti siellä on vastaava hakemistorakenne kuin globaalissa /usr/share/vim/
-säilöntäpaikassa. Löytyy seuraavanlaisia hakemistoja:
alihakemisto | sisältö |
---|---|
after | muiden skriptien jälkeen ajettavia loppusilauksia |
autoload | skriptejä, jotka ladataan vimin käynnistyessä |
colors | väriteemat |
compiler | compiler-skriptit: mitä tehdään komennosta :make |
doc | skriptien ohjetiedostoja |
ftdetect | tunnista tiedostot sisällön perusteella tai muuten |
ftplugin | Tärkein: tiedostotyyppikohtaisia plugineita ja asetuksia |
indent | Sisennysfunktioita |
plugin | Tavallisia yleiskäyttöisiä plugineita. Ajetaan sisään aina |
spell | Kielioppeja ja sanastoja |
syntax | Syntaksivärjäystä tyypeille |
Vaikka rakenne on aika hyvä ja modulaarinen, tapahtuu tietynlaista pirstaloitumista välttämättä tärkeissä hakemistoissa plugin
ja sitä rataa. Jos haluaisin tehdä hienon kirjaston C-kielelle, pitäisi lisätä värjäykset syntax
-hakemistoon, sisennyssäännöt indent
-hakemistoon, ftdetect
iin tietysti jonkinlainen tunnistus vaikka tiedostopäätteen perusteella. Hakemistoon ftplugin
sitten haluamat omnicompletion-skriptit. Homma menee pitkälti nätisti, mutta jossain vaiheessa voi paukahtaa. Skriptien nimet eivät välttämättä ole selkeitä, ja plugin
täyttyy omituisista ja epäselvistä tiedostoista.
Totta puhuen, aloitin tämän jutun kirjoittamisen sillä toivolla, että saisin tämän tehtyäkin. Mutta ensin kirjoitan vimin oletushakemistorakenteesta ja se näyttää niin luontevalta.
Sitten onneksi tarkastelen asiaa käytännössä:
~/.vim % ls ftplugin -F1 |columns -W 60 -c 2 clojure/ clojure_lib/ clojure.vim cpp.vim gentoo-package-commons.vim gentoo-package-keywords.vim gentoo-package-mask.vim gentoo-package-use.vim help.vim html_snip_helper.vim html.vim java.vim tex/ tex.vim xml.vim
Mitä ihmettä täällä tapahtuu? Erilaisia skriptejä. No, ainakin useimmat skripteistä ovat melko helposti näkyvillä: nimet ovat loogisia. Esimerkiksi java.vim
asettaa pari helpottavaa lyhennettä Java-koodeille ja sitä rataa. Mutta sitten on haasteellisia ratkaisuja. Clojuren pluginit ovat niin massiivisia (VimClojure on upea paketti) että niitä on turha sulloa yhteen pakkaukseen. Käy sitten näin, että Clojure rohmuaa useita hakemistoja.
Hieman helpottaa se seikka, että teoriassa ftpluginin alle voi tehdä alihakemistoja, joihin voi koota skriptejä. Mutta se ei aina toimi, kuten ylläkin näkee. Se on ehkä toiminut tex
in kanssa, mutta syystä tahi toisesta Clojure ei ole sopinut sellaiseen asetelmaan. Teoriassa ihana, (vaikka sittenkin yksittäiset kielipaketit pirstaloituvat eri paikkoihin hakemistorakenteessa) mutta käytännössä ei vain toimi sekään vähä.
Pathogen
Ennen kuin upea ftplugin
kehitettiin, Vim oli kaukana siitä idealista, mihin Emacs tähtäsi jo alussa. Oli vain globaaleja asetuksia ja käytännössä vaati rankkaa kikkailua saada automaattinen asetustenhaistelu vaikkapa Pythonin koodaamista varten. Nyt meillä on kaksikko ftplugin
ja ftdetect
, jotka mahdollistavat modulaarisen tiedostotyypin haistelun ja sitä myöten vain sille tiedostotyypille ominaiset asetukset. Oikein kirjoitettuna nämä asetukset pysyvät yhdessä bufferissa, ja täten ftplugin
vastaa lähes täysin samaa, mitä Emacsin ‘‘major modet’‘ saavuttivat. Ennen tätä asiaa ei mielestäni ollut järkevää vertailla Vimiä ja Emacsia ominaisuuksien puolesta: Emacs yksinkertaisesti voittaisi. Nykyisin valinta on tiivistynyt pelkkään makuasiaan, kun Emacsin puolelle saa tyydyttävät vi-näppäimet ja Vimin puolella saa pelehtiä tiedostojen kanssa kuten pitääkin saada.
Tutkitaan nyt, miten Pathogen parantaa tilannetta, vai parantaako. Pathogenin GitHub -sivun lisäksi ajattelin kannattavaksi seurata paria blogia, joissa asiaa on käsitelty. Ensin tarkastellaan hyvää blogikirjoitelmaa, jossa asia käydään kattavasti läpi. Jopa minä osaan muuttua tämän avulla!
Ensin siirretään ~/.vim/
pisteettömäksi ja luodaan perusjutut.
~ % mv .vim vim ~ % mkdir .vim ~ % mkdir .vim/autoload
Sitten hankitaan tarvittava skripti, joka on itse onneksi aika pieni ja nätti.
~/.vim/autoload % wget https://github.com/tpope/vim-pathogen/raw/master/autoload/pathogen.vim
Aika orvon näköistä toistaiseksi. Pathogeniä pitää kutsua .vimrc
:stä, joten eikun menoksi. Vim saattaa rääkäistä jotain, mutta sen pitäisi käynnistyä — ilman kaikkia plugineita tosin. Omassa tapauksessani näkyvin puute oli vain väriteeman muuttuminen oletusteemaksi. Oppaan perusteella lisätään siis seuraava rimpsu jonnekin sinne, vaikkapa alkuun:
filetype off call pathogen#helptags() call pathogen#runtime_append_all_bundles()
Voi olla, että minulla homma toimii ilman ylintä riviä, joten alustavasti laitan sen kommentoiduksi. Koskaan ei tiedä.
Seuraava vaihe: luodaan se bundle
-hakemisto (hyvin TextMatemainen termi) .vim
in alle. Done. Ja nyt kai saan luoda itse mielivaltaisia nimiä sinne alle. Tosin, väriteemat pidän erillään. Niitä on aimo liuta sellaisenaan, eikä ole haittaakaan pitää niitä siten. Jos joku tietty teema sitten kaipaisi viimeistelyä, voin sen erikseen siirtää bundleksi. Testiksi otan jotain gitin avulla, esimerkiksi NerdTreen ja Textilen.
Tämähän sujuu vaivattomasti! Esimerkiksi NerdTree ja pari muuta hyödyllistä pluginia:
~/.vim/bundle % git clone "git://github.com/scrooloose/nerdtree.git" ~/.vim/bundle % git clone "git://github.com/msanders/snipmate.vim.git" ~/.vim/bundle % git clone "git://github.com/timcharper/textile.vim.git"
Ja siinä se on! NerdTree toimii nyt kuin aiemminkin. Tietysti kannattaa varoa vähän, sillä vain sanattomasta käytännöstä johtuen jokainen GitHub-projekti vim-plugineihin liittyen alkaa yhdestä hakemistosta edeten.
Mutta työ on vasta aluillaan. Näitä pikkusilppuja on niin paljon, että itse asiassa päädyin melko joustavalta kuulostavaan ratkaisuun. Kaikki yhden tiedoston ihmeet joutavat majailemaan vanhassa rakenteessa, ja kaikki isommat systeemit (sekä ne, jotka on vain vaivaton purkaa suoraan omaan hakemistoonsa) saavat bundle-hakemistosta paikan. En ole vielä päättänyt, miten lajittelen omat häksini.
Ja kun nyt viimein sain työn tehdyksi, tuntuu ihan hyvältä. Nyt on helppoa lisätä uusia, isojakin paketteja systeemiin, ja ne on vastaavasti helppo poistaa sieltä. Esimerkiksi Common Lisp -ympäristöntapaista varten oleva Limp on nyt ainakin turvallisenpuoleinen kokeiltavaksi ilman, että kaikki menee päin puuta. Joitain plugineja heivasin samalla pois, joten kevenemisen tunne on selvä.
Vain nähtäväksi jää, onko tuolla filetypen poistamisella merkittäviä sivuvaikutuksia missään. Toivottavasti ei. Regressiotestasin kaikki tärkeimmät pluginit sitä mukaa, ja kaikki ainakin näytti toimivalta, joten ehkäpä olemme selvillä vesillä. Nyt on selkeästi kaikki eroteltuna:
~/.vim/bundle % ls nerdcommenter omat portage-files snipmate.vim textile.vim nerdtree omat-tex screen-and-slime templates vimclojure
Ja loppujen lopuksi ihan hyvä päätös oli tämä Pathogen. Erityisesti suosittelen sitä niille, ketkä eivät ole Vimiä pahemmin itse skriptanneet, ja kaikki on tarvittaessa helppo asentaa uudestaan. Eikun näppäilemisiin.