17. helmikuu 2011, 19:00

Useampi täydennyspainike Irssiin

Tuskailin tässä pienen, mutta merkityksellisen ongelman kanssa: miten irssiin saisi kaksi erilaista täydennystoimintoa. Oletuksenahan vain <Tab> hyväksytään, ja se käy oletuksena irssin omia täydennyksiään, jotka ovat kyllä mainioita. Mutta joskus haluaisi täydennellä muitakin asioita. Kolmannen osapuolen skriptejä on esimerkiksi sanakirjoille ja aiemmin keskustelluille termeille. Ja vain mielikuvitus on rajana sille, mitä voi kirjoittaa täydennysfunktioonsa. Irssiin voi kirjoittaa vähintään yhtä kattavan täydennysfunktion kuin vimin *omni completion*illa on mahdollista saada. En itse jaksanut kirjoittaa omaa täydennystä, mutta esittelen skriptin, jonka avulla käyttäjä voi kutsua irssin sisäänrakennettua täydennystä sekä vapaavalintaisia skriptejään sulassa keskinäisessä sovussa.

Ratkaisu haki muotoaan aika pitkään, koska Irssin monipuolinen signaalijärjestelmä on aika heikosti dokumentoitu. Esimerkiksi signaalien argumentteja muuttaakseen perliksi täytyy käydä irssin lähdepaketeista hakemassa skripti. Heikko dokumentointi, huono homma. Ellei asia olisi ollut supertärkeä1, olisi voinut jäädä tekemättäkin.

Hyödyt

Eli mikä on homman juoni? Mitä käyttäjä hyötyy kahdesta pikanäppäimestä täydennyksiin. No vimiä käyttäneet tietävät (ainakin pitäisi tietää) usean eri kontekstin mukaiset täydennykset ja niiden edut. Irssin kontekstitietäväinen perustäydennys toimii upeasti. Se ainakin osaa

  • Täydentää komentoja /-merkin jälkeen
  • Osaa täydentää komentoja /help -komennon perään
  • Osaa hakea tiedostonimiä /dcc -sendeihin ja esimerkiksi /script load -syötteiksi
  • Täydentää tietenkin nimimerkit,
    • … pilkun kanssa, jos nimimerkki tulee rivin alkuun
    • .. ilman pilkkua, jos nimimerkin täydentää keskelle riviä
  • Täydentää kanavanimet
  • Hakee topic-nimet täydennyksellä

Se on uskomaton skripti, ja toimii kivasti. En ole uskaltanut katsoa sen täyttä toteutusta kuitenkaan. Tiedä, minkälaista makaronia tulee putkesta ulos. Mutta kaikesta tuosta huolimatta se voisi täydentää enemmänkin. Pitkiä sanoja, joita ei jaksaisi kirjoittaa alusta loppuun uudestaan. Ja kopypaste on hidasta. Useimmat tyytyvät mainitsemaan pitkän termin kertaalleen ja sitten käyttämään lyhenteitä, mutta vim-käyttäjät tietävät täydennyksen päälle.

Ja valmisskriptit, mitä ne tekevät yleensä? Ei niillä ole muita vaihtoehtoja kuin heittäytyä irssi-signaalien jatkoksi, etteivät häiritsisi vakiotäydennystä. Mutta hyödyt katoavat nopeasti olemattomiin, jos en saa täydennettyä jotain sanoja sen takia, kun jonkun käyttäjän nimimerkki syöksyy siihen eteen. Järkevin ratkaisu on saada vim-henkisesti määritellä useita eri näppäimiä eri täydennyksille. Irssin suunnittelussa ei ole otettu tätä vaihtoehtoa vastaan, joten kohtalaisen yritys-erehdys -lenkin jälkeen sain tuloksena toimivan ratkaisun!

sub sig_choose_completion {
    my ($complist, $window, $word, $linestart, $want_space) = @_;
    return unless Irssi::settings_get_bool("omni_completion");

    (&{'Irssi::Script::irccomplete::sig_complete'}
        ($complist, $window, $word, $linestart, $want_space));
    Irssi::signal_stop();
}

# complete_words gets triggered by user-specified key press. Example usage:
# /bind ^N /omni_complete
sub complete_words {
    Irssi::settings_set_bool("omni_completion", 1);
    Irssi::signal_emit("gui key pressed", 9); # tab
    Irssi::settings_set_bool("omni_completion", 0);
}

Irssi::command_bind("omni_complete", \&complete_words, "completion");
Irssi::settings_add_bool ("Completion", "omni_completion", 0);
Irssi::signal_add_first 'complete word' => \&sig_choose_completion;

Lyhyt jööti perliä. Häksäily tapahtuu uuden asetuksen omni_completion totuusarvon lukemisen avulla. Se ei ole käyttäjän käytettäväksi oleva asetus (ehkä siis olisi riittänyt kirjoittaa staattinen muuttuja, en tiedä). Mutta tämän ansiosta voin käyttää tabia kaikkeen tavalliseen irssin tarjoamaan täydentelyyn, ja mielivaltaista näppäintä painettaessa kelpaa sitten käyttäjän määrittelemä täydennysfunktio. Toteutussyistä asia piti tehdä näin: vain nappaamalla signaalin "complete word" saa täydentäjäfunktio kaiken tarpeellisen tiedon. Sen tähden skriptissäni pitää tehdä ja rekisteröidä uusi komento, joka lähettää (luojan kiitos tälle löytyi oma signaali) näppäinpainalluksen, eli käytännössä kutsuu ylempää subia. Mutta irssi täyttää puuttuvat tiedot siinä matkalla. Pelkän komennon /omni_complete kutsuminen riviltä ei auta ketään, mutta tämänpä pystyy nätisti asettamaan haluamansa näppäimen taakse. Minä olen vimistinä valinnut <C-n> -painikkeen; täydennysskriptikseni sitten vastaavan “buffer complete” -toimintoa vastaavan viritelmän. Se osaa jopa kuulema korjata typot tilastojen perusteella. Saa nähdä, toimiiko riittävän hyvin.

Mutta homma toimii. Ja toivon, että joku muukin saa iloa siitä. Eräs suurimmista irssin ongelmista2 on tällä erää korjattu.

1 Huvittavintahan tässä on, että tällä kikkailulla sain käytännössä en yhtään käytännön hyötyjä, koska irkkaan niin vähän ja vähillä kanavilla.

2 Keskustelu tuppaa puutteellisten tekstieditointityökalujen takia muuttumaan kohti puhekielistä. Jos nyt voi kirjoittaa nättejä täydennysfunktioita vaikka siteeraamaan lakikirjaa hakusanojen avulla sulavasti keskustelun ohessa, niin kyllä se parantaa maailmaa ainakin hitusen.

Tageja: , ,

---
---

---

Aiheen vierestä