Den något enkla guiden till Vim

Referenser:

Vim (Vi IMproved) är en av de vanligast förekommande textredigerarna på *nix-system. Om du inte vet vad ett *nix-system är så är du redan ute på hal is, läs på lite här exempelvis och återkom sedan. Lämpliga sökord är unix och linux. Obs! Vim är inte en ordbehandlare, den är en textredigerare och ett programmeringsverktyg.

Anledningen till varför jag bestämde mig för att lära mig Vi (och så småningom Vim) var för att jag installerade en Linux-distribution som endast hade Vi som redigerare i grundinstallationen. Plötsligt befann jag mig i situationen att jag inte kunde redigera de rätta inställningsfilerna för att få igång nätverket och tanka ner en annan redigerare från nätet, eftersom jag inte visste hur man använde Vi. Lite moment 22 med andra ord.

Vim är kraftfullt med många bra-att-ha-funktioner, och den kanske största anledningen till varför jag föredrar den framför exempelvis Emacs är att kommandona i Vim är logiska för mig, till skillnad från Emacs.

Tre lägen

Det kanske mest förvirrande med Vim i början är omställningen till att arbeta i olika "lägen". Om man är bekant med ämnet människa-dator-interaktion (MDI) så är det detta man försöker undvika när man konstruerar system med "modeless interaction", något man blankt struntat i när det gäller Vim.

I Vi/Vim finns tre lägen:

kommandoläge Redigeringsläget eller ursprungsläget som man alltid kommer tillbaka till genom att trycka ESC.
i inmatningsläget (från engelska "insert") då Vi/Vim fungerar som en vanlig textredigerare.
v visuellt läge (från engelska "visual"). Används för att markera text som man sedan kan ta bort, kopiera m.m. Shift-V för radvis markering.

Kommandon

Det är i Vims redigeringsläge som man kommer åt den mer kraftfulla funktionaliteten. Detta gör man genom att ange kommandon, vilka i sin tur går att dela upp i olika typer.

Typ 1 - metakommandon

Dessa är kommandon som påverkar filen man redigerar, Vim eller liknande. Med några få undantag påverkar dessa inte själva texten man redigerar. Gemensamt för dessa är att de alla påbörjas med ett ':' (kolon).

:q Avslutar Vim (från engelska quit). Kan ta argument såsom '!' (utropstecken).
:w Sparar filen man arbetar med (från engelska write). Kan ta argument såsom ett filnamn: :w minfil.p. Obs! Inte samma sak som 'spara som'.
:wq Skriver till fil och avslutar.
:help Öppnar Vims inbyggda hjälptexter (omfattande!), avslutas lämpligtvis med :q.

Typ 2 - redigeringskommandon

Dessa kommandon används för att påverka själva texten. De behöver inte föregås av ett ':' (kolon). De kan ofta följas av ett argument av något slag. Dessa argument kan dessutom vara sammansatta i vissa fall.

d<arg> Radera (från engelska delete).
d<piltangent> Radera ett steg i piltangentens riktning; sidled = ett tecken, höjdled = en rad.
dw Radera till slutet av nuvarande ord (w från engelska word).
dd Radera hela raden.
y<arg> Kopiera (från engelska yank, dvs. 'ryck').
y<piltangent> Rycker (kopierar) ett steg i piltangentens riktning; sidled = ett tecken, höjdled = en rad.
yw Rycker (kopierar) till slutet av nuvarande ord (w från engelska word).
yy Rycker (kopierar) hela raden.
u Ångrar det man just gjorde (från engelska undo). Kan utföras flera gånger för att ångra X antal saker man just har utfört.
p Klistrar in (från engelska put) det man just kopierade eller raderade (y och d) på platsen efter markören. Om man har kopierat en hel rad(er) klistras den in på nästkommande rad.

Nyttiga saker

Här följer en del av de saker jag ofta använder mig av.

Sökning och ersättning

Sökning samt ersätning av ord, uttryck m.m. liknar mycket det som används i t.ex. perl för s.k. regex (regular expressions).
Sök & ersätt
/<ord-uttryck>/ Sök/matcha ord/uttryck (jmf. perl)
:s/<ord-uttryck>/<ord2-uttryck>/<växel> Radvis sök-ersätt ord/uttryck (jmf. perl)
:%s/// sök-ersätt i hela dokumentet
& Upprepa senaste ersättningen.

Sökuttrycken kan man dessutom modifiera med s k växlar enligt mallen :s/<args>/<args2>/<växel>

Växlar
g Sök och ersätt hela raden, normalt ersätts endast första förekomsten.
c Bekräfta vid varje sökning.
i Ignorera skiftkänslighet vid sökning/ersättning (från engelska case insensitive).

I sökuttryck räknas dessutom vissa tecken som specialtecken för att skapa mer avancerade sökuttryck. Om man då vill ersätta just dessa tecken måste man ange att de inte ska vara speciella (och vice versa i vissa fall) m h a "\"-tecknet vilket har föranlett det som kallas leaning toothpick syndrome när det rör sig om riktigt avancerade sökuttryck. Här kan man läsa mer om regex (visserligen för Perl men skillnaden är inte så stor).

Exempel på enkla sökuttryck:
:s/</\&lt;/g Ersätter alla < på en hel rad med &lt; som är html-kodningen för det tecknet.

Buffert- och fönsterhantering

I Vim kan man samtidigt redigera flera filer i olika fönster samt växla mellan olika filer (buffertar).

Buffertar
:e filnamn Öppnar ny buffert med filen filnamn
:e #N Växlar till buffert med nr N.
Fönsterhantering
Ctrl-W <piltangent> Växla fönster
Ctrl-W s Dela horisontelt (från engelska split).
Ctrl-W v Dela vertikalt (split vertical)
:help windows-intro Öppnar hjälpavsnittet om fönster i Vim.

Övriga tips

Gott & blandat
=G Autoindenterar allting från markören framåt/neråt.
=H Autoindenterar allting från markören bakåt/uppåt.

Persistenta miljövariabler

I Vim finns ett otal olika miljövariabler som kan sättas. Om man vill att dessa ska bestå kan man skriva in dem i en inställningsfil som på *nix-system oftast heter .vimrc. Den ligger oftast rotkatalogen för ens användarkonto.

Här är min .vimrc-fil:

	    # #-tecken anger en kommentar

	    # för syntaxfärgning av html, c, c++, java etc.
	    syntax on

	    # sätter tabbavstånd till 8 (=default)
	    set tabstop=8

	    # sätter mjuka tabbstoppar redan vid 4 för kod-
	    # indenteringens skull
	    set softtabstop=4

	    # som ovanstående ungefär
	    set shiftwidth=4

	    # för att möjliggöra autoindentering
	    filetype plugin indent on
	

För att åstadkomma syntaxfärgning direkt i programmet som i ovanstående skriver man helt enkelt :syntax on, dock blir detta inte persistent bortom nuvarande session.


last update: