[voikko] Enchantia tukeva oikoluku Emacsille - ja vähän muutakin

Teemu Likonen tlikonen at iki.fi
Fri May 15 14:52:38 EEST 2009


Olen viime aikoina askarrellut Emacs Lisp -kielen kanssa ja väsännyt
Emacsille oikolukuohjelman, joka tukee hyvin Enchant-oikolukua.
Oikeastaan se tukee mitä tahansa ulkoista ohjelmaa, jonka kanssa voi
kommunikoida putkien avulla.

Motiivina tähän on ollut se tyypillinen: tyytymättömyys olemassa oleviin
ratkaisuihin. Emacsin mukana tuleva flyspell-mode on aika hidas enkä ole
saanut sitä kunnolla toimimaan Enchantin kanssa. Flyspell-toteutus on
kiinteästi sidottu Ispellin ominaisuuksiin. Hannu muistaakseni on
käyttänyt sitä Aspellin kanssa jonkinlaisella menestyksellä (?).

On olemassa myös Speck-niminen[1] oikoluku, speck-mode. Se toimii
nopeammin ja on mukavampi käyttää, mutta valitettavasti sekin on niin
Ispelliin ja Aspelliin sidottu, että en ole saanut sitä Enchantin kanssa
toimimaan lainkaan. Tmispellin kanssa se toimii. Speck-moden tekijää
yritin viime syksynä houkutella lisäämään tuen Enchantille mutta ei hän
innostunut. Hän taisi olla pääasiassa Windows-käyttäjä.

Tein sitten oman systeemin nimeltä wcheck-mode (word check -tila),
joka toimii nopeasti ja jonka saa helposti toimimaan suunnilleen minkä
tahansa ohjelman kanssa. Koodi on tämän viestin liitteenä. Kyseessä on
ensimmäinen toimiva *prototyyppi*.

Wcheck-mode on puskurikohtainen minor-tila, joka kytketään päälle ja
pois päältä Emacsista tuttuun tapaan:

    M-x wcheck-mode

       (Niin, tietysti koodi pitää ladata muistiin ensin. Jos Emacs ei
        ole tuttu, niin helpoimmin ohjelmaa pääsee testaamaan lataamalla
        tiedoston wcheck-mode.el Emacsiin ja ajamalla komento "M-x
        eval-buffer".)

Komennolla "M-x wcheck-change-language" vaihdetaan kieltä
(TAB-näppäimellä voi täydentää ja katsoa sallitut vaihtoehdot).

Käytännössä edellä mainitut komennot kannattaa varmaankin kytkeä
johonkin näppäinkomentoon, jotta käyttö on nopeampaa. Esimerkiksi näin:

    (global-set-key [f7] 'wcheck-mode)
    (global-set-key [f8] 'wcheck-change-language)

Käytetyt kielet ja niiden asetukset täytyy määrittää erikseen. Aion
tehdä sitä varten toiminnon Emacsin customize-järjestelmään, mutta
toistaiseksi asetukset pitää tehdä suoraan muuttujan
wcheck-language-data avulla. Se on ns. association lista, jonka
oletusarvoksi on määritelty seuraava:

    (defvar wcheck-language-data
      '(("suomi" . ((program . "/usr/bin/enchant")
                    (args . "-l -d fi_FI")))
        ("amerikanenglanti" . ((program . "/usr/bin/enchant")
                               (args . "-l -d en_US")))
        ("brittienglanti" . ((program . "/usr/bin/enchant")
                             (args . "-l -d en_GB")))
        ("cat" . ((program . "/bin/cat"))))
      "Tiedot eri kielistä")

Oletuksena on siis määritelty - ainakin nyt testausvaiheessa - kielet
suomi, amerikanenglanti, brittienglanti ja cat. Kullekin määritellään
oma ulkoinen ohjelmansa ja sen parametrit. Ohjelmaksi käy mikä hyvänsä
ajettava ohjelma, joka ottaa putkea pitkin vastaan sanoja - yksi aina
rivillään - ja tulostaa sanat, jotka halutaan merkata Emacsissa
virheellisiksi.

Kuten yllä olevassa oletusasetusten määrittelystä näkyy, cat-niminen
kieli (?) käyttää "oikolukuun" ohjelmaa /bin/cat eli käytännössä sen
avulla merkataan kaikki sanat. Jos haluaa oikolukea esimerkiksi suomeksi
kirjoitettua LaTeX-dokumenttia, voi määritellä vaikkapa kielen nimeltä
"suomi-latex" ja sen ohjelmaksi "/usr/bin/tmispell" ja komennon
valitsimiksi "-t -l -d suomi".


                                 * * *


Oikeastaan wheck-mode ei ole pelkkä oikolukuohjelma vaan yleinen sanojen
merkkausohjelma, joka käyttää ulkoista suodatinohjelmaa. Tästä syystä
nimesin ohjelman Word Check -tilaksi ja tarkoitukseni onkin pysytellä
näin yleisellä tasolla ja antaa käyttäjälle vapautta. Tehköön käyttäjä
vaikka omat Bash-skriptinsä, joilla oikoluetaan tai suodatetaan tekstiä.

Kielikohtaisesti voi määritellä säännölliset lausekkeet sekä Emacsin ns.
syntax-taulukon, joiden mukaan sanoja tai tekstiä luetaan Emacsin
puskurista. Yleisellä tasolla kyse ei oikeastaan ole edes sanoista vaan
mistä tahansa merkkijonoista, joita halutaan ulkoisen ohjelman avulla
suodattaa ja sen perusteella merkitä Emacsin puskurissa.
Kielikohtaisesti voi myös valita Emacsin "facen" eli sen, millä tavalla
minkäkin kielen sanat merkitään puskurissa. Oletuksena on
oikolukuohjelmista tuttu punainen alleviivaus. Näihin tarkempiin
asetuksiin ei käyttäjän välttämättä tarvitse koskea. Oletusasetukset
ovat oikolukuun sopivat.

Jatkossa aikomuksenani on

  - lisätä customize-systeemit asetuksia varten (esim. "M-x
    customize-group <Enter> wcheck <Enter>")

  - parantaa ohjelmaa siten, että se lukee ja päivittää kaikkien
    näkyvissä olevien ikkunoiden sisällön eikä vain aktiivisen ikkunan

  - kirjoittaa käyttöliittymän ilmoitukset sekä funktioiden ja
    muuttujien kuvaukset englanniksi ja nykyistä huolellisemmin

  - laittaa mahdollisesti ohjelma saataville Emacswikiin

  - siirtää mahdollisesti kehitys Voikon versionhallintaan (miten olisi
    hakemistoon /trunk/tools/emacs?)

  - korjailla bugeja. :-)




---------------
 1. http://www.emacswiki.org/emacs/SpeckMode

-------------- next part --------------
A non-text attachment was scrubbed...
Name: wcheck-mode.el
Type: application/emacs-lisp
Size: 19446 bytes
Desc: not available
URL: <http://lists.puimula.org/pipermail/voikko/attachments/20090515/e44db149/attachment.bin>


More information about the voikko mailing list