Huom. ei kehdattu laittaa kaikkia sivuja paperille taittajan hermojen ja toimitusbudun säästämiseksi. Tässä kokopitkä tutkielma, kun paperilla oli vaan tiivistelmä.

Kultaisen Tomaatin toimitus on joustava ja avaramielinen, joten tuleepa eri lehtiin testattua kaikenlaista kontroversiaalista täysin puolueettomasti. Jokin akuutti mielenhäiriö sai kirjoittamaan artikkeli-ideamuistilistaan tälläisen typeryyden, ja tässä sitä nyt ollaan. Vaikka KAIKKI natiiviohjelmoijat tietävät, että koodia ei todellakaan kirjoteta muuta ku VIMILLÄ tai suoraan reikäkorteille ja Kukkokin on ehtiny VAROITTAA tästä LISP-PELLEJEN keksinnöstä koska sen broidi oli kerran saanu TOSI PAHAN JÄNNETUPPITULEHDUKSEN 1, toimitus pani nyrjähdyksensuojahansikkaat ranteisiin ja siirtyi etsimään Amazonista ctrl-shift-meta-super-hyper-polkimia 2. On aika testata GNU Emacs. (IDEt ja Atom-Sublime-akselin hipsterisaatiot jätetään omaan arvoonsa.)

Johdanto

learning curves Emacsin oppimiskäyrä ei noudata lakeja. Kuva mistä lie.

Tätä artsua lukiessa kannattaa avata virallinen refcard.pdf-niminen cheat sheet 3. Ensin se tärkein: näppäinyhdistelmä ctrl-x ctrl-c, eli Emacs-kielellä “C-x C-c” sulkee Emacsin, sillä mitäpä muuta sillä haluaisi tehdä kuin poistua jotta voisi avata tilalle Vimin. Onneksi tutoriaalikin mainitsee tämän oikotien heti alussa, sekä sen conclusionkin muistuttaa tuosta. Pastetaan sisäänrakennetusta tutosta vähän tekstiä:

Emacs commands generally involve the CONTROL key (sometimes labeled
CTRL or CTL) or the META key (sometimes labeled EDIT or ALT).  Rather than
write that in full each time, we'll use the following abbreviations:

 C-<chr>  means hold the CONTROL key while typing the character <chr>
      Thus, C-f would be: hold the CONTROL key and type f.
 M-<chr>  means hold the META or EDIT or ALT key down while typing <chr>.
      If there is no META, EDIT or ALT key, instead press and release the
      ESC key and then type <chr>.  We write <ESC> for the ESC key.

Important note: to end the Emacs session, type C-x C-c.  (Two characters.)
To quit a partially entered command, type C-g.

Noita C-M-muotoja käytetään jatkossa tässäkin tekstissä. Välilyönti merkitään <SPC> ja enter eli return <RET>. Tutoriaali ohjeistaa melko alussa käyttämään nuolinappien sijaan naurettavia näppäinkomentoja C-b (back), C-f (forward), C-p (previous row) ja C-n (next row) koska tehokkaampaa. Ei ihmekään että emacsistit kärsivät kroonisesta jännetuppitulehduksesta, kun liikkuakaan ei voi yhdellä nappulalla. Kaikkihan tietävät, että hjkl ovat ainoat oikeat kursorinliikutuspainikkeet 4 vaikkei niitäkään yleensä käytetä kun on parempia liikkeitä. Onneksi hyvällä näppiksellä controlia voi painaa kämmensyrjällä ja peukku taipuu alt-nappiin siedettävästi. Kannattaa harkita controlin bindaamista home rowille caps lockin kohdalle, vaikka caps lockissahan on järkevillä ihmisillä esc, jota tarvitaan Vimiä käyttäessä. Pidempiaikainen Emacsin käyttö johtaa joka tapauksessa valtavaan lihaskehitykseen kämmensyrjän lihaksistossa kasvattaen sen Arnold Schwarzeneggermäiseksi palloksi 5.

Tässä testissä käytetään näppiksen suomileiskaa, vaikka Emacs lienee kohdistettu suunnilleen jenkkilayoutille. Esimerkiksi C-\ on vähän awkward kun tarvitaan Alt Gr:ääkin, mikä lisää sormien nivelvaivoja entisestään.

workflow xkcd #1172

Sisäänrakennettu tutoriaali (C-h t) on oivallinen alku kelle tahansa, joka tarvitsee editoria. Välillä tulee olo, että tämä rätkytin vähättelee lukijan älyä, sillä mm. tiedostoista sanotaan etteivät muutokset säily ellei niitä tallenna. Ehkä joskus muinoin asia oli toisin ja tästä täytyy huomauttaa erikseen. Toisaalta tälläisen tutoriaalin ymmärtäisi varmaan oma isoäitikin joka nykyään korkeintaan käyttää jaettuja pilvipalvelu-docs-hömpötyksiä, jotka tallentavat jatkuvasti sinne pilveen jonkun muun tietokoneelle.

Tuto ei kuitenkaan kannusta kirjoittamaan välittömästi Emacs Lispiä (“Elisp”), jolla editoria voi kustomoida ja laajentaa rajattomasti 6. Ympäri maailmaa jengi vaikuttaa hehkuttavan juuri laajennettavuutta Emacsin suurimpana vahvuutena, sillä yksinkertaisimmatkin ominaisuudet – kuten yhden kirjaimen sijoittaminen tekstiin – ovat oikeasti tämän Lisp-dialektin koodia, jotka sattuvat defaulttina suorittumaan vastaavaa kirjainta painaessa. Eittämättä softateknisesti nättiä. Mitä tahansa kunnon koodieditoria voi toki konffata ja laajentaa mielin määrin. Jos ei voi, niin editori soveltuu korkeintaan ostoslistan kirjoittamiseen.

Emacsin taustaa

“EMACS - Eight Megs And Constantly Swapping”, sanotaan 7. Tämä ominaisuuksilla ja “ominaisuuksilla” täytetty editori on jo aikojen alusta ollut massiivinen, mikä oli joskus ongelma, kun koneet olivat nuhapumppuja ja ohjelm’loitsijat rautaa. Nykyään likimain kaikki softa on bloattia saastaa ja riviohjelmoijat pullamössöä ja Google Chrome on eight gigs and constantly swapping, eikä haittaa että Emacsin binääri on noin 15 megatavua (vrt. Vim 2.7MB, ed 47KB, ja btw Chrome 115MB) puhumattakaan kaikesta oheishauskasta ja muistinkäytöstä.

Emacs vs Vim -tappelussa ja näppäinvalintoja kritisoidessa jätetään tyypillisesti huomiotta, millaisilla tietokoneilla nuo kuninkaallisten työkalut saivat alkunsa. Emacs syntyi ammoisina Lisp-masiinoiden aikoina, jolloin näppikset tarvitsivat sujuvaan operointiin ainakin neljä kättä 8. Vim-koneessa taas hjkl-nappihatuista löytyi nuolien kuvat eikä erillisiä nuolinappeja ollut. Spacecadetissa eli Lisp-näppiksessä modifierien pinta-ala on suunnilleen sama kuin aakkosten 9. Nykynäppikset ovat niin erilaisia, että control-kramppi on ihan asiallinen puheenaihe 10. Missään ei kuitenkaan sanota, että tätä nimenomaista näppistä olisi Emacsia rakentaessa käytetty. Emacs on varmaan vielä vanhempi.

spacecadet Space-cadet-näppis (kuva: Retro-Computing Society of Rhode Island)

Kuten muillakin moderneilla editoreilla, myös Emacsilla on nykyään aika moderni mainosnettisivu jonka joku teki ihan hiljattain koska pöhinä ja facelift otettiin ilolla vastaan (mut vaan osittain, eli kun etusivulta klikkailee muualle niin hämmentyy tyylin muuttuessa). 11

Emacs tekstieditorina

Sanotaan, että Emacs on hyvä käyttöjärjestelmä jonka editorissa on kuitenkin parannettavaa. Tutkitaan Emacsin tekstieditointiominaisuuksia.

Esimerkkien vuoksi vertaillaan hieman tätä päristintä aina välillä Vimiin, joka on tunnettu erittäin laadukas tekstieditori. Esitetään tässä muutamat perusasiat. Kustomoitavan editorin kanssa pääsee melkein kuuhun asti, mikä ei tietenkään yksiin GT-kansiin mahtuisi.

Ei me hirveästi tätä ehditty konffata vaikka eihän mitään epätriviaalia softaa tulisi oletussäädöillä käyttää. (Korollaari: jos epätriviaalissa softassa ei ole säätöjä, se on käyttökelvoton.) Toisaalta kaikilla on omat tottumuksensa eli oletussäädöt olkoot kompromissi. Yllättävän käytettävä silti ihan out-of-the-box vs. vaikka vim, mutta tästä toki puuttuu ne vim-keybindingit defaulttina, jotka tekisivät editoimisesta vieläkin käyttiksempää. Huomio kun tuo ylläoleva tutoriaaliteksti ei sitä tarpeeksi painottanut: C-g vastaa sitä mitä esc yleensä tekee Vimissä tai ylipäänsä missään muualla.

Emacs vs Vim -battleissa yleensä huomautetaan, että Emacsia on helppo käyttää koska siinä ei ole niitä kaikkia piippaavia modeja. Paskapuhetta. Yhtä laillahan jokainen multichordmodifiersotku on mode: C-x:n näppäilemällä siirtyy hetkellisesti yhteen modeen, M-x:llä toiseen jne. Vimin normalmode vs editmode on rutkasti yksinkertaisempi kuin C-M-Å-dingdong-x-modessa käyminen vähän väliä komentoja suoritettaessa. Toki Vimissäkin napit loppuvat välillä kesken. Jokin <Leader>x on silti mukavampi käsille kuin vaikka C-x. Evil-mode 12 on joku plugaripalikka, jolla saadaan Emacsiin Vim-nappirajapinta. Kokeillaan silti oletus-Emacsia.

Vähän kaikelle on oma “major mode” eli kokoelma asetuksia jonka Emacs valitsee itsestään kun tunnistaa tekstin tyypin bufferissa. Oma mode löytyy mm. monille ohjelmointikielille, diffille, englanninkieliselle tekstille, hakemistolistaukselle (Dired) ja shellille. Kunkin major moden päälle saa sitten lukemattoman määrän erilaisia minor modeja säätämään mm. kaikkea. Esimerkiksi globaali M-x electric-pair-mode on liki pakollinen, sillä noin puolet Emacsin käytöstä on sen kustomointia, ja kustomointi tapahtuu lähinnä Lispillä. Tämä mode syöttää loppusulkeen automaattisesti avaavan sulkeen näppäilyn perään. Toisaalta jos tästä moodista ei tykkää niin ei haittaa, sillä sen saa kustomoitua menemään päälle vain Lisp-buffereissa.

Tutoriaali esittää kaikenlaiset perusasiat, jotka melko lailla sivuutetaan trivialiteetteina. C-c C-x poistuu, C-x C-f avaa tiedoston, C-x C-s tallentaa, nuolinapit tai C-bfpn liikkuu, jne. Kuten muissakin hyvissä tekstieditoreissa ja käyttöjärjestelmissä, Emacsissa tulee onneksi mukana kattava manuaali. “Emacs is an extensible self-documenting editor” 13. C-h k n näyttää manuaalin napille n.

Sanotaan, että koodia luetaan paljon kirjoittamista enemmän, mikä lienee isossa codebasessa aina tottakin. Tästä syystä Vimin kaltainen normal modessa modifiervapaa navigointi 4 on mukavaa sormille. Emacsissa mihin tahansa liikkuminen vaatii control-nappia jos suositeltuja nuolinappikorvikkeita käyttää eli ajatuksena lienee ollut, että oletuksena koodia kirjoitetaan eikä lueta. Monet käyttäjät varmaan suosittelevat ihan epäironisesti tietokoneeseen liitettäviä polkimia validiksi lisälaitteeksi. Control-alt-kukkuu-chordit eivät kyllä ole mitenkään nopeita syöttää eli navigointi on poikkeuksetta hidasta ja poskettoman kömpelöä. Ihan käsittämätön designpäätös, vaikka alkuperäisissä Lisp-näppiksissä control olikin mukavammassa paikassa kuin nykyään 8.

Ihan lokaalisti liikutaan niillä C-bfpn-napeilla. No ne voi unohtaa saman tien. Sana kerrallaan pääsee kulkemaan kun näpyttelee M-f ja M-p (vrt. Vimissä pelkästään w ja b, Notepadissa ctrl-nuolinapit). Page up / page down ovat C-v ja M-v. Kappale eespäin ja taakse M-{ ja M-}. On näissä jotain järkeä. Ohessa vertailutaulukko tiivistämään osviittaa filosofiaeroista.

Liike Emacs Vim
Nuolinapit C-bfpn hjkl
Sana kerrallaan eestaas M-p, M-f w, b
Sivu ylös/alas C-v, M-v C-b, C-f
Tekstikappale eestaas M-{, M-} {, }
Rivin alku/loppu C-a, C-e ^, $
Riville 42 M-g g 42 <RET> 42G (tai :42)

Pidemmälle eestaas pääsee kulkemaan merkistä toiseen (ei kirjain-merkki vaan muistiinpanomerkki); merkin paikka asetetaan C-<SPC>, ja monet komennot jotka hyppäävät pidemmälle asettavat automaattisesti merkin siihen mistä lähdettiin. Merkeistä on 16 entryä pitkä “mark ring”, joissa kuljetaan C-u C-<SPC>. Jos sitten oikeasti haluaa kirjanmerkkejä ympäriinsä, niin “sijaintirekistereihin” voi tallettaa C-x r <SPC> <kirjain> ja rekisteriin hypätään C-x r j <kirjain>. (Vimissähän sijainti merkitään m<kirjain> ja sinne mennään '<kirjain>.) Nämä sijaintirekisterit ovat oiva juttu. Riville nro x hypätään sanomalla M-g g x <RET>, tai eksplisiittisemmin ajamalla makron suoraan M-x goto-line <RET> x <RET>.

Tekstissä siirtyminen on useammin kuin luuleekaan hyvin tehokasta hakua käyttämällä – etsimistyökalu vie täsmälleen siihen kohtaan mitä ajattelee, ja sitä yleensä kannattaa käyttää vaikka kyseessä oleva matka olisi vain tusina nuolinapin painallusta toiseen kohtaan ruudulla. Haun näppäily kun on helposti alle tusina nappia.

Emacsin hakutoiminto maalaa kaikki hakutulokset, joten ne erottaa näppärästi. Haku on inkrementaalinen, eli etsintä toistuu välittömästi sitä mukaa kun hakutekstiä kirjoittaa. C-s hakee eteenpäin, C-r taaksepäin. Aika hyvä jo oletuksena.

Yleinen editointioperaatio on vaihtaa teksti lainausmerkkien, sulkujen tms. sisältä. Tämä yllättäen ei ole sisäänrakennettu ominaisuus, mutta naurettavan kattava expand-region-paketti 14 hoitaa homman. Toimitus jättää lukijan pääteltäväksi, miten erikoinen asia on tuon paketin koko. Onpahan valintamoodi mm. Pythonin multiline-stringeillekin erikseen. Emacsia käyttämällä tosiaan oppinee lukemaan noita Lispin S-expressioneita.

Monista editoreista löytyy ns. block mode jolla voi käpistellä usean rivin tekstejä samalla kertaa, tai vaihtoehtoisesti ns. multicursor mode jolla myös saa kursorin monelle riville mihin vaan ja editti toistuu jokaiselle. Emacsissa on laatikko-operaatioita (“rectangle”). Multicursor-temppu eli joka riville editointi on “yksinkertaisesti” “M-x string-insert-rectangle <RET> teksti tähän <RET>”, onneksi näitä voi tabitäydentää ja/tai mapata itse uudelleen. Laatikkovalintatilaan mennään loitsulla C-x <SPC>.

Buffereita ikkunoissa

Emacs-kielellä auki oleva “editori-ikkunakokonaisuus” on “frame”. Textmodessa samaan termisinstanssiin saa useita frameja, mikä vastaa melko lailla Vimin tabeja jotka jokainen kunnon ihminen varmaan tietää. Jos ei tiedä, niin ei hätää: GT kertoo. Editoitava tekstimötkö on bufferi ja niihin on ikkunanäkymät joita saa frameen splittailtua mielivaltaisesti, kuten Vimissäkin. Emacsin “ikkuna” on framen sisällä oleva laatikko, jossa näkyy yksi bufferi. Sama bufferi voi näkyä eri ikkunoissa, ja joka ikkunalla on oma kursorinsa. Ohessa vertailutaulukko antamaan osviittaa filosofiaeroista.

Editori, joka ei tue tälläistä ruudun splittaamista moneen näkymään, kelpaa korkeintaan ostoslistan kirjoittamiseen. Tätä GT-artsua on luonnosteltu (taittajan hermojen säästämiseksi) Google Docsin editorilla, joka kelpaa niukin naukin sellaisen ostoslistan kirjoittamiseen, joka on niin monimutkainen, että siihen tarvitaan alaotsikoita.

Ikkuna-action Emacs Vim
Siirry seuraavaan C-x o C-w w
Siirry johkin suuntaan C-x windmove-default-keybindings ja shift-nuolet C-w hjkl
Sulje ikkuna C-x 0 C-w q tai :q
Splittaa päällekkäin C-x 2 C-w s tai :sp
Splittaa vierekkäin C-x 3 C-w v tai :vsp
Avaa bufferi foo C-x C-b foo :buf foo

Aiemmin mainittu major-mode-feature on eittämättä hyödykäs. Emacs tosiaan osaa taikatemppuja eri bufferityypeistä; esim. tiedostolistauksesta (Dired) voi editoida tiedostojen nimiä, ja kun listauksen tallentaa niin tiedostojen nimet muuttuvat, mikä on oikeasti erinomainen feature bulk-renameen/poistoon/kaikenlaiseen. Tämä onnistuisi unixmaisemmassa editorissa myös ulkoisten softien ja pienen skriptipulikan kautta; Emacsissa kaikki on sisäänrakennettuna, koska gnu-ukko Stallman ei juuri välitä unix-filosofiasta 15.

Copypaste

Hyvissä editoreissa on voimakas leikepöytätoiminnallisuus. Esimerkiksi Vimissä tekstiä voi tallettaa moniin eri “rekistereihin” joista sitä voi sitten pasteta ympäriinsä. Emacsissa on sille ominainen erikoisuus nimeltä “kill ring”, eli poistettu teksti menee rengaspuskuriin (jonka koko on oletuksena 60), josta voi hakea pastea varten aiempia leikattuja tekstejä mikäli ensimmäinen ei miellytä. C-w on “leikkaa” ja C-y “liimaa” (“yank” - huom, Vimissä yank tarkoittaa kopiointia). M-w vain kopioi. Lisäksi Emacsista löytyy myös tekstirekisterit, joihin kopioidaan näppäilemällä C-x r s <kirjain> ja joista luetaan C-x r i <kirjain>. Jälkimmäinen muoto näyttää avuliaasti rekkarien sisällöt bufferissa joka ilmestyy tyhjästä jos odottaa hetken.

Undo

Nyt täytyy todeta rehellisesti että WTF.

Emacsin editointihistoriapino sisältää myös undot, eli redo-toiminnallisuus tapahtuu editointihistoriassa olevan undon undoamalla 16. Sikäli oikein järkevää, sillä näin mitään ei voi hukkua (vrt. monien muiden editorien undoamisen jälkeen tapahtuvan editoimisen jälkeinen editointipinon katkeaminen, tai Vimin vastaus ongelmaan eli undo tree). Toisaalta redoamisen opetteleminen vaatii vähän aivojen vinksauttamista, sillä undo-moodi pitää ikäänkuin kääntää ylösalaisin (C-g C-/ C-/ …, eli C-/ toistuu per redo kyseisellä kerralla). Toimitus ei ole yksin tämän hämmingin kanssa – jotkut ovat koodanneet vähemmän hämmentävään redoon plugareitakin 17.

Grep

Komennolla M-x grep saa etsittyä tiedostoista asioita, ja tulokset tulevat uuteen bufferiin, jonka major mode on tietenkin joku grep-taikuus. Tuloksien kohdilla voi lyödä enteriä tai hiiren nappia, ja tulos ilmestyy toiseen bufferiin. Näissä bufferimodeissa taitaa olla oikeasti järkeä. Hakutulos on ihan tavallisen grepin tekstituloste, jonka Emacs parsii linkeiksi. Aw yiss.

Syntaksimukavuudet

Emacs tukee kutakuinkin jokaista olemassaolevaa ohjelmointikieltä ja muuta kieltä joko vakiona tai olemassaolevan plugarin kautta. Väriteemoja on tietysti ja säädettävää jokaiseen makuun. Automaattisisennys ja muu sellainen toimii ihan heittämällä. Tab-nappi toimii vähän eri lailla kuin monissa muissa editoreissa: se ei suinkaan sijoita tekstiin tabulaattorimerkkiä vaan sisentää kursorin merkitsemän rivin. Unicode-tuki on. Jne jne.

LaTeXia piirtäessä on käytettävissä melkoinen wysiwyg-moodi AUCTeX:llä. Tekstipohjaisiin tekstieditoreihin tottunut takuulla yllättyy viimeistään siinä vaiheessa, kun tekstin sekaan pulahtaa preview-kuvia kaavoista. 18

AUCTeX rendaa previewit bufferiin sisään (Kuvalähde: AUCTeX:n saitti)

Käyttöfiiliksiä

Yllä analysoitiin hieman Emacsin ominaisuuksia googlauksen, rtfm-prosessin ja ominaisuuksien yksittäin kokeilemisen pohjalta. Toimitus myös ihan oikeasti testasi tätä editoria käyttämällä sitä itse pidempäänkin kaikenlaiseen tekstimuokkailuun.

Tutoriaalin lukemisesta heräsi aika kuumia tunteita – typerällä lörpöttelyllä ei pääse mihinkään ja piti heti googlata cheat sheet. Mieli rauhoittui, kun ihan virallinen refcard löytyi helposti – tässähän on jotain järkeä. Kiva että on vaivauduttu. Näyttää Latexilla taitetulta ja ctrl-nappeja on kulunut tuota tehdessä puhki varmaan noin yksi kappale. Editorin nettisivuilta löytyy myös ihan kiva “tour” muutamien kohokohtien läpikäymiseen 19.

Sitten siihen editoimisen yrittämiseen. Kun lihasmuistista saa totutettua Vain Ihanan Muokkaimen näppäilyt suspendiin, tutut muokkaustavat toimivat tässäkin. C-s / C-r eli hakutyökalu on tehokas tapa liikkua eestaas, tekstiä saa syötettyä, ja lokaatiorekisterit saisi mukaviksi kun vähän konffaisi. Bufferit kun löytyy niin näppäilyn erilaisuudet ovat vain pieni toteutusyksityiskohta; pääasia että olennaiset featuret löytyvät.

Makroja toistuvista asioista tehneenä Emacsinkin makrot vaikuttavat luontevilta. C-x ( ja C-x ) aloittaa ja päättää makron tallennuksen ja C-x e ajaa viimeisimmän. Emacsissa on tavallista mennä siihen M-x-moodiin ja naputella (tabtäydennyksellä) joku sanahirviö, ja tässä auttaa M-x name-last-kbd-macro kun kuitenkin tarvitsee useampaa makroa.

Kaikenlaista edistyneestä editorista oletettavaa löytyy vähemmän yllättäen defaulttina, joista valtaosa on jo mainittu. Triviaa: Komennon kuin komennon saa toistettua prefixaamalla sen C-u:lla ja numerolla. C-M-s käynnistää regex-haun. M-% on search-replace. Regex-replace käynnistyy näppäilemällä M-x replace-regexp <RET>.

Parin GT-artsun Googledocsista prosessointi Markdowniksi GT-Webiä varten saa jo pikkusormen ja kämmensyrjän jomottamaan kummassakin kädessä. (Testataan ihan tavallisella suominäppiksellä tasavertaisuuden vuoksi.) Tositarkoituksella käyttävähän mappaisi controlin capslockiin, harkitsisi polkimia, ja hidastaisi vauhtia.

Emacs IDEnä

IDE eli integrated development environment sisältää kaikenlaisia muita työkaluja pelkän koodieditorin lisäksi. Emacs osaa mm. versionhallinta-, elämänhallinta-, projektinhallinta- ja debuggeri-integraatiot. Käydään läpi muutama suositulta vaikuttava plugarifeature eli läjä elispiä (oiskohan osa näistä sisäänrakennettujakin, mut siinäkin tapauksessa ehkä elispiä).

Versionhallinta

Emacsin oma versionhallintamöystäys 20 on pienin yhteinen nimittäjä monista järjestelmistä. Magit 21 on viimeistellyn oloinen gitti-integraatioplugari, jota ilman Emacsia liki koko elämänsä käyttäneet seniorimmat eliteohjelmoijat eivät ilmeisesti tule modernissa työympäristössä toimeen kun joko aivojen neuroplastisuus on jähmennyt, on vain jääräpäistynyt tai vaihtoehtoisesti on viisastunut niin, ettei gitin ontuvaa komentorivikäyttöä viitsi säilyttää pääkopassa.

Kunnon käyttöliittymä Gitin päälle on erinomainen idea – vaikka kaikki taikatemput eivät moisella onnistukaan, niin päivätyön touhut kannattaa vauhdittaa suoraan commitattavan koodin sekaan tunkkaamalla kunhan työkalu ei astu satunnaisen komentoriviloitsimisen varpaille. Magit väittää olevansa täysi posliinikerros Gittiin (“porcelain” vs “plumbing” ovat Git-kieltä UI:lle ja tunkkaukselle). Pelkkä posliinipönttöhän yleensä riittää melko temppuisaankin käyttöön, ja sen kokonaan vieminen koodieditorin sekaan tuo commit-touhuamisen osaksi koodin kirjoittamista. Ja Emacsin taikabuffereihinhan sellainen gitti-majormode sopii kuin nyrkki silmään (vrt. joku höpöhöpö-GUI erikseen).

Magitin statusikkuna näyttää suunnilleen samalta kuin git status terminaalissa. Statusikkuna tosin on interaktiivinen, eli jokaisen muuttuneen rivin voi klikata stagettavaksi.

Montaa pikkujuttua devatessa git add --patch on mitä mainioin temppu; näin stagetaan yksittäiset muuttuneet tekstipötköt kun työn alla on useamman commitin verran hommaa (kts. alkuvuoden GT). Kukin voi varmaan kuvitella, miten paljon intuitiivisempaa on nähdä muuttuneet pötköt tutussa editorissa kaiken tekstin sekaan korostettuna.

Muutkin versionhallintajärjestelmät integroituvat Emacsiin vissiin nätisti, ja toki muihinkin editoreihin on versionhallintaplugareita. Tiivistettäköön, että Magit vaikuttaa tyypillistä GUI-härpätinplugaria kattavammalta, mikä nyt on vähintä mitä miltään järkevältä gittihärveliltä voi odottaa.

Elämänhallinta

Ympäri maailmaa kaikenkarvaiset henkilöt tuntuvat ehdottelevan, että jollei Emacsissa mikään muu innosta, niin silti org-mode 22 on se killer app jonka takia kannattaa kehittää tähän työympäristöön voimakas riippuvuus. “Your life in plain text”. Epähätäinen päättelijä kysyisi, että miksei vaan koodaisi lempieditoriinsa vastaavanlaista lisäosaa.

Org-mode on ilmeisesti steroidoitu merkkauskieli, jota Emacs osaa rendata. Se pelkkä merkkauskieli on Emacsin outline mode 23. Org-mode-tekstistä voi myös linkittää vaikka ympäriinsä muihin buffereihin. Markdown, reStructuredText, yms. rendautuvat nätisti mihin vaan mutta niitä on yleensä ihan kamalaa kirjoittaa jos datassa on mitään monimutkaisempaa. Varsinkin taulukoiden leiskaaminen on tässä modessa hyvinkin automaattista ja epäkamalaa (tietysti mihin vaan editoriin varmaan skriptaa autoformatterin ja pluginskriptejä on olemassa jo), ja taulukot oikeastaan toimivat spreadsheetteinäkin (mikä taas on eittämättä aika fancyä). TODO-listoihinkin löytyy kätsy automatiikka.

Aika yksinkertaista kamaa, mutta hyvin toteutettuna. Jos elämänsä rakentaa aktiivisesti muistiinpanojen, TODO-listojen, tekstillä kuvattavien projektien yms. ympärille, niin on myös näppärää että tätä tekstiä voi muotoilla editoriavusteisesti. Haisee kerrassaan Apple-tyyliseltä ei tee paljon mutta tekee sen kiiltävästi -touhulta.

Projektinhallinta

Projectilea 24 monet suosittelevat. Yksikään projektihallintalisäke ei oikeasti ole mikään hengenpelastaja, sillä niillä voi lähinnä tehdä helppoja asioita projektiin merkityissä tietyissä tiedostoissa, mutta samaan projektiin kuuluvat tiedostothan ovat samassa hakemistossa ja siten niiden käpistelyn luulisi olevan yksinkertaista. Ehkä tästä on hyötyä sitten kun Emacsissa on auki >9000 tiedostoa.

Projectile mainostaa osaavansa makettaa projektin, hyppiä projektin sisällä eri tiedostoihin, löytää koodia vastaavan testin ja vaihtaa niiden välillä, etsiä ja korvata tekstiä, vaihtaa .c/.h-tiedostoparien välillä ja muuta simppeliä. Ehkä tälläiset yleiset toiminnallisuudet on ihan ok lätkiä saman plugarin alle. Härveli myös cachettaa kaikki projektin tiedostot siltä varalta, että ovat vaikka hitaan verkkoyhteyden takana. No, kauankohan cachettaa vaikka Linux-kernelprojektin 68 tuhatta tiedostoa verkkoyhteyden takaa? Ei varmaan haittaa avaamislagi, koska Emacsia ei kuulemma suljeta koskaan, paitsi silloin kun masiinan boottaa, eli suunnilleen ei koskaan. Vie varmaan silti vähemmän keskusmuistia kuin vasta avattu Eclipse.

Debuggeri

Ei taida tulla yllätyksenä, että GNU Emacs ja GNU GDB sulautuvat yhteen hyvin. Sama ukkeli on molemmat pannut alulle. GDB:lle ei ole kauhean montaa (yhtäkään?) hyvää erillistä GUI:ta, ja vaikkei sellaista kovin usein tarvitsisi, niin silloin kun tarttee niin onhan siitä apua (DDD kyllä toimii, mut on aika karu 25). Emacs osaa vaikka miten monen debuggerin integraation gud-modella (Grand Unified Debugger) 26.

GUD saa Emacsin bufferit toimimaan monessa eri taikatilassa siten, että Emacs näyttää yhtäkkiä ominaisuuksiensa perusteella suunnilleen Visual Studiolta. On ikkuna seurattaville muuttujille, stäkkidumppi omassa ikkunassaan, breakpointit saa merkattua koodin sekaan helposti jne. Toimitus ei ehtinyt testaamaan, mutta sanottakoon että sitten kun tulee tarve debugata hikikarpalot otsalla niin pannaan testiin. Tästä voisi nimittäin kirjoittaa vaikka ihan oman artsunsa.

GudMode, kuva EmacsWikistä

Emacs käyttöjärjestelmänä

Sanotaan, että Emacs on hyvä käyttöjärjestelmä jonka editorissa on kuitenkin parannettavaa. Tutkitaan Emacsin käyttisominaisuuksia.

Sähköposti

Emacsin mukana tulee kolme erilaista mailipalikkaa; Rmail, Gnus, ja MH-E. Näistä Rmail on defaultein, joten ei kun tunksuttelemaan.

Mailipulikka avataan triviaalisti M-x rmail.

Mailipulikan avautuessa tarkistetaan saapuneet ja näytetään vanhin lukematon viesti. Mikäli kaikki mailit on kahlattu läpi, näytetään viesteistä viimeisin.

Ääkkösissä ongelmia:

From onni@onnilampi.fi Sun Sep 24 14:38:00 2017
Return-path: <onni@onnilampi.fi>
Envelope-to: test@onnilampi.fi
Delivery-date: Sun, 24 Sep 2017 14:38:00 +0300
Received: from onni by onnilampi.fi with local (Exim 4.89)
        (envelope-from <onni@onnilampi.fi>)
        id 1dw5EW-000766-S9
        for test@onnilampi.fi; Sun, 24 Sep 2017 14:38:00 +0300
From: Onni Lampi <onni@onnilampi.fi>
To: Testi =?utf-8?B?SsOkYsOk?= <test@onnilampi.fi>
Subject: Re: This is an example mail
In-Reply-To: <E1dw5E7-0006bV-3m@onnilampi.fi> (message from Testi
 =?utf-8?B?SsOkYsOk?= on Sun, 24 Sep 2017 14:37:35 +0300)
Date: Sun, 24 Sep 2017 14:38:00 +0300
Message-ID: <87poagqqcn.fsf@onnilampi.fi>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Status: RO

Kiitos t=C3=A4st=C3=A4 mailista, se oli kiva!

Nettiselain

TODO(onni)

Termis

M-x shell. TODO(onni)

Tetris

TODO(onni)

M-x doctor

TODO(onni)

Emacsin laajentaminen

Useimmiten Lisp > joku omakeksimä makro-/konffauskieli jota voi vain väärinkäyttää ohjelmointiinkin (köh VimL köh 27) ja onhan Lisp kaunista ainakin ajatustasolla. Ehkä editoritasollakin, jos editori piirtää ne kaikki sulkeet vähän vaaleammalla sävyllä, auttaa formatoinnissa, ja korostaa parit selkeästi. Makroja kaikkialla, eikä mitään search-replaceen perustuvaa pelle-esiprosessorimakroilua. Aw yiss.

Lisp on kuitenkin aika esoteerinen kielikategoria. Ellei siihen ole tottunut ja kehittänyt toleranssia kuin vaikka chilinsyömiseen, voi itse ohjelmointikieli osoittautua oppimiskäyrähaasteeksi editorin maailmanlaajuisen 28 ohjelmointirajapinnan lisäksi. Elisp on kumminkin Common Lispiäkin muinaisempi rätkytin. Lisää editorissa ajettavaa Lispiä saa ammennettua sisäänrakennetusta plugarijärjestelmästä 29.

Jotkut laajentavat Emacsia forkkaamalla sen kokonaan; toisille riittää vino pino konfiguraatiota ja lisäosia. Spacemacs 30 on oma distribuutionsa, joka on sen verran kaukana Emacsista, että sitä kutsutaan leikillä sekä Emacsiksi että Vimiksi paitsi ettei kummaksikaan. Pohjimmaisena ideana on Vim-ideologia eli Evil-mode 12 Emacsin sekaan leivottuna, ja mm. näppiksen käytöstä pitäisi tulla paljon mukavampaa, sekä editorin nettisivu mainostaa reaaliaikaista nappiohjehärveliä apuvälineeksi. Mukana tulee kaikenlaiset oletuskonffit, jotka varmaan sopivat joillekin ja toisille eivät. On oletettavaa, että Vimin tai Emacsin elämäntavakseen ottanut henkilö kompastelisi Spacemacsinkin oletuskonffien kanssa oman aikansa kunnes lopulta diilaisi sen kanssa ja vain nauttisi.

Muinaisuutensa vuoksi Emacs on perinteisesti ohjannut jopa alla surraavan käyttöjärjestelmän toimintaa vaatimalla ihan ihmeellisiä käyttisfeatureita 31 joissa riittää kritisoitavaa 32 33. Jopa glibc:n malloc-implementaation nyanssien 34 35 on huhuttu vaikuttavan Emacsiin merkittävästi. Emacs-koodaaja on varmaan ajatellut, että käyttöjärjestelmä on pääasiassa tukirakenne Emacsille.

Ennemmin tai myöhemmin Emacsin säätämiseen turhautuu ja lopulta painaa vahingossa näppäinyhdistelmää M-x tetris, jolloin loppupäivä kuluukin sitten pelaamiseen. Vaihtoehtoisesti M-x doctorilla aukeaa psykoterapeutti, joka sille avautuessa lähinnä vittuilee ja esittää tyhmää.

Lopuksi

real programmers xkcd #378

Ei voi muuta sanoa kuin että on tämä “extensible, customizable, self-documenting real-time display editor” melkoinen kapistus. Emacs on reaaliaikainen Elisp-ohjelmointikielifrontend omien editointiskriptien ja muiden skriptien suorittamiseen (joista monet skriptit tulevat defaulttina editorissa mukana). Monet funktiot vaan sattuvat olemaan bindanttuna näppäimiin. Tälleen softajampan näkökulmasta aika messevää.

Ihan editorina ajatellen ei tässä kovin erikoisia editointihilightfeatureita sinänsä ole verrattuna muihin verrattomiin editoreihin. Laajaa softaa pitäisi käyttää vuosi tai mielellään elinikä jotta siitä saisi kunnolla kiinni; tämä GT:n pieni testi on vain kevyt pintaraapaisu, vaikka venyikin pienen viimeistelemättömän kandityön mittoihin. Kyseessä on hyvä käyttöjärjestelmä, koska näppäinyhdistelmämagialla saa tehtyä mitä vaan. Huono editori, koska näppäinyhdistelmämagiaa on hidasta näppäillä. Lopulta kun omat nappibindaukset ovat valmiit, niin löytyy pinnan alta ehkä vähemmän huono editori.

Testatessa löydettiin Emacsin fundamentaalisesta olemuksesta lukuisia erinomaisia designejä Lisp-härväilystä puhumattakaan. Kaikki näytettävät asiat ovat toistensa kaltaisia buffereita, ja siellä sun täällä käytetään keskenään sopivia komentoja; konsistenttius on hyve sekä pellin alla että ratissa. Myös koska kaikki sisältö on pelkkiä buffereita, niin navigointi ja etsiminen ja muu vastaava toimii kuten olettaisi esim. sorsassa, muistiinpanoissa, manuaalissa, konffeja säätäessä yms. Ylipäätään softan toiminnallisuuksien rakentaminen muutaman hiton hyvän yleisen keskenään ortogonaalisen konseptin ympärille on hyvä idea. Esimerkiksi nettiselainten konffien kannattaa näkyä nettisivuina eikä erillisenä käyttisspesifinä dialogisotkuna.

Käyttäjänimi mechanical_fish toteaa HN:ssä osuvasti 36:

Stop worrying about “intuitive”. Yes, until you get to know the moves, emacs is nonintuitive, kind of like the piano. No matter how expensive and well-designed a piano I buy, I won’t be able to just sit down and play some Chopin. (Well, technically you can buy player pianos that will do just that, but what would a concert pianist call such an instrument? A toy.)

Piano tai mikä vaan epätriviaali tekstieditori on kuitenkin hyvin looginen instrumentti jonka kanssa järjestelmällinen mestarijamppa jumppaa joustavasti. Monet maailman merkkihenkilöt ovat todistetusti käyttäneet ja ehkä vielä tällä hetkelläkin käyttävät tätä editoria ja saavat aikaiseksi juttuja maan ja taivaan väliltä.

Kun toimitus kysyi eräältä Emacsissa elävältä guru-ukkelilta että mistäs tämän kokeileminen kannattaa aloittaa, vastauksena oli toki epäröintiä koska tyyppi on varmaan pätsännyt ensimmäistä versiota RMS:n (Stallman, ei root mean square) kanssa aikoinaan eikä siten koskaan tarvinnut mitään oppaita. Toimituksen jäsenen lukemattomasta aiemmista controlnappivitsailuista huolimatta keskustelu oli silti asiallinen, ja kehotettiin vaan käyttämään sitä editoria, mistä löytyy featuret joita kaipaa ja joka tuntuu sopivalta. Toisaalta eräs toinen saman toimiston Emacsisti antaa aina samalla mitalla takaisin Vimin suhteen. Exquisite.

Se, mitä tekstieditoria kukin tai itse käyttää, on joillekin uskon asia ja joillekin vain kuin kenkien tai kalsareiden sovittaminen – on monia hyviä ja valinta tehdään ihan perstuntumalta. GT ei ota kantaa minkä muotoinen täytyy olla käyttääkseen tälläistä tekstieditori-käyttöjärjestelmä-abominaatiota (ok, oikeasti se on hieno Lisp-ympäristö jota yleensä käytetään editorina) jonka pohjimmaiset ajatukset ovat oikeastaan aivan mainioita; kukin harrastelkoon kaikkea koodieditoinnista seksiin ihan miten tykkää (kunhan uskonto ei esim. aja kansanmurhaan). Emacs on testaajien mielestä ihan hyvä idea; on harmi, että tekstin editointi on vähän kömpelöä ilman polkimia, mutta kuulemma Evil-mode tai Spacemacs eli Emacs tunkattuna enemmän Vimiksi helpottaisi. Täytynee jälleen suorittaa testausta.

Lähteet

  1. http://aalto-mark-rippetoe-society.herokuapp.com/natiivia.txt 

  2. https://www.amazon.com/s?field-keywords=pc+usb+foot+switch 

  3. https://www.gnu.org/software/emacs/refcards/index.html 

  4. http://vimdoc.sourceforge.net/htmldoc/motion.html  2

  5. https://www.reddit.com/r/emacs/comments/6a81mo/does_emacs_cause_carpal_tunnel/dnflxxe/ 

  6. https://www.gnu.org/software/emacs/manual/elisp.html 

  7. https://www.gnu.org/fun/jokes/gnuemacs.acro.exp.html 

  8. http://xahlee.info/kbd/keyboard_hardware_and_key_choices.html  2

  9. https://en.wikipedia.org/wiki/Space-cadet_keyboard#/media/File:Space-cadet.jpg 

  10. http://ergoemacs.org/emacs/emacs_pinky.html 

  11. https://news.ycombinator.com/item?id=11655573 

  12. https://github.com/emacs-evil/evil  2

  13. https://www.emacswiki.org/emacs/SelfDocumentation 

  14. https://github.com/magnars/expand-region.el 

  15. https://twitter.com/nixcraft/status/849908742871175168 

  16. https://www.emacswiki.org/emacs/UndoCommands 

  17. https://www.emacswiki.org/emacs/RedoMode 

  18. https://piotrkazmierczak.com/2010/emacs-as-the-ultimate-latex-editor/ 

  19. https://www.gnu.org/software/emacs/tour/ 

  20. https://www.gnu.org/software/emacs/manual/html_node/emacs/Version-Control.html 

  21. https://magit.vc/ 

  22. http://orgmode.org/ 

  23. https://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html 

  24. http://batsov.com/projectile/ 

  25. https://www.gnu.org/software/ddd/ 

  26. https://www.emacswiki.org/emacs/GrandUnifiedDebugger 

  27. https://www.reddit.com/r/vim/comments/1bf672/why_does_viml_suck/ 

  28. https://xkcd.com/378/ 

  29. https://www.emacswiki.org/emacs/InstallingPackages 

  30. http://spacemacs.org/ 

  31. http://emacshorrors.com/posts/unexecute.html 

  32. https://lwn.net/Articles/673724/ 

  33. https://news.ycombinator.com/item?id=11001796 

  34. https://lists.gnu.org/archive/html/libc-maintainers/2016-01/msg00000.html 

  35. https://sourceware.org/bugzilla/show_bug.cgi?id=6527 

  36. https://news.ycombinator.com/item?id=313039 

Julkaistu GT:ssä 5/2017.