Portagen määrittelyjä tulee hienosäädettyä aika ajoin. Monesti package.keywordsia 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.vimgentoo-package-mask.vimgentoo-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!