6. helmikuu 2011, 16:16

Pathogen selvittelemään Vimin plugineita

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, ftdetectiin 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 texin 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) .vimin 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.

Tageja:

---
---

---

Aiheen vierestä