VI

De VI(m) Tekstbewerker

Figuur 1. vi
vi met enkele plugins een een C++ sourcecode bestand geopend

Van Linux gebruikers wordt vaak beweert dat ze gepassioneerd zijn en bepaalde "hot topics" resulteren nog regelmatig in Flame Wars. Eén van deze hot topics zijn de tekstbewerkers (en niet tekstverwerkers, zoals MS Office en LibreOffice). vi(m) en emacs. Beide zijn extreem krachtige tools en gaan al heel lang mee. vi is gemaakt om dezelfde werkwijze te hebben als de gelijknamige vi editor op de oude UNIX® systemen en emacs is geschreven door Richard M. Stallman (RMS), de oprichten van zowel de Free Software Foundation en het GNU Project.

Figuur 2. De vim editor (Vi IMproved)
Als je wilt weten waarom we gekozen hebben voor vi(m) en niet voor emacs 1 hiervoor zijn enkele simpele redenen
  • vi wordt als onderdeel van een POSIX systeem beschouwd als een must en zal dus op iedere Linux distributie beschikbaar zijn vanaf de initiële installatie van de distributie, emacs is vaak niet standaard geïnstalleerd bij Linux distributies (Debian GNU/Linux bijv.)
  • Ik maak zelf gebruik van vi(m) en ben dus meer bekend met de werking van vi dan met emacs.

Als je als Linux beginner nu denkt "Waarom is een simpele tekst bewerker zo belangrijk" is het antwoord daarop zeer eenvoudig: Aangezien (bijna) alle configuraties in Linux gebeuren door het bewerken van simpele tekstbestanden, (het is zelfs zo dat bij Linux alles als een bestand aangezien wordt, dit lijkt misschien logisch maar bedenk dat ook toetsenborden, monitors, externe opslag, etc. etc. ook allemaal als bestanden gezien worden.) is het noodzakelijk om een goed programma te hebben dat je altijd kunt gebruiken en in het geval van vi(m) is dat zeker het geval. Een GUI tekstbewerker zoals Kate (KDE), GEDIT (Gnome), ATOM of de vele anderen is enorm handig, maar wat als je door een probleem moet opstarten in recovery modus en deze GUI programma's niet beschikbaar zijn.

Een andere goede reden voor vi(m) (en emacs) is dat deze 100% vanaf het toetsenbord bedient worden, je hoeft de muis niet aan te raken of je vingers van het toetsenbord te halen2, alles gebeurd via het toetsenbord en dit maakt een ervaren vi(m) (of emacs) gebruiker enorm efficiënt en snel. En er zijn veel plug-ins beschikbaar om bepaalde functionaliteit toe te voegen.

Het dient wel vermeld te worden dat hoewel we tegenwoordig nog steeds spreken over vi het naar alle waarschijnlijkheid niet vi maar vim is (Vi IMproved) een verbeterde versie door Bram Moolenaar. En er bestaat ook een GUI variant (Bij Debian beschikbaar in het vim-gtk pakket en op te starten met $ gvim).

Een voorbeeld van gvim:

Figuur 3. de gvim (vim-gtk) editor

Laten we nu beginnen met onze introductie voor vi(m) (dit is echt een introductie, het boek "Learning the Vi and Vim Editors" van O'Reilly media is meer dan 400 pagina's dus we zullen hier nooit de volledige lading kunnen dekken, maar we hopen te kunnen helpen met de basisprincipes van vi(m).

Help! hoe sluit ik vi(m) af ?

Dit is een veel gebruikte grap en verwijst naar het feit dat het niet zo simpel is om vi(m) te sluiten (in ieder geval als je niet weet hoe, anders is het heel simpel).

Maar eerst moeten we de 2 modi uitleggen welke vi(m) gebruikt:
  1. Command Mode
  2. Insert Mode

command modus worden de toetsen gebruikt om commando's uit te voeren (bijv ZZ slaat het bestand op en sluit vi af, dit is SHIFT ingedrukt houden en 2 keer op de Z drukken) een andere methode is :q! intypen in command modus. Dit zal het bestand NIET opslaan en enkel vi(m) afsluiten. het commando :q betekend afsluiten, maar als je aanpassingen hebt aangebracht krijg je een melding en moet je de ! toevoegen als je echt wil afsluiten zonder aanpassingen op te slaan.

Een voorbeeld van zo'n melding:

Figuur 4. Voorbeeld van foutmelding in vi en vim

En in Insert modus (zoals de naam doet vermoeden) kun je tekst en teken invoeren.

Tussen deze 2 modi schakelen doe je eenvoudig met de ESC toets (gaat terug naar command modus, als je daar al niet was) en met de i ga je naar insert modus (hoewel we later gaan zien dat er vele andere manieren zijn om naar insert modus te gaan, deze hebben elk hun speciale reden om te gebruiken).

Je kunt de volgende commando's gebruiken of vi(m) af te sluiten:
  1. :x sluit af en sla aanpassingen op.
  2. :w opslaan.
  3. :q sluit af zolang er geen aanpassingen gemaakt zijn.
  4. ZZ sluit af en sla aanpassingen voor zover deze gemaakt zouden zijn.
  5. :q! sluit af en negeer aanpassingen.

OPSTARTEN

vi opstarten doe je simpel met $ vi bestandsnaam of één van de volgende methodes:
  1. $ vi bestandsnaam : Bewerk het bestand bestandsnaam.
  2. $ vi -r bestandsnaam : Bewerk laatste versie van bestandsnaam na een crash.
  3. $ vi +n bestandsnaam : Bewerk bestandsnaam op regel n
  4. $ vi + bestandsnaam : Bewerk bestandsnaam op het einde van het document.
  5. $ vi +/str bestandsnaam : Bewerk bestandsnaam bij de eerste keer dat str voorkomt.

Merk op dat je met vi nooit het bestand zelf aanpast, maar een versie van het bestand in een "buffer" dit betekend dat aanpassingen pas worden geschreven tijdens het afsluiten (als je hiervoor kiest). Deze buffer zorgt er ook voor dat indien je het bestand meerdere keren tegelijkertijd opent in vi, of indien je een crash hebt gehad, vi een waarschuwing geeft dat er reeds een buffer bestaat. Je kunt dan kiezen om: het bestand in "alleen lezen" modus wil opstarten of "toch bewerken", "Herstellen", "verwijderen", "stoppen" of "Afbreken". Let hier goed op wat je kiest. Een voorbeeld van deze foutmelding:

Figuur 5. foutmelding bij het afsluiten van vi / vim

NAVIGATIE

Net zoals er meerdere manieren zijn om af te sluiten zijn er ook meerdere manieren om te navigeren door de pagina’s op, neer, links en rechts bewegen kun je met de pijltoetsen maar er zijn nog veel meer mogelijkheden:
  • h naar links.
  • j naar beneden.
  • k omhoog.
  • w navigeer naar het volgende woord.
  • W navigeer naar het volgende door spatie gescheiden woord.
  • b navigeer naar het begin van het woord.
  • B navigeer naar het begin van het door spatie gescheiden woord.
  • e navigeer naar het einde van het woord.
  • E navigeer naar het einde van het volgende door spatie gescheiden woord.
  • ( navigeer een zin terug.
  • ) navigeer een zin vooruit.
  • } navigeer een paragraaf terug.

  • { navigeer een paragraaf vooruit.
  • 0 (nul) navigeer naar het begin van de regel.
  • $ navigeer naar het einde van de regel.
  • 1G navigeer naar de eerste regen van het bestand.
  • G navigeer naar het einde van het bestand.
  • nG navigeer naar regel n van het bestand.
  • :n navigeer naar regel n van het bestand.
  • fc navigeer naar het volgende teken c in de regel (bijv. fV brengt je naar de eerstvolgende V).
  • Fc navigeer naar het vorige teken c in de regel.
  • H navigeer naar de bovenkant van het scherm.
  • M navigeer naar het midden van het scherm.
  • L navigeer naar de onderkant van het scherm.
  • % navigeer naar het geassocieerde teken (), {}, [] (bijv als je op de eerste ( van “defined(DEBUG)” staat zal % naar de bijbehorende ) brengen).
  • gg begin van het document.

zoals je bij oa. fc en Fc kunt zien hebben bepaalde toetsen een gelijkaardige maar andere betekenis afhankelijk van de “case” (hoofdletter of kleine letter) dit gaan we verder nog meer zien.

TEKST INVOEREN

Nu we door de tekst kunnen navigeren gaan we eens beginnen met het invoeren van nieuwe tekst:

  • i voer tekst in beginnend voor de cursor (i van insert).
  • I voer tekst in beginnend voor de regel.
  • a voer tekst toe beginnend na de cursor (a van append).
  • A voer tekst toe beginnen na de regel.
  • o begin een nieuwe regel na de huidige regel.
  • O begin een nieuwe regel voor de huidige regel.
  • r vervang 1 teken (r van replace).
  • R vervang meerdere tekens.
  • :r bestand – leest het bestand in, en voegt dit toe na deze regel
  • s wist het teken onder de cursor en zet insert modus aan (s van swap).
  • S wist de volledige regel en zet insert modus aan.
  • O overschrijf de volledige regel.
  • p put na de positie of regel.
  • P put voor de positie of regel.
  • C Herschrijf de hele regel.
TEKST VERWIJDEREN
  • x wis het teken rechts van de cursor.
  • X wis het teken links van de cursor.
  • D wis tot het einde van de regel.
  • dd wis de huidige regel.
  • :d wis de huidige regel.
  • :( wis de huidige regel.
  • ndw wis de volgende n woorden.
  • ndd wis de vorige n woorden.
  • :w,yd wis regels x t.e.m. y.
ZOEKEN EN VERVANGEN
  • / zoekpatroon zoek vooruit naar zoekpatroon.
  • ? zoekpatroon zoek achteruit naar zoekpatroon.
  • n vindt de volgende keer waar het zoekpatroon voorkomt (te gebruiken na / of ?).
  • N vindt de vorige keer waar het zoekpatroon voorkomt (te gebruiken na / of ?).
  • :set ic schakel Hoofdlettergevoeligheid uit tijdens het zoeken.
  • :set noic schakel Hoofdlettergevoeligheid in.
  • :g/str/cmd voer commando cmd uit op regels waar str voorkomt.
  • :%/ zoekpatroon/vervang/g vervangt zoekpatroon telkens door vervang (de /g op het einde betekend globaal).
  • * zoek naar de volgende keer dat het huidige woord voorkomt.
  • # zoek naar de vorige keer dat het huidige woord voorkomt.
  • :s/pt/str/vlag Vervang het patroon ptr met str. Mogelijke vlaggen:
    • g (globaal wissen).
    • c (vraag bevestiging voor vervangen).
    • & herhaal het vorige :s commando
KOPIEREN EN PLAKKEN
  • P Plak de inhoudt van het klembord.
  • yy kopieer (yank) een regel.
  • yw kopieer een woord.
  • y$ kopieer tot het einde van de regel.
ANDERE
  • u maak laatste verandering ongedaan (u van undo).
  • J voeg regels samen (J van Join).
  • nJ voeg de volgende n regels samen.
  • nJ voeg de volgende n regels samen.
  • . herhaal laatste commando.
  • U maak alle wijzigingen aan deze regel ongedaan.
  • :N open “split-screen”.
  • v visuele modus.
  • ctrl + c verlaat insert modus.

Dit is nog maar een klein deel van de vele dingen je met vi kunt doen, en bepaalde geavanceerde opdrachten (“Regular Expressions” of “RegEx” genoemd) kunnen in korte tijd en met enkele korte commando’s bepaalde aanpassingen uitvoeren sneller dan wat met een GUI tekstbewerker mogelijk is.

Het commando :%/ zoekpatroon/vervang/g is eigenlijk zo’n RegEx.

Verder zijn volgende eigenschappen ook noemenswaardig:
  • vi(m) is zeer aanpasbaar (natuurlijk door het configuratie bestand te bewerken met een tekstbewerker zoals vi) niet enkel het kleurenschema maar ook diverse werkingsmethoden.
  • vi(m) ondersteund “syntax highlighting” wat het gemakkelijk maakt om broncode van verschillende programmeertalen weer te geven (door gebruik van kleurcodes).
  • vi(m) kan uitgebreid worden met plug-ins.
  • als je graag genummerde regels hebt kun je dit per document activeren met :set nu of je kunt dit “permanent” activeren door aan het bestand ~/.vimrc een regel met set number toe te voegen (indien dit bestand niet bestaat, zal vi(m) het aanmaken.
Hier zijn enkele configuratie opties die mogelijk zijn:
  • set number zet regelnumering aan.
  • colo desert stel kleurenschema “desert” in.
  • De beschikbare kleurenschema’s zijn te vinden in /usr/share/vim/VIMVERSIE/colors (in mijn geval is dat /usr/share/vim/vim80/colors
Figuur 6. kleurenschema's voor "syntax highlighting" in vi en vim.

syntax on – zet “syntax highlighting” aan, vooral handig bij programmeren of shell scripting.

set showmode – toon de modus op het einde van de laatste regel.

set backup – laat vi(m) een backup gebruiken.

set backupdir=/private/tmp – geef aan welke directory moet gebruikt worden voor de backup.

set dir=/private/tmp – geef aan waar vi(m) de tijdelijke SWAP bestanden moet plaatsen.

set wrap – automatische terugloop.

etc.

Er zijn verschillende “Cheat Sheets” te vinden voor vi(m) met de meest gebruikte toetsen zodat je niet alles uit het hoofd moet leren. Ook zijn er vele voorbeelden van .vimrc bestanden met uitleg over wat de commando’s precies doen.

SCHERMAFBEELDINGEN

Hieronder vindt je enkele schermafbeeldingen van enkele van de te configureren instellingen in vi(m).

Het bestand /etc/apt/sources.list geopend in vi(m) zonder enige configuratie.

Figuur 7. /etc/apt/sources.list open in vi

Regelnummering ingeschakeld (commando :set nu in vi(m) of set number in ~/.vimrc).

Figuur 8. vi met regelnummering (:set nu) ingeschakeld.

Syntax Highlighting” ingeschakeld met :syntax of in vi(m) of syntax on in ~/.vimrc.

Figuur 9. vi met syntax highlighting ingeschakeld met :syntax on

Het “morning” kleurenschema ingesteld met :colo morning in vi(m) of colo morning in ~/.vimrc (:colorscheme morning werkt ook, maar waarom zou je meer willen typen dan nodig is ?)

Figuur 10. het "morning" kleurenschema (:colo morning).
Figuur 11. het "evening" kleurenschema

En het "blue" kleurenschema (om maar een paar voorbeelden te geven).

Figuur 12. het "blue" kleurenschema.

Denk er aan dat je al deze instellingen eenmalig kunt uitvoeren vanuit vi(m) of permanent kunt inschakelen in ~/.vimrc

Dit zijn nog maar enkele van de vele mogelijkheden (en kleurschema’s die online beschikbaar zijn). Zoeken naar colorschemes voor vi of settings levert vele resultaten op.

Hier staan bijv. nog enkele andere dingen die je kunt aanpassen in vi(m).

Meer informatie kun je altijd terugvinden in de manpages of de infopages

1 Sinds de publicatie van dit artikel is emacs reeds aan bod gekomen en toegevoegd aan dit boek.
2 In de tijd dan de originele vi-editor is ontwikkeld bestond de computer muis zelfs niet