Portagen määrittelyjä tulee hienosäädettyä aika ajoin. Monesti package.keywords
ia tulee käsiteltyä echottamalla, mutta monesti myös vimillä. Ja olisihan se kivaa, jos paketteja ei tarvitsisi itse tavata tai kopypastetella muualta. Aikoinaan aloittamani täydennysskripti valmistui tänään, kun sain kipinän sen toiminnan toteuttamiseen. Toteutus seuraa.
Koodia:
function! CompletePortagePackages(findstart, base) " findstart == 1 when this is called for the first time if a:findstart let line = getline('.') let start = col('.') - 1 while start > 0 && line[start - 1] =~ '[a-z-/]' let start -= 1 endwhile return start else " let's just make the whole list because it just works " can be a bit slow so be warned let candidates = [] let packages = split(system("find /usr/portage -mindepth 0 -maxdepth 2". \ " -type d -wholename '*portage/".a:base."*'"), '\n') for pack in packages let pack = substitute(pack, "^.*portage/", "", "") "if pack =~ '^' . a:base call add(candidates, pack) "endif endfor return candidates endif endfun set omnifunc=CompletePortagePackages
Viimeinen rivi määrää tämän funktion omnitäydentäjäksi. Olisin tehnyt kyllä hienomman, mutta taidot eivät vain riitä. Koko ydin lepää find
-ohjelman tulosteissa. Haemme vain hakemistoja, joten se on kyllä loppupeleissä aika nopea (mutta SSD-levyltä kaikki on).
Koodi on aika purkkaa, ja siinä on kovakoodattuja vakioita. Mutta semmoista se on joskus. Joskus tuota voisi lähteä täydentämään siten, että se ottaa overlayt mukaan tarkasteluihin. Pelkkä portage on toki alustavasti hyvä aloitus.
Asennus
Gentoon mukana tuleva vim-asennus sisältää tarvittavat ftdetect
-tiedostot, eli Vimin pitäisi tunnistaa /etc/portage/
-hakemiston package-tiedostot suoraan. Enää tarvitsemme varsinaiset pluginit, joita vim kutsuu heti tunnistettuaan tiedostot. Ylläoleva koodi menee sellaisenaan omaan .vim/ftplugin
-hakemistoon. Nimi olkoon vaikka gentoo-package-commons.vim
. Muut tiedostot ovat
gentoo-package-keywords.vim
gentoo-package-mask.vim
gentoo-package-use.vim
(Ja niin edelleen muille,) ja niiden kaikkien sisältö on seuraava:
execute "so ". expand("<sfile>:p:h") ."/gentoo-package-commons.vim"
Olettaen, että kaikki on samassa hakemistossa. Ja hyvin näyttää toimivan!