Perusohje vi-editorin käyttöön

Aapo Rista

18.9.2000

Johdanto

Ennen tämän artikkelin kirjoittamista osasin juuri ja juuri muokata tekstiä vi:llä ja poistua editorista. Hallittu poistuminen on kuitenkin vi:n tapauksessa ainakin aloittelijoille tärkeä taito. Siksipä heti näin alussa:

Jos haluat poistua vi-editorista tallentamatta mahdollisesti tehtyjä sotkuja, paina Esc-näppäintä päästäksesi vi:n komentotilaan. Komentotilassa kirjoita merkkiyhdistelmä ":q!<Enter>".
Tämän jälkeen sinun pitäisi olla taas Unixin komentokehotteessa tai mistä ikinä vi:n käynnistitkään. ("<Enter>" tarkoittaa tässä ja tulevissa esimerkeissä enter-näppäimen painallusta eikä lainausmerkkejä ei pidä kirjoittaa. Kannattaa huomioida myös, että joissain tapauksissa yksi Esc-näppäimen painallus ei riitä komentotilaan pääsemiseen.)

Jos taas haluat tallentaa tuotoksesi ja lopettaa vi:n, niin siirry tässäkin tapauksessa komentotilaan Esc-näppäimellä ja kirjoita "ZZ". Tällöin vi tallentaa tiedoston ennen sulkeutumistaan.

Joissain vi-jakeluversioissa on mukana online-help, jonka saa näkyviin kirjoittamalla komentotilassa ":help<Enter>". Helppi on varsin monipuolinen ja siihen kannattaa ainakin tutustua. Help-ikkunasta pääsee pois kirjoittamalla ":q<Enter>".

Koska olen itsekin varsinainen aloittelija, lähestyn vi:tä aloittelijan näkökulmasta, enkä kirjoita sen kummempia vi:n filosofiasta. Kerron kuitenkin pari itse havaitsemaani seikkaa:

Olen olettanut tätä artikkelia kirjoittaessani, että lukijalla on tiedossa ainakin perusalkeet Unix-järjestelmästä.

Toivottavasti tästä alkeisoppaasta koituu joillekin lukijoille edes osa siitä hyödystä, jonka sen kirjoittaminen antoi minulle.

Aapo Rista Aapo.Rista@iki.fi

1   vi:n komento- ja kirjoitustilat

Johdannossa mainittiin pariin otteeseen vi:n komentotila. vi voikin olla kahdessa eri tilassa: komento- ja kirjoitustilassa (command and insert modes).

Komentotilaan pääsee Esc-näppäintä painamalla ja komentotilassa syötetään vi:n komennot. Käyttäjä voi keskeyttää komennon kirjoittamisen Esc-näppäimellä, jolloin vi palaa komentotilaan.

Kirjoitustilassa käyttäjä pääsee kirjoittamaan tekstiä aktiiviseen puskuriin (buffer), eli eräänlaiseen editointi-ikkunaan. Puskureita voi olla yhtäaikaa näkyvissä useampia1 ja lisäksi niitä voi olla myös näkymättömissä. Tässä ei puututa useampien puskureiden saloihin sen tarkemmin, mutta eräs asia on syytä mainita: aktiivista puskuria voi vaihtaa komennolla "Ctrl+W Ctrl+W". Taito vaihtaa aktiivinen puskuri on aloittelijallekin hyödyllinen haluttaessa vaikka pitää online-help (jonka siis saa esiin komennolla ":help<Enter>") selattavissa yhtäaikaa muokattavan tiedoston kanssa.

2   vi:n käynnistäminen ja siitä poistuminen

vi käynnistyy Unixin komentokehotteessa yksinkertaisesti komennolla "vi:'. Tällöin päästään kirjoittamaan nimeämättömään puskuriin. Kirjoitettu teksti on tallennettava tiedostoon jollain nimellä ja se tapahtuu komentotilassa komennolla ":w tiedostonimi<Enter>". Komennolla "vi tiedostonimi" editoriin taas aukeaa nimetty tiedosto. Jos tiedostoa ei ennestään ole, sellainen luodaan tallennettaessa.

Joskus tulee tarve poistua vi:stä ilman, että muutokset tallentuvat tiedostoon. Se onnistuu komennolla ":q!<Enter>". Jos tiedostoa ei ole muutettu tai se on juuri tallennettu, riittää pelkkä ":q<Enter>".

Tiedoston välitallennus tapahtuu komennolla ":w<Enter>". Toisella nimellä tallentaminen onnistuu, kun kirjoittaa edellisen komennon perään välilyönnin ja uuden tiedoston nimen.

vi:stä poistumiseen ja tiedoston tallentamiseen voi käyttää myös komentoa "ZZ".

Tässä vaiheessa on myös syytä mainita, että vi:n komennoissa ISOILLA ja pienillä kirjaimilla on eroa. Esimerkiksi "j" siirtää kursoria yhden askeleen alaspäin, mutta "J" taas yhdistää kaksi riviä yhdeksi.

3   Liikkuminen tekstissä

Ensin kannattaa kokeilla kursori- eli nuolinäppäimiä. Jos ne eivät vaikka joistain kummallisista pääteasetuksista johtuen toimi oikein, voi askel kerrallaan liikkumiseen käyttää komentotilassa seuraavia näppäimiä:

h askel vasemmalle
j askel alas
k askel ylös
l askel oikealle

Muita hyödyllisiä liikkumiseen vaikuttavia näppäinkomentoja komentotilassa on mm.:

$ rivin loppuun
0 rivin alkuun
^ rivin ensimmäiseen merkkiin
w tai W seuraavan sanan alkuun
e tai E sanan loppuun
b tai B sanan alkuun

H näytön yläriville
M näytön keskelle
L näytön alariville
nG riville n (n on kokonaisluku)
 
Ctrl+F näytöllinen alas
Ctrl+B näytöllinen ylös
Ctrl+D puoli näytöllistä alas
Ctrl+U puoli näytöllistä ylös
Ctrl+L näytön virkistys
:f kertoo kursorin sijainnin

Ennenkuin lähtee vaeltamaan tekstissä, voi kursorin sen hetkisen sijainnin panna muistiin. Merkkaaminen onnistuu komennolla "m<merkki>", missä <merkki> on joku merkki väliltä a-z, A-Z tai 0-9. Paluu merkattuun kohtaan tapahtuu komennolla " `<merkki>". (Hipsukka ennen merkkiä on vasemmalle kallistunut ja se löytynee suomalaiselta näppäimistöltä "backspace"-näppäimen vasemmalta puolelta.)

Kokeilemalla saa parhaan tuntuman edellä mainittuihin komentoihin. Lisäksi kannattaa huomata, että kirjoitettaessa ennen komentoa (komentotilassa) kokonaisluku n, suoritetaan seuraava komento n kertaa. Esim. "5k" siirtää kursoria viisi riviä ylöspäin. Edellä mainittu toimii useimpien komentojen kanssa.

4   Merkkien lisääminen ja poistaminen

Kirjoitustilassa tekstin lisääminen tapahtuu normaalisti näppäimistöltä. Kirjoitustilaan pääsee komentotilasta mm. seuraavilla komennoilla:

a lisää tekstiä kursorin oikealle puolelle
A lisää tekstiä rivin loppuun
i lisää tekstiä kursorin kohdalle
I lisää tekstiä rivin alkuun
o tekee alapuolelle tyhjän rivin ja lisää tekstiä rivin alkuun
O tekee kohdalle tyhjän rivin ja lisää tekstiä rivin alkuun

Merkkejä voi poistaa ja korvata ainakin seuraavilla komennoilla:

x poistaa kursorin kohdalla olevan merkin
X poistaa kursoria edeltävän merkin
r<merkki> korvaa kursorin kohdalla olevan merkin
R vi siirtyy korvaustilaan

Monipuolisemmin merkkien poisto onnistuu komennolla "d", jonka käytöstä tässä muutamia esimerkkejä:

d^ poistaa merkit kursorin vasemmalta puolelta rivin alkuun
d$ tai D poistaa merkit kursorista rivin loppuun
dd poistaa koko rivin
dw poistaa merkit kursorista seuraavan sanan alkuun
de poistaa merkit kursorista sanan loppuun
5de poistaa 5 seuraavaa sanaa
5dd poistaa viisi riviä
  jne...

"d" itse asiassa "leikkaa" (cut) poistetun tekstin puskuriin. Tekstin voi "liimata" (paste) komennoilla "p" ja "P".

Viimeisimmän muutoksen voi peruuttaa (undo) komennolla "u" ja kaikki riville tehdyt muutokset komennolla "U".

p lisää poistetun tekstin kursorin jälkeen
P lisää poistetun tekstin kursorin kohdalle
4P lisää poistetun tekstin kursorin kohdalle 4 kertaa
u peruuta viimeisin muutos
U peruuta kaikki äsken riville tehdyt muutokset

Joskus tulee tarve kopioida tekstiä toiseen paikkaan. Tekstiä voi kopioida puskuriin riveittäin komennolla "yy". "yy" kopioi kursorin osoittaman rivin, "3yy" (tai "3Y") taas kolme riviä.

Jos ei halua laskea rivejä, voi kopioitavan alueen alun merkata komennolla "m<merkki>" ja kopioida alueen sitten puskuriin komennolla "y`<merkki>".

Kopioidun tekstin liittäminen tapahtuu edellä mainituilla "p" ja "P" --komennoilla.

5   Tekstin etsiminen ja korvaaminen

Etsi-toiminnon peruskäyttö on vi:ssä varsin yksinkertaista2: vinoviivan perään kirjoitetaan etsittävä merkkijono ja painetaan enter: "/mjono<Enter>" siirtää kursorin seuraavaan merkkijonon "mjono" esiintymään tekstissä. "?mjono" taas siirtää kursorin edelliseen esiintymään.

On huomattava, että jotkut vi:n käyttämät erikoismerkit on suojattava etsittävissä merkkijonoissa kenoviivalla "\". Näitä ovat mm.: ^*$[<> ja .

Etsintää voi jatkaa samaan suuntaan komennolla "n" ja vastakkaiseen suuntaan komennolla "N". Yhteenveto:

/mjono etsii seuraavan esiintymän merkkijonosta "mjono"
?mjono etsii edellisen esiintymän merkkijonosta "mjono"
n toistaa edellisen etsinnän samaan suuntaan
N toistaa edellisen etsinnän vastakkaiseen suuntaan

Etsi-korvaa-toiminnon peruskäyttö on melkein yhtä yksinkertaista3: jos halutaan korvata esimerkiksi kaikki tekstissä esiintyvät merkkijonot "foo" merkkijonolla "puppu", komento kuuluu: ":1,$s/foo/puppu/g". Edellisessä "1,$" tarkoittaa rivejä ensimmäisestä viimeiseen, "s" on komento, vinoviiva "/" erotinmerkki ja "g" kohdistaa toimenpiteen kaikkiin rivin esiintymiin. (Muuten ainoastaan rivin ensimmäinen esiintymä korvattaisiin uudella).

Edellämainituissa komennoissa voi käyttää ns. säännöllisiä lausekkeita (regular expression), jotka ovat osaavissa käsissä erittäin tehokas väline merkkijonojen käsittelyyn. Niihin kannattaa tutustua.

6   Lähteet ja lisälukemista

Tässä artikkelissa on nyt käyty sellaiset vi:n peruskomennot läpi, joilla voi aloittaa melko järkevästi vi:n käytön. vi on kuitenkin varsin monipuolinen editori ja paljon käyttökelpoisia ominaisuuksia on jäänyt mainitsematta. Toisaalta, kun peruskäyttö on hallussa, niin vähitellen voi opetella niitä todellisen tehokäyttäjän vi-toimintoja.

Etenkin Internet on pullollaan eritasoisia vi-oppaita. Google löysi 16.09.2000 hakusanoilla "vi tutorial" noin 64800 osumaa.

Suomenkielistä vi-materiaalia tuntuu löytyvän vähän heikosti, tässä kuitenkin pari melko linkitettyä URLia:

http://www.hit.fi/%7Elehtonen/Unix/unix26.htm
http://www.cs.joensuu.fi/pages/amanuenssi/computing_facilities/Ohjelmat-CS/vi/vi.html

Edellisestä löytyy aivan peruskomennot ja jälkimmäinen on laajempi lista vi:n komennoista.

Englanninkielisistä tutoriaaleista kannattanee mainita ainakin

http://www.eng.hawaii.edu/Tutor/vi.html
http://www.cis.udel.edu/%7Etotten/vi/
http://www.networkcomputing.com/unixworld/tutorial/009/009.html
http://www.thomer.com/thomer/vi/vi.html
Lisäksi Unixin komentokehotteessa "man vi" ja vi:n komentotilassa":help" auttavat tarvittaessa.

Tämä artikkeli löytyy myös PDF-tiedostona.

1
Itse asiassa tämä ei ole vi:n ominaisuus, vaan se löytyy joistain vi-klooneista, kuten vim-editorista. Monissa ympäristöissä vi:n sijaan komennolla vi käynnistyy kuitenkin vim, joten puskuriasia oli syytä mainita
2
Etsi-toiminto on oikeasti kuitenkin varsin monipuolinen ja lisätietoa siitä kannattaa etsiä vi:n dokumentaatiosta tai valmiiksi pureskeltuna erilaisista oppaista Internetistä.
3
Etsi-korvaa-toiminto on myöskin erittäin monipuolinen ja lisätietoa siitä kannattaa etsiä vi:n dokumentaatiosta ja etenkin Internetistä.

This document was translated from LATEX by HEVEA.