Tietokoneen käytön ja ohjelmoinnin alkeet

Kurssin kotisivulle


8 Editorit

Alunperin Unixissa oli vain rivipohjainen editori ed. Näyttöpäätteiden yleistyessä mukaan tuli kuvaruutueditori vi. GNU-projektin ensimmäisiä tuotteita oli emacs-editori, joka nykyisin tulee lähes automaattisesti Linuxin mukana.

Seuraavassa käsitellään pääasiassa emacsia, koska se muistuttaa eniten muita nykyaikaisia editoreita. Jotkin Unixin komennot käyttävät ed- ja vi-editoreita tulostensa esittämiseen, joten ne ovat aina mukana järjestelmässä ja niiden käytöstä on hyvä tietää jotakin.

Emacs

Emacs on itse asiassa tavattoman laaja järjestelmä, josta tässä kuvataan vain perusteet. Niillä tavallinen ohjelmoija tai tekstien kirjoittaja tulee kuitenkin toimeen aivan hyvin. Kun käyttö alkaa sujua, voi etsiskellä eksoottisempia piirteitä.

Emacsin käsikirja eri muodoissa löytyy GNU-projektin sivuilta:

http://www.gnu.org/software/emacs/manual/

Emacsissa on myös oma laaja opastusjärjestelmänsä. Yläreunan valikosta löytyy Help ja sen alta Emacs Tutorial. Sen avulla emacsin käyttöä on melko helppo opiskella.

Emacsin ikkunan ulkonäkö voi hieman vaihdella eri järjestelmissä. Yläreunassa on valikkorivi, jonka avulla voi suorittaa useita peruskomentoja ja säätää editorin asetuksia. Sen alla voi olla graafinen valikko.

Varsinaisen tekstiruudun alapuolella on tilarivi, josta näkyy mm. käsiteltävän tiedoston nimi sekä tieto, millä rivillä ollaan. Jos tiedoston nimen edessä on **, tiedostoa on muutettu.

Alimpana on yhden rivin ruutu, minipuskuri (minibuffer). Sen avulla emacs voi antaa tietoja suoritetuista komennoista tai pyytää käyttäjältä tietoja, kuten ladattavan tiedoston nimeä.

Komennot ja näppäimet

Emacs sisältää suuren määrän komentoja, joilla kaikilla on yksikäsitteinen ja yleensä melko pitkä nimi. (Emacs on kirjoitettu Lispillä, ja nämä komennot ovat lisp-funktioiden kutsuja.) Esimerkiksi komento 'next-line' siirtää kursorin seuraavalle riville. Editoria voitaisiin periaatteessa käyttää pelkästään antamalla sille tällaisia komentoja, mikä tietysti olisi toivottoman hankalaa. Siksi useimmin tarvittavat komennot on sidottu sopiviin näppäimiin. Esimerkiksi komento next-line on sidottu nuolinäppäimistön näppäimeen, jossa on alaspäin osoittava nuoli. Komentoja on kuitenkin niin paljon, ettei kaikkia ole mahdollista sitoa näppäimiin. Siksi harvoin tarvittavia komentoja voi suorittaa kutsumalla niitä nimeltä.

Toisin kuin vi, emacs on aina syöttötilassa ja tavalliset näppäimet lisäävät käsiteltävään tiedostoon yhden merkin kursorin kohdalle. Komennot on sidottu näppäinkoodeihin, joiden muodostamiseen käytetään Ctrl-, Alt- ja Esc-näppäimiä.

Merkintä Ctrl-a tarkoittaa, että ensin painetaan alas Ctrl-näppäin, sitten painalletaan a-näppäintä (jolloin kursori siirtyy rivin alkuun) ja lopuksi vapautetaan Ctrl-näppäin. Vastaavasti Alt-a tarkoittaa, että ensin painetaan alas Alt-näppäin, sitten a (kursori siirtyy nyty kappaleen alkuun) ja lopuksi vapautetaan Alt.

Emacsin manuaaleissa voidaan puhua Meta-näppäimestä. Sellaista ei nykyisissä näppäimistöissä yleensä ole, vaan sen sijasta käytetään Alt-näppäintä. Meta-a (tai M-a) toteutetaan siis näppäilemällä Alt-a. Toinen mahdollisuus on käyttää Esc-näppäintä. Sen käyttö poikkeaa Ctrl- ja Alt-näppäimistä. Komento Esc-a suoritetaan painaltamalla ensin Esc-näppäintä ja vapauttamalla se ja painamalla sen jälkeen a-näppäintä.

Nuolinäppäimet, PageUp ja PageDown toimivat normaaliin tapaan. Joissakin toteutuksissa Home ja End vievät tiedoston alkuun ja loppuun, joissakin taas vain rivin alkuun ja loppuun.

Kaikkia näppäinten sidoksia voidaan muuttaa kirjoittamalla halutut määrittelyt alustustiedostoon .emacs. Sen avulla myös funktionäppäimiin voidaan sitoa usein tarvittavia komentoja. Esimerkiksi tämän kirjoittaja on lisännyt alustustiedostoon seuraavat rivit:

      (global-set-key [home] 'beginning-of-buffer)
      (global-set-key [end] 'end-of-buffer)

Näiden vaikutuksesta näppäimet Home ja End vievät tiedoston alkuun ja loppuun.

Alustustiedosto on itse asiassa Lisp-kielinen ohjelma. Tällä kurssilla siihen ei puututa tämän enempää, sillä oletusasetuksillakin pärjää jo oikein hyvin.

Emacsin käynnistäminen ja lopettaminen

Tavallisin tapa käyttää emacsia on antaa komentorivillä editoitavan tiedoston nimi, esimerkiksi

    emacs ohjelma.c

Tämä käynnistää X-ikkunointijärjestelmässä emacsin uuteen ikkunaan ja lataa siihen tiedoston ohjelma.c. Jos uuden ikkunan avaaminen halutaan estää (esimerkiksi, jos se ei toimi pääteyhteyden luonteen vuoksi), emacs voidaan käynnistää sanomalla

    emacs -nw ohjelma.c

Emacsista poistutaan File-valikon kautta tai näppäinkomennolla Ctrl-x Ctrl-c. Jos muutettuja tiedostoja ei ole talletettu, emacs kysyy, talletetaanko ne. Jos emacsista halutaan poistua tallettamatta jotakin tiedostoa, emacs pyytää vielä varmennusta asialle.

Editoitu tiedosto tallettuu samalla nimellä kuin alkuperäinen. Alkuperäisestä tiedostosta jää kuitenkin kopio, jonka nimi päättyy merkkiin ~. Tästä saattaa joskus olla ikäviä seurauksia, kun tiedostoja kopioidaan dos-muotoiselle taltiolle, kuten cd-levylle. Dos-tiedostojen nimissä on pisteen jälkeen korkeintaan kolmen merkin tarkenne, joten ohje.txt ja ohje.txt~ saattavatkin tallettua samalla nimellä, vanhempi versio uudemman päälle. Ennen tällaista kopiointia tiedostojen vanhat versiot onkin syytä hävittää.

Ctrl-z siirtää emacsin taustaprosessiksi ja sulkee sen ikkunan. Se näkyy kuitenkin joko kuvakkeena ruudulla tai jossakin valikkopalkissa järjestelmästä riippuen. Sieltä sen voi aktivoida uudelleen hiirellä. Tämä on hyvä muistaa, sillä Ctrl-z:n lähellä on muita usein tarvittavia kontrollimerkkejä, joten näppäintä voi painaa vahingossa. Ikkunan katoamisesta saman tien ei kuitenkaan ole syytä huolestua (ainakaan yleensä).

Komennon keskeyttäminen

Jos olet alkanut kirjoittaa jotakin useamman merkin mittaista komentoa, mutta tuletkin katumapäälle, voit keskeyttää komennon näppäimellä Ctrl-g.

Liikkuminen tiedostossa

Emacs on syntynyt aikana, jolloin nykyinen PC-näppäimistö ei ollut niin yleinen kuin nykyisin. Sitä oli pystyttävä käyttämään myös näppäimistöillä, joissa ei ollut erillisiä kursorinäppäimiä. Niinpä tiedostossa voi liikkua myös kontrollimerkkien avulla.

Ctrl-f, nuoli oikealle: siirretään kursoria yhden merkin verran oikealle. Jos ollaan rivin lopussa, siirrytään seuraavalle riville.

Ctrl-b, nuoli vasemmalle: siirretään kursoria yhden merkin verran vasemmalle. Jos ollaan rivin alussa, siirrytään edelliselle riville.

Ctrl-f, nuoli alas: siirretään kursoria alaspäin seuraavalle riville.

Ctrl-f, nuoli ylös: siirretään kursoria ylöspäin edelliselle riville.

Alt-f, Ctrl-nuoli oikealle: siirrytään eteenpäin sanan loppuun.

Alt-b, Ctrl-nuoli vasemmalle: siirrytään taaksepäin sanan alkuun.

Ctrl-v, PageDown: siirrytään alaspäin sivun (vajaan kuvaruudullisen) verran.

Alt-v, PageUp: siirrytään ylöspäin sivun verran.

Ctrl-a: siirrytään rivin alkuun.

Ctrl-e: siirrytään rivin loppuun.

Alt-a: siirrytään kappaleen alkuun. Tyhjä rivi erottaa kappaleet toisistaan.

Alt-e: siirrytään kappaleen loppuun.

Merkki, piste ja alue

Paikkaan tiedostossa liittyy kaksi käsitettä. Kuvaruudussa näkyvä kursori osoittaa pisteen (point): piste on kursorin vasemmalla puolella eli kursorin ja sitä edeltävän merkin välissä. Toinen paikkaa osoittava olio on merkki (mark). Merkin ja pisteen välinen tiedoston osa on alue (region). Joissakin versioissa alue osoitetaan taustasta poikkeavalla värillä.

Pisteen paikka muuttuu kursoria siirrettäessä. Merkki voidaan asettaa pisteen kohdalle komennolla Ctrl-välilyönti. Minipuskurissa näkyy silloin ilmoitus "Mark set".

Poisto ja palautus

Tekstiä voidaan poistaa merkki kerrallaan tai pitempinä pätkinä. Kun tekstiä poistetaan kerralla pitempi pala, poistettu teksti tallettuu puskuriin, josta se voidaan palauttaa takaisin. Tätä voidaan käyttää myös tekstin siirtämiseen paikasta toiseen. Poistopuskurin nimi emacsin terminologiassa on kill-ring.

Backspace: poistetaan kursorin vasemmalla puolella olevan merkki.

Ctrl-d: poistetaan kursorin kohdalla oleva merkki.

Edellä mainitut komennot eivät talleta poistettua merkki poistopuskuriin. Tästä on kuitenkin poikkeus: jos komennolle annetaan toistojen määrää osoittava argumentti, merkki tai merkit tallettuvat poistopuskuriin. Esimerkiksi Esc 5 Ctrl-d hävittää 5 merkkiä ja tallettaa ne poistopuskuriin.

Ctrl-k (kill): poistetaan rivin loppu pisteestä alkaen eli kursorin kohdalla oleva merkki mukaanlukien. Yksi Ctrl-k tuhoaa rivillä olevan tekstin, mutta jättää rivinvaihdon paikoilleen. Toinen Ctrl-k tuhoaa sitten rivinvaihdon.

Alt-d: poistetaan seuraava sana kursorista alkaen.

Ctrl-w: poistetaan alue, siis merkin ja pisteen välissä oleva teksti. Vastaa muiden ohjelmien "cut"-operaatiota.

Alt-w: alue kopioidaan poistettujen tekstien puskuriin, mutta sitä ei poisteta itse tiedostosta. Tätä voi käyttää saman tekstin kopioimiseen eri paikkoihin.

Ctrl-y (yank): kopioidaan poistopuskuriin viimeksi talletettu teksti kursorista alkaen eli pisteen jälkeen ("paste").

Peräkkäiset Ctrl-k-komennot, joilla siis poistetaan useita peräkkäisiä rivejä, tallettavat poistetun tekstin yhdeksi palaseksi. Näin tapahtuu vain jos Ctrl-k-komntojen välillä ei tehdä yhtään mitään muuta. Vaikutus on siis sama kuin, jos teksti olisi poistettu komennolla Ctrl-w. Tämän jälkeen annettu Ctrl-y palauttaa kaikki poistetut rivit.

Poistopuskurissa ovat tallessa myös aikaisemmin poistetut tekstit. Ctrl-y kuitenkin palauttaa niistä vain viimeisimmän. Jos tämän jälkeen painaa Alt-y, ruudulla näkyvä palautettu teksti korvataan puskurissa olevalla aikaisemmin poistetulla tekstillä. Näppäilemällä toistuvasti Alt-y voi selata aikaisempia poistettuja tekstejä ja valita niistä halutun. Kun kaikki puskurissa olevat tekstit on käyty läpi, siirrytään takaisin viimeksi poistettuun.

Merkkijonon etsiminen ja korvaaminen

Merkkijonojen etsimisessä ja korvaamisessa voi käyttää tavallisten merkkien lisäksi jokerimerkkejä ja Unixin ns. säännöllisiä ilmauksia (regular expression). Niiden käsittely on kuitenkin sen verran mutkikasta, että tässä tyydytään vain tavallisiin merkkijonoihin. Emacsin opastusjärjestelmästä löytyy lisää tietoa edistyneemmistä piirteistä.

Ctrl-s (isearch-forward): Inkrementaalinen merkkijonon haku. Minipuskuriin ilmestyy teksti I-search:, jonka perään voi ruveta kirjoittamaan etsittävää merkkijonoa. Jos tähän kirjoittaa o-kirjaimen, kursori siirtyy seuraavan o-kirjaimen kohdalle. Jos merkkijonoa jatketaan kirjoittamalla h, kursori siirtyy merkkijonon oh ensimmäiseen esiintymään jne. Kun haluttu paikka on löytynyt, haun voi lopettaa joko enterillä tai esimerkiksi siirtämällä kursoria nuolinäppäimillä. Haun lopettaminen Ctrl-g:llä palauttaa kursorin paikkaan, jossa se oli hakua aloitettaessa.

Kesken haun voi myös painaa uudestaan Ctrl-s:ää, jolloin siirrytään merkkijonon seuraavaan esiintymään.

Ctrl-r (isearch-backward): Toimii muuten kuten Ctrl-s, mutta haku tapahtuu taaksepäin eli tiedoston alkua kohti.

Valikoista löytyy joitakin korvauskomentoja. Yleensä niillä ei ole yksinkertaisia näppäinsidoksia, vaan ne on suoritettava kirjoittamalla komenno nimi.

Alt-x replace-string: Korvataan merkkijono jollakin toisella merkkijonolla. Emacs kysyy erikseen kummankin merkkijonon, jotka kirjoitetaan minipuskuriin.

Esc-% tai Alt-Shift-% (query-replace): Korvataan merkkijono toisella, mutta joka esiintymän kohdalla kysytään, tehdäänkö korvaus vai ei. Tavallisimpia vastauksia ovat:

Ikkunat

Emacsin ruutu voidaan jakaa useaan ikkunaan. Eri ikkunoissa voi olla sama tiedosto, jos esimerkiksi tiedoston sisältöä järjestellään uuteen uskoon. Ikkunoissa voi olla myös eri tiedostoja, jolloin tekstiä voi siirrellä tiedostosta toiseen. Ruutu voidaan jakaa kahtia pysty- tai vaakasuunnassa. Kukin osa voidaan jakaa edelleen kummalla tahansa tavalla. Näin voidaan luoda haluttu määrä ikkunoita. Nykyinen ikkuna on se, jossa kursori sijaitsee.

Ctrl-x 2: jaetaan nykyinen ikkuna pystysuunnassa kahteen osaan.

Ctrl-x 3: jaetaan nykyinen ikkuna vaakasuunnassa kahtia.

Ctrl-x 1: poistetaan kaikki muut ikkunat paitsi nykyinen. Muissa ikkunoissa oleviin tiedostoihin tehdyt muutokset eivät kuitenkaan katoa. Opastuskomennot avaavat uuden ikkunan, jonka voi myös sulkea tällä komennolla.

Ctrl-x o (other window): siirrytään seuraavaan ikkunaan. Komento siirtää kursorin syklisesti vuorotelleen näkyvissä oleviin ikkunoihin. Ikkunaan voi siirtyä myös hirien vasemmalla näppäimellä.

Ikkunoiden kokoa voi yleensä säätää tarttumalla hiirellä ikkunoiden väliseen palkkiin ja siirtämällä sitä. Ellei tämä toimi, käytettävissä ovat myös näppäinkomennot Ctrl-x ^ tai enlarge-window sekä shrink-window, jotka muuttavat ikkunan kokoa yhden rivin verran.

Tiedostokomennot

Kun emacs käynnistetään, komentorivillä voidaan ilmoittaa yksi tai useampia tiedostoja, joita halutaan käsitellä. Käytännössä komentorivillä annetaan tavallisesti vain yhden tiedoston nimi. Muita tiedostoja voidaan ladata tarpeen mukaan.

Ctrl-x f (find-file): Emacs kysyy tiedoston nimeä, joka kirjoitetaan minipuskuriin. Puskurissa olevaa tekstiä voi muokata emacsin komennoilla. Tiedoston nimen voi täydentää tabulaattorinäppäimellä. Ellei nimi ole yksikäsitteinen, emacs avaa uuden ikkunan ja listaa siihen mahdolliset vaihtoehdot. Jos tiedosto ladataan ikkunaan, jossa on jo jokin toinen tiedosto, entinen tiedosto jää kyllä talteen emacsin puskuriin. Tiedostoon voidaan siirtyä takaisin erityisillä puskurikomennoilla. Se voidaan hakea myös komennolla Ctrl-x f, jolloin sitä ei lueta levyltä, vaan ikkunaan vaihdetaan tiedoston sisältävä puskuri, mikä on hyvin nopea toimenpide.

Ctrl-x i (insert-file): Tiedoston sisältä lisätään ikkunassa olevaan tiedostoon kursorin kohdalle.

Ctrl-x s (save-file): Talletetaan nykyinen tiedosto. Jos tiedostoon ei ole tehty muutoksia viimeisen talletuksen jälkeen, emacs ilmoitta, ettei talletus ole tarpeen.

Ctrl-x w (write-file): Talletetaan tiedosto uudella nimellä.

Jos emacsista yritetään poistua ja puskureissa on tallettamattomia tiedostoja, emacs kysyy jokaisesta, talletetaanko se.

Emacs tallettaa tiedoston automaattisesti aika ajoin. Se näkyy tiedostona, jonka nimen molemmin puolin on #-merkki. Kun tiedosto talletetaan valikosta (tai komennolla Ctrl-x s), tämä tiedosto poistetaan. Jos ohjelma jostakin syystä keskeytyy (esimerkiksi kone kaatuu sähkökatkon takia), emacs huomauttaa seuraavalla kerralla, että tiedostosta on uudempi automaattisesti tallennettu versio. Sen voi ladata komennolla Esc-x recover-file.

Komentojen toistaminen ja peruminen

Jos sama komento halutaan suorittaa useita kertoja peräkkäin, sille voidaan antaa argumentiksi toistojen lukumäärä. Tämä tapahtuu näppäilemällä ensin Esc, sitten toistojen lukumäärä ja lopuksi itse komento. Esimerkiksi

    Esc 4 Ctrl-d

poistaa neljä merkkiä kursorista alkaen. Kun lukumäärä annetaan tällä tavoin, poistetut merkit tallettuvat poistopuskuriin. Näin tapahtuu, vaikka lukumäärä olisi vain yksi. Tätä voi käyttää esimerkiksi haluttaessa kopioida jokin erikoismerkki, jota ei löydy näppäimistöstä.

Esimerkkinä tästä on PC:n skandimerkkien korvaaminen. Linuxin ruudulla tiedostossa oleva ä-kirjain näkyy koodina \bs ???. Viedään kursori merkin kohdalle ja näppäillään Esc 1 Ctrl-d, jolloin merkki tallettuu poistopuskuriin. Sitten annetaan komento Esc-x replace-string. Nyt emacs kysyy korvattavaa merkkijonoa minipuskurissa. Tähän vastataan komennolla Ctrl-y Enter, jolloin korvattavaksi merkiksi saadaan juuri poistettu ä-kirjaimen koodi. Sen jälkeen emacs kysyy korvaavaa merkkijonoa, johon vastataan näppäimistön ä-kirjaimella ja painamalla enteriä.

Viimeksi suoritettu komento voidaan kumota undo-komennolla. Se suoritetaan tavalliseen tapaan antamalla komennon koko nimi: Alt-x undo (tai Esc x undo).

Näppäimistömakrot

Joskus on tarpeen toistaa jokin toimenpidesarja monta kertaa. Silloin komennot kannattaa tallettaa makroksi, jota voi sitten suorittaa miten usein tahansa.

Makron syöttäminen aloitetaan näppäimillä Ctrl-x (. Sen jälkeen annetaan editointikomennot tavalliseen tapaan. Lopuksi makro päätetään näppäimillä Ctrl-x ). Tämän jälkeen makro voidaan suorittaa komennolla Ctrl-x e.

Ajatellaanpa, että meillä on pitkä tiedosto, jonka jokaisen rivin loppuun haluamme lisätä pisteen. Viedään aluksi kursori ensimmäisen muutettavan rivin alkuun. Sitten määritellän makro seuraavasti.

   Ctrl-x ( Ctrl-e . Ctrl-a nuoli alas Ctrl-x )

Nyt komento Ctrl-x e lisää rivin loppuun pisteen ja siirtyy seuraavan rivin alkuun. Komento voidaan toistaa esimerkiksi 1000 kertaa sanomalla

   Esc 1000 Ctrl-e

Ja voila, 1000 riviä on käsitelty.

Sekalaista

ed, sed ja vi

Kaikkein vanhin Unixin editori on rivieditori ed. Toinen rivipohjainen editori on sed (stream editor). Näitä ei enää käytetä tekstin tai ohjelmien kirjoittamiseen, mutta aivan tarpeettomiksi ne eivät ole käyneet. Niitä voi nimittäin käyttää myös komentotiedostoissa, missä niiden hieman kryptisestä käyttöliittymästä ei ole haittaa.

Unixin mukana tulee vakiona vi-editori. Se poikkeaa melkoisesti uudemmista editoreista ja voi tuntua varsin hankalalta. Sen käyttöä ei kannata ruveta opettelemaan, koska tarjolla on kätevämpiäkin työkaluja. Jotkin Unixin komennot kuitenkin käyttävät sitä tekstin esittämiseen, joten hieman sen toimintaa on hyvä tuntea.

Vi voi olla syöttö- tai komentotilassa. Syöttötilassa näppäimistölle kirjoitetut merkit kirjoittuvat tiedostoon. Komentotilassa samat merkit suorittavat erilaisia toimenpiteitä. Tilojen välillä siirrytään Esc-näppäimellä. Vanhemmat versiot eivät kertoneet millään tavoin, kummassa tilassa editori milloinkin oli; uudemmissa tila ilmenee jollakin tavoin. Komentotilassa esimerkiksi näppäimet h, j, k ja l vastaavat nuolinäppäimiä.

Kun vi:n komentilassa antaa komennon :, alareunaan ilmestyy kehote :, johon voi antaa ed-editorin komentoja. Tavallisimpia vaihtoehtoja ovat:

jed

Uudempi ja kompaktimpi editori, joka osaa emuloida joitakin muita editoreita, myös emacsin perustoimintoja.

Tiedoston tyypistä (c-ohjelma, TeX, ...) riippuva erilaisten syntaktisten olioiden esitys eri väreillä.