Nopeat kirjanmerkit Emacsille
Tänään aamulla minulle syntyi visio Emacs-skriptistä, joka toisi
Vimperator-henkiset kirjanmerkit Emacsiin. Panin asiasta merkinnän
org
-kalenteriini ja jatkoin sitten päivän pakottavammissa
askareissa.
Sitten iltapäivästä asia tuli yhä uudestaan ja uudestaan mieleen, ja ei siinä muu auttanut kuin aloittaa koodaaminen. Syntyi tuloksena progomarks-niminen unix-filosofisella näkemyksellä.
Tässä työssä on paljon kaunista. Ehkä sikäli, kun allapiilevä mekanismi on todella yksinkertainen ja toimiva. Erityisesti kaikki näyttää kauniilta, kun tunnun tulleen siihen pisteeseen, että Emacsia voi lähteä laajentamaan ihan noin vain, jos jotain tuntuu puuttuvan. Tähän tilaan pääsy veikin noin 8 kuukautta, mutta kyllä se kannatti.
Perusidea
Usein koluttuihin tiedostoihin tahtoisi päästä nopeasti. Emacsin olemassaolevat kirjanmerkkiratkaisut eivät näyttäneet äkkiseltään katsoen sisältävän muuta kuin nuolinäppäimiä ja perusliikkumakomentoja: käytännössä siis suunniteltu isojen kirjanmerkkimäärien hallinnointiin, joista haetaan sitten hakutoiminnoin.
Minulla oli tausta-ajatuksena saada pari kiperässä paikassa
lymyävää, mutta usein käytettyä tiedostoa helposti saataville.
Tiedostoja tulisi olemaan siis kohtuullisen vähän näkyvillä. Ja
niihin pääsee hyppimään nopeasti Vimperatorista tutuilla
aakkoslyhenteillä. Ohessa esimerkki ruudulle aukeavasta näkymästä,
kun progomarks
aktivoidaan:
Progomarks ---------- j SPC /home/progo/.emacs.d/progomarks k SPC /home/progo/kurssit/nyk/oht/oht-s4.org l SPC /home/progo/LoremIpsum.txt f SPC /home/progo/dokumentit/Runo.txt a SPC /home/progo/koodi/mpyd/DB.py kj SPC /home/progo/koodi/progomarks/progomarks.el kk SPC /home/progo/LoremIpsum.txt kl SPC /home/progo/dokumentit/blog/blog.org
Nyt riittää painaa j <SPC>
, niin progomarks
-tiedosto aukeaa.
Jos tämän progomarks
-komennon itsensä asettaa nätin
näppäinyhdistelmän taakse, niin usein haluttuihin tiedostoihin
pääsee hyppimään nopeasti. Minä heitin sen kokeeksi
@<code>,fb@</code>-yhdistelmän taakse.
Toinen tarvittava "julkinen" funktio on
progomarks-mark-current-file
, jolla avoinna oleva tiedosto
ympätään kirjanmerkkilistan perälle. Itse lista säilyy tiedostossa
ja sisältää äärisimppelisti yhden URI:n per rivi. Sitä tiedostoa
saa sitten itse editoida ja mukauttaa järjestystä, jos näin
tahtoo.
Itse koodi
Koodi on Githubissa. Siitä on paha sanoa mitään tässä kohtaa, muuta kuin että se on todennäköisesti melko idiomaattista Elispiä suurimmalti osin. Emacs Wikin Elisp-keittokirjaa pläränneenä ja tämänkin paketin koodanneena olen tehnyt muutamia huomioita:
- Elispissä ja Emacsissa ylipäätään kaikenlainen tiedostojen lukeminen ja kirjoittaminen tehdään lukemalla tiedoston sisältö väliaikaisiin (ja käyttäjältä näkymättömiin) puskureihin, joissa sitten käytetään tavallisia Emacs-komentoja editointiin. Lopuksi tallennetaan koko roska takaisin.
- Emacs-sovellukset (kuten Viminkin vastaavat) kirjoitetaan luonnollisesti "virtuaalisiksi" puskureiksi, eli puskureiksi, joilla ei ole tiedostoa taustalla. Tässä kohtaa Emacs (ja Vim) todella ovat löytäneet juuri oikean abstraktion. Avonaisten puskurien ei tarvitsekaan kuvata oikeita tiedostoja pohjalla. Riittää vain, että kirjoitellaan tekstiä puskuriin, tehdään sopivat näppäinoikotiet saataville ja paiskataan kaikki käyttäjän naamalle. Kaikki on tekstiä ja temppitiedostoja ei tarvitse pyöritellä systeemissä.
- Emacsin paketointisysteemi on kevyt ja toimiva. Ei tarvita
turhia alkujulistuksia, vain
(provide ...)
-lauseke tiedoston (mielellään) lopussa. Paketti ladataan sitten(require ...)
-makrolla käyttöön ja Emacs etsii tiedostonimellä latauspoluistaan sopivannimisiä tiedostoja ja lukee niitä. - Lispinä Elisp on toki mukavaa ja ilmaisuvoimaista sellaisenaankin, mutta funktionaalista ei missään tapauksessa. Erilaiset silmukat jylläävät pitäjää ja muuttujia päivitellään tuon tuosta. Jopa sulkeumia minun piti etsiä oikein työtä tehden, ja ne lopulta löytyivät uuden Emacsin kokeellisista lisäosista. No, hyvä että löytyivät kuitenkin.
Sulkeumia oli kiva käyttää tässä(kin) ongelmassa: kun määränä oli rakentaa lennosta erilaisia näppäinyhdistelmiä bindattavaksi samantapaisiin funktioihin, niin rakensin kullekin yhdistelmälle sulkeuman avulla nolla-argumenttisen funktion, joka avaa juuri halutun tiedoston.