vi HOWTO

Av David Westlund, wlug.westbo.se

Då konfigureringen av ett UN*X system först och främst går ut på att ändra i vissa textfiler är det viktigt att behärska en texteditor. Det finns flera att välja mellan, tex Emacs och Pico. vi är dock den vanligaste texteditorn och också den som har störst spridning. Du kan hitta någon version av vi till alla UN*X:ar. Då nästan alla Unixanvändare någon gång kommer få se, eller få höra talas om, och antagligen även använda vi kan det vara ide att läsa denna HOWTO, även om man inte har tänkt använda vi som sin vanliga editor.

Varför vi fungerar som vi gör.

Tidiga editors var line editors. De var kraftfulla, och krävde inte mycket systemresurser. Ett bra exempel på ett sådan editor är ed. ed fungerade på följande sätt.

darkstar:~/# ed 
a
Detta är ett test.
.
w test
q
Nu ska vi se hur filen ser ut:
darkstar:~/# cat test
Detta är ett test.
Allting hamnade alltså inte i texten, utan mycket av det vi skrev var kommandon. a (add text) används för att säga till ed att vi vill skriva text till en fil. För att ed skulle börja ta det vi skrev som kommandon igen skrev vi . på en ensam rad.
w test
säger till ed att spara texten till filen test (w för write), och q används för att avsluta ed. vi utvecklades från lineeditorn ex, och kan ses som en vidareutveckling av den. Idag finns fortfarande ex kvar som i editorn vi som ett extra mode. Dessutom är allting som vi skriver efter ":" i editmode egentligen exkommandon.

Grunderna i vi

vi har två modes (förutom då lineeditor mode med ex). Ett insertmode då man skriver text till filen (som efter a i ed) och ett Editmode då man kopierar, sparar och tar bort text. Starta nu vi.
darkstar:~/# vi test2
Ni kommer nu se en massa ~ på skärmen. Om ni nu trycker på en massa knappar så kommer det att pipa en hel del. Detta beror på att ni befinner er i Editmode. Allt det ni skriver tar vi som kommandon. Då många av dessa kommandon inte finns klagar vi. Därav pipet. För att hamna i Insertmode (då man kan skriva text till filen) trycker ni på "a" Nu kan ni skriva vad som helst. Allt kommer upp på skärmen. När ni sedan har skrivit det ni vill skriva så är det dags att spara. Detta gör man i Editmode. För att hamna i Editmode trycker ni ESC. Sedan skriver ni
:w!
Nu är filen sparad. För att avsluta, skriv
:q
Då avslutas vi. Men bara om filen inte har ändrats sedan ni öppnade den eller sparade den senast. Om ni vill avsluta vi även om ändringar har skett i filen sedan senaste ändringen (och därmed gå miste om dessa ändringar), skriv
:q!
Avsluta och spara gör man genom att att skriva
:wq
Samma effekt får har ZZ i Editmode, utan något : innan.

Flytta markören

I Editmode finns det ett flertal kommandon att flytta markören med utan att behöva använda piltangenterna, och som snabbar upp hastigheten i editeringen av filen.
	h		Flytta markören ett tecken till vänster.
	j		Flytta markören ett tecken nedåt.
	k		Flytta markören ett tecken uppåt.
	l		Flytta markören ett tecken till höger.
	w		Flytta markören till början av nästa ord.
	e		Flytta markören till slutet av nästa ord.
	b		Flytta markören till början av föregående ord.
	0		Flytta markören till början av raden.
	^		Flytta markören till början av första ordet på raden.
	$		Flytta markören till slutet av raden.
	-		Flytta markören till början av föregående rad.
	+		Flytta markören till början av nästa rad.
	G		Flytta markören till slutet av filen.
	1G		Flytta markören till början av filen.
	nG		Flytta markören till rad n.
	"Ctrl-G"	Visa vilken rad markören står på.
	H		Flytta markören till första raden på skärmen.
	M		Flytta markören till mittenraden på skärmen.
	L		Flytta markören till sista raden på skärmen.
	n|		Flytta markören till column n.
Många av dessa kommandon går att använda med en siffra framför. Till exempel så placerar kommandot 5k markören 5 rader upp. Kommandot 5w flyttar markören till början av det 5 ordet framåt.
I stället för att använda PageUp och PageDown så kan man använda dessa tangentkombinationer för att scrolla upp och ner i texten.
	"Ctrl" f		Scrolla ner en skärm
	"Ctrl" b		Scrolla upp en skärm
	"Ctrl" d		Scrolla ner en halv skärm
	"Ctrl" u		Scrolla upp en halv skärm

Hamna i Insertmode

Om man ska kunna göra något vettigt med en fil så måste man ju kunna skriva till den. Och för att kunna skriva till en fil i vi måste man vara i Insertmode. För att skynda på editeringen av filen finns det ett flertal kommandon som får dig att hamna i Insertmode.
	a		Insertmode ett steg till höger om markören.
	i		Insertmode.
	A		Insertmode i slutet av raden.
	I		Insertmode framför första tecknet på raden.
	o		Insertmode på ny rad under markören.
	O		Insertmode på ny rad över markören.

Ta bort

I Insertmode finns bara DEL och BACKSPACE tangenterna om man vill ta bort text. Däremot finns flera olika kommandon att ta bort text med i Editmode.
	x		Tar bort tecknet under markören.
	d		Tar bort allting från markören till det ställe där markören skulle hamna när du använde
			kommandot 
	dw		Tar bort alla tecken fram till slutet det ord som markören står vid.
	dd		Tar bort den rad markören står på.
	D		Tar bort all text från markören till slutet av raden.
Alla dessa kommandon kan ha tecken före eller efter sig som gör det betydligt kraftfullare, och som lägger till nya funktioner till kommandot.
	nx		Tar bort n antal tecken under markören.
	ndd		Tar bort n antal rader.
	dnw		Tar bort n antal ord.
	dG		Tar bort alla tecken från markören till slutet av filen.
"d" kommandot kan användas med alla kommandon för att flytta markören. Effekten blir då att man tar bort det som finns mellan markörens ursprungliga läge och det ställe dit markören flyttas.

Klippa Klistra

För att klippa och klistra i Vi används dessa kommandon:
	v		Markera text.
	y		Kopiera.
	yy		Kopiera den aktuella raden.
	nyy		Kopiera n rader.
	wy		Kopiera ett ord.
	c		Flytta.
	p		Klistra in till vänster om markören.
	P		Klistra in till höger om markören.
	np		Klistra in n antal kopior till vänster om markören.
När man använder dessa kommandon så sparas det du klipper eller kopierar först i en allmän buffer. Denna kan användas av andra kommandon också, med det resultatet att det du nyss klippte eller kopierade inte går att klistra in. Ett betydligt säkrare sätt att klippa och klistra är att spara ner till olika buffers. Detta gör man genom att sätta namnet på buffern, som måste vara en bokstav, före kommandot. ex:
	ay		Kopiera text till buffer "a".
	fGy		Kopiera allt text från markören till slutet av filen till buffer "f".
	ap		Klistra in innehållet i buffer "a" till vänster om markören.
	fnP		Klistra in n antal kopior av buffer f till höger om markören.
Du kan även använda "d" kommandona (alltså de kommandon som du använder för att ta bort text med) till att flytta text till en buffer.
	dd		Flytta en rad till en buffer.
	add		Flytta en rad till buffer "a".
	adw		Flytta ett ord till buffer "a".

Sök

Du kan söka efter såväl en bokstav som hela meningar i vi.För att söka efter ett tecken används "f" och "t".
	fc		Ställer markören under nästa c till höger.
	Fc		Ställer markören under nästa c till vänster.
	tc		Ställer markören ett tecken till vänster om nästa c.
	Tc		Ställer markören ett tecken till höger om föregående c.
	;		Upprepa föregående f eller t kommando.
	,		Upprepa föregående f eller t kommando men åt motsatt håll.
För längre textrader används följande kommandon:
	/Text		Ställer markören i början på nästa "Text".
	?Text		Ställer markören i början av föregående "Text".
	n		Upprepa föregående / eller ? kommando.
	N		Upprepa föregånde / eller ? kommando åt motsatt håll.
När du söker i vi kan du använda ett antal olika wildcards.
	.		Motsvarar vilket tecken som helst. 
	n*		Motsvarar hur många som helst av tecknet "n".
	["Tecken"]	Motsvarar ett av de tecken som står innanför [].
	^		Tecken efter ^ måste stå i början av raden för att hittas.
	$		Tecken innan $ måste stå i slutet av raden för att hittas.
Sedan finns ["tecken"-"tecken"]. Då söker vi efter alla tecken från "tecken" till "tecken". [k-o] motsvarar alltså k, l, m, n eller o. Du kan även använda [^"tecken"]. Om du gör sökningen
/Ett[^a]
så söker den efter alla "Ett" som inte följs av ett "a".

vi har även möjligheten att söka och ersätta text. Detta görs med ex kommandon. Sökning och ersättning går till på följande sätt:

:"Var sökningen ska börja","Var sökningen ska sluta"s/"Vad som ska ersättas"/"Ersättningen"/g
Några exempel på sökning och ersättning:
:1,10s/Windows/Linux/g		 Söker efter alla "Windows" på de första 
				 tio raderna och ersätter dem med "Linux".

:1,$s/Hugo/Berlin/gc		 Söker igenom hela texten och ersätter alla
				 Hugo med Berlin, men frågar innan den ersätter.

:%s:/^D//g			 Tar bort alla D som står i början av en rad.

Multipel filredigering

Man kan arbeta med flera filer samtidigt i vi. Det gör man med kommandot:
:e 
vi kräver att du har sparat den fil du håller på med. Du slipper dock undan sparandet genom att skriva:
:e! 
Bara :e! utan något filnamn efter tar bort alla ändringar du har gjort i filen sedan du sparade senast.
Om du har en hel fil som ska in i den fil du arbetar med kan du använda ett annat kommando:
:r 
Då kommer hela filen att hamna där markören befinner sig. Om du istället använder :r! så hamnar outputen från kommandot där markören befinner sig.
:r! ls -l
Ovanstående rad listar alltså allt det som i vanliga fall skulle komma fram på skärmen när du skriver ls -l till filen.

Saker som inte fick plats under någon rubrik

Det finns dessutom några kommandon som jag inte kunnat få in någonstans bland de andra grupperna. Dessa är
	J		Får raden under markören att hamna efter
			den rad markören befinner sig på.

	:shell		Ger dig ett shell. Du kommer tillbaka
			till Vi genom att skriva "exit"
	
	:!"kommando"	Exekverar kommandot "kommando" och återgår
			sedan till Vi.

	~		Inverterar bokstaven över markören.
Detta är det av vi som jag känner till. Det finns mycket andra saker som denna något annorlunda editor är kapabel att göra. Om du tycker något saknas på listan, lägg då till det och maila din version av det hela till mig, eller skicka förslag på det som jag ska ändra. Är det något som är oklart i texten, något som är felaktigt, eller om du vill berömma mig för denna text, så ska du inte tveka på att maila:

David Westlund