5. toukokuu 2011, 12:04

Täydennä portage-paketteja vimissä

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.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!

Tageja: , ,

---
---

---

Aiheen vierestä