In deze tutorial beschrijven we een aantal "gevorderde" vi concepten en opdrachten, zodat je de kracht van vi kunt leren waarderen en dus beslissen hoe je je kennis van vi opdrachten kunt uitbreiden. Bijna alle vi referenties sommen de beschikbare opdrachten op, maar veel gaan er niet op in hoe de opdrachten met elkaar in verband staan; dit onderwerp is het hoofddoel van deze tutorial.
De vi cursorverplaatsingsopdrachten maken het mogelijk de cursor met een minimum aantal toetsaanslagen efficiënt in het bestand en/of op het scherm te positioneren. Er zijn heel veel cursorverplaatsingsopdrachten - probeer ze niet allemaal tegelijkertijd te onthouden! Later zullen we zien dat veel van de kracht van vi komt door het mixen van cursorverplaatsingsopdrachten met andere opdrachten om tekst te verwijderen, wijzigen, yanken (kopiëren), en filteren.
Wijzig alsjeblieft een groot tekstbestand (zoals bijvoorbeeld wknight) zodat je met iedere opdracht kunt experimenteren op 't moment dat 't wordt beschreven. Houd in gedachten dat deze opdrachten alleen in de Commando-modus werken, niet in de Insert Modus; als je "opdrachten" in je tekst krijgt, druk dan op de ESC-toets om naar de Commando-modus terug te keren.
Veel van de verplaatsingsopdrachten die hiervoor werden besproken kunnen worden voorafgegaan door een getal waarmee wordt aangegeven hoeveel maal de erna volgende opdracht moet worden herhaald; de verplaatsing wordt gewoon het gegeven aantal malen herhaald:
We hebben gezien dat dd de huidige regel verwijdert. Dit kan met een herhaling worden gebruikt: 3dd verwijdert drie regels, de huidige regel en de 2 daarop volgende regels.
De d opdracht kan als een "voorvoegsel" worden gebruikt met de meeste verplaatsingsopdrachten hierboven om bijna willekeurige stukken tekst te verwijderen. De verplaatsingsopdrachten worden "target specifiers" genoemd, als ze in combinatie met d worden gebruikt. Aan d kan een herhaling worden opgegeven. (Als je hiermee gaat experimenteren, denk er dan aan na iedere opdracht de u in te tikken om de verwijdering ongedaan te maken).
De c opdracht is vergelijkbaar met d, behalve dat het vi naar Insert mode laat schakelen, waarbij het mogelijk wordt de oorspronkelijke (ongewenste) tekst in iets anders te veranderen.
Plaats bijvoorbeeld de cursor aan het begin van een woord (druk op w om naar het begin van het volgende woord te gaan). Druk dan op cw om dat woord te wijzigen. Op het scherm zal het laatste teken in het woord dat wordt gewijzigd, worden vervangen door een $-symbool om de grens van de wijziging aan te geven; typ een nieuw woord in (je zult het oorspronkelijke woord op het scherm overschrijven) en druk de ESC-toets in als je klaar bent. Wat je invoert mag langer of korter zijn dan het woord dat wordt gewijzigd.
Plaats de cursor aan het begin van een regel bestaande uit op z'n minst drie woorden, en probeer c3w om drie woorden te wijzigen. Probeer c$ om tot het einde van de huidige regel te wijzigen. In alle gevallen wordt de grens aangegeven met $ daar waar de wijziging alleen effect heeft op de huidige regel.
Als een wijziging op meer dan alleen de huidige regel effect heeft, verwijdert vi de oorspronkelijke tekst van het scherm en schakelt over naar Insert-mode. Probeer bijvoorbeeld eens met c3+ de huidige en 3 volgende regels te wijzigen; vi verwijdert de vier oorspronkelijke regels van het scherm en schakelt over naar Insert-mode op een nieuwe blanco regel. Druk zoals gewoonlijk op de ESC-toets wanneer je klaar bent met het invoeren van je nieuwe tekst.
Een aantal andere wijzigingsopdrachten:
De y opdracht kopieert een kopie van tekst naar een buffer; de gekopieerde tekst kan dan met p of P elders in het bestand worden geplaatst (of geplakt).
De eenvoudigste vorm van yank is yy om de huidige regel te kopiëren; probeer na een yy een kopie van de gekopieerde regel na de cursor te plaatsen. Na een yy, kun je zoveel kopieën van de gekopieerde regel maken als je wilt door naar boven en naar beneden in het bestand te gaan en op p te drukken.
Probeer voor het kopiëren van meerdere regels bijvoorbeeld 5yy (kopieer de huidige en de volgende vier regels). p plaatst een kopie van de gekopieerde regels na de cursor; de reeks 5yyp "werkt" maar het is waarschijnlijk niet wat je wilt. De P opdracht is vergelijkbaar met p, maar het plaatst een kopie van de gekopieerde tekst voor de cursor; probeer de reeks 5yyP.
Andere kopieer-opdrachten:
De filteropdracht !, verwacht de naam van een UNIX-opdracht (wat een filter zou moeten zijn), en geeft de geselecteerde regels dan door aan het filter, waarbij de geselecteerde regels in de vi-buffer dan worden vervangen door de uitvoer van het filteropdracht. vi's vermogen om bijna willekeurige stukken tekst via iedere UNIX-filter door te geven voegt, zonder "extra kosten" aan vi een ongelofelijke flexibliteit toe.
Ter illustratie zal een aantal voorbeelden van hulp zijn. Maak in het bestand een regel met slechts het woord 'who' en absoluut geen andere tekst. Plaats de cursor op deze regel, en druk op !!. Deze opdracht is analoog aan dd, cc, of yy, maar in plaats van het verwijderen, wijzigen of kopiëren van de huidige regel, filtert het de huidige regel. Als je de tweede ! indrukt, gaat de cursor naar de linkerhoek aan de onderkant van het scherm en wordt een enkele ! getoond, daarbij wachtend totdat je de naam van een filter opgeeft. Typ als filternaam sh en druk op de Return-toets. sh (de Bourne shell) is een filter! Het leest van standaarinvoer, verwerkt zijn invoer (dat wil zeggen, voert opdrachten uit) en stuurt de uitvoer (de uitvoer van die opdrachten) naar standaarduitvoer. Het filteren van de regel met who via sh zorgt ervoor dat de regel met who wordt vervangen door een lijst met de huidige gebruikers op het systeem - direct in je bestand!
Probeer dit proces te herhalen met date. Dat wil zeggen, maak een regel met niets anders dan het woord date, plaats de cursor dan op deze regel, druk op !!sh en de Return-toets. De regel met date wordt vervangen door de uitvoer van de date opdracht.
Plaats de cursor op de eerste regel van de uitvoer van who. Tel het aantal regels. Stel bijvoorbeeld dat het aantal zes is. Selecteer dan deze zes regels om via sort te laten filteren; druk op 6!!sort en vervolgens de Return-toets. De zes regels zullen aan sort worden doorgegeven, en de zes oorspronkelijke regels worden door de uitvoer van sort vervangen.
De filteropdracht kan alleen op gehele regels worden toegepast, niet op tekens of woorden.
Nog wat andere filter-opdrachten (hier betekent, < CR > een druk op de Return-toets):
Je kunt regels en tekens markeren om te worden gebruikt als doel voor verplaatsing, verwijdering, wijziging, ze te kopiëren, of filteren met behulp van de opdracht mc, waar c staat voor een kleine letter.
Plaats de cursor bijvoorbeeld in het midden van een woord en druk op ma. Hiermee wordt het teken onder de cursor met a gemarkeerd.
Verplaats de cursor nu naar elders, weg van het gemarkeerde teken en naar een andere regel (gebruik de cursorpijlen, CTRL-u of iets dergelijks). Om naar de gemarkeerde regel terug te keren, tik je 'a in. (dat wil zeggen, een enkel aanhalingsteken en dan een a). Hierdoor wordt de cursor naar het eerste niet-blanco teken in de regel gemarkeerd met a verplaatst.
Ga weer weg van deze regel. Druk op `a (dat wil zeggen, een aanhalingsteken achterwaarts en dan een a) om naar het gemarkeerde teken terug te keren. Hierdoor wordt de cursor naar het teken gemarkeerd met a verplaatst.
Markeringen worden meestal gebruikt in combinatie met verwijderingen, wijzigingen, kopieer- of filteropdrachten. Verplaats de cursor bijvoorbeeld naar een andere regel dan die met de markering a en druk dan op d'a (d, een enkel aanhalingsteken en een a). Hiermee wordt de huidige regel tot en met de regel gemarkeerd met a verwijderd.
Plaats de cursor in het midden van een ander woord en druk op mb om de markering b in te stellen. Verplaats de cursor nu, weg van dat woord (maar slechts een paar regels, zodat je makkelijk kunt zien wat we aan het doen zijn), en druk dan op d`b (d, aanhalingsteken achterwaarts, b). Hierdoor wordt het huidige teken tot en met het teken gemarkeerd met b verwijderd.
Een ander voorbeeld is om de uitvoer van who te sorteren, markeer de eerste regel (ma), verplaats de cursor dan naar de laatste regel en druk op !'asort en dan de Return-toets.
Als je naar een markering springt en besluit terug te gaan naar waar je vandaan sprong, kun je '' intikken (ga terug naar regel ..) of `` (ga terug naar het teken ..).
Als je tekst verwijdert, wijzigt of kopieert, wordt de oorspronkelijke tekst (tot de volgende verwijdering, wijziging of kopieeropdracht) in een onbenoemde buffer opgeslagen van waaruit het kan worden opgehaald met p of P. Door gebruik te maken van de onbenoemde buffer, kan alleen de meest recente verwijderde, gewijzigde of gekopieerde tekst worden hersteld.
Als je meerdere delen van je tekst wilt verwijderen, wijzigen of kopiëren en je wilt ze allemaal onthouden (tot aan een maximum van 26), kun je voor de wijzigings- of kopieeropdracht aan een buffer een naam toekennen. De naam van een buffer heeft de vorm "c (dubbel aanhalingsteken, kleine letter c).
Tik bijvoorbeeld "ayy in om de huidige regel naar buffer a te kopiëren. Verplaats je vervolgens naar een andere regel en druk op "byy om die regel naar buffer b te kopiëren. Verplaats de cursor nu naar elders in het bestand en tik in "ap en "bp om kopieën van de tekst te plaatsen die in de buffers a en b zijn geplaatst.
Nog wat andere benoemde bufferopdrachten:
Gebruik de :s opdracht om een stuk tekst door een ander stuk tekst in regels door je hele bestand te vervangen. Wat substitueer voorbeelden:
Alle volgende opdrachten beginnen met een dubbele punt; als je de dubbele punt intikt, gaat de cursor naar de linkeronderkant van het scherm en wordt er een prompt, bestaande uit een dubbele punt, weergegeven, die wacht totdat je gereed bent met het invoeren van je opdracht.
Een aantal belangrijke voorbeelden:
Diverse opties hebben effect op de "feel" van vi. Je kunt alle diverse opties die kunnen worden ingesteld tonen met de opdracht :set all. Je kunt set ook gebruiken om opties te wijzigen.
Als je bijvoorbeeld regelnummers wilt zien voor de regel in het bestand wat je aan het wijzigen bent, gebruik je de opdracht :set number. Voor het uitzetten van de regelnummering, gebruik je de opdracht :set nonumber. De meeste opties kunnen worden afgekort. :set nu zet de regelnummering aan en :set nonu zet de regelnummering uit.
Met een :set nomagic, wordt de speciale betekenis van de reguliere expressie tekens (punt, asterisk, blokhaak, enz.) uitgeschakeld. Gebruik :set magic om de speciale betekenissen weer te herstellen.
Een aantal opties verwacht een waarde. :set tabstop=4 bijvoorbeeld zorgt ervoor dat tabs als vier spatie-tekens worden weergegeven in plaats van de gebruikelijke acht.
Als je bemerkt dat je bepaalde opties altijd op een bepaalde manier instelt, kun je de set opdrachten die je wilt in een bestand met de naam .exrc plaatsen, of je kunt de omgevingsvariabele EXINIT instellen om de gewenste opties in te stellen.
Als je login-shell bijvoorbeeld de Bourne-shell is, zou deze regel in je .profile bestand geplaatst kunnen worden:
EXINIT='set nomagic nu tabstop=4'; export EXINIT
setenv EXINIT 'set nomagic nu tabstop=4'
Als je bemerkt dat je keer op keer een serie eenvoudige opdrachten aanroept, kun je met de opdracht :map de serie opdrachten aan een ongebruikte opdrachttoets toekennen. Als in de toekenning controle-tekens zoals de Return-toets (CTRL-M in ASCII) of de ESC (CTRL-[ in ASCII), moeten worden opgenomen, laat dergelijke tekens dan voorafgaan door een CTRL-v om hun speciale betekenis te onderdrukken.
In bijvoorbeeld de hierna volgende opdracht wordt aan de opdracht CTRL-A toegekend dat de cursor 55 regels verder wordt geplaatst, dan weer terug wordt gegaan naar de regel met de minste tekens, waarbij die blanco regel wordt gewijzigd in een formfeed (CTRL-L) gevolgd door drie blanco regels. Dat wil zeggen dat iedere CTRL-A de volgende pagina zal pagineren, zonder dat paragrafen op meerdere pagina's worden gesplitst.
Noot: In deze opdracht wordt ieder controle-teken getoond als ^C, C is hierbij een hoofdletter. CTRL-M wordt bijvoorbeeld getoond als ^M. Wanneer je deze opdracht invoert, zul je ook de CTRL-v tekens zoals getoond, niet zien: iedere CTRL-v onderdrukt louter de gebruikelijke speciale betekenis van het volgende controle-teken, dus als je de reeks ^V^M intikt, zul je op het scherm slechts ^M zien. In deze opdracht, is ^M de Return-toets en ^[ is de ESC-toets.
:map ^A 55+?^$^V^Mcc^V^L^V^M^V^M^V^M^V^[
Je kunt met vi meerdere bestanden wijzigen, door als argumenten op de opdrachtregel, meerdere bestandsnamen op te geven:
vi croc fatherw wknight
Probeer bijvoorbeeld het volgende experiment: Ga eerst uit vi, start vi dan op met croc en wknight als argumenten:
$ vi croc wknight
/de < CR >
Kopieer deze regel naar buffer a:
"ayy
Ga nu naar het volgende bestand (je hebt geen wijzigingen aangebracht aan croc, dus dit werkt):
:n < CR >
Zoek naar de volgende regel met `de', zonder het opnieuw intikken van de zoekstring:
n
Plaats een kopie van buffer a na de huidige regel in wknight:
"ap
Ga twee regels naar beneden, en kopieer de huidige regel naar buffer b:
jj"byy
Sla de wijzigingen in wknight op
:w < CR >
Ga nu terug naar croc
:rew < CR >
Zoek nogmaals, en plaats een kopie van buffer b na de gevonden regel:
n"bp
Sla de wijzigingen op en beëindig vi
ZZ
Deze tutorial was bedoeld om wat van de mogelijkheden van vi te introduceren waar je in het systeemhandboek van vi misschien overheen zou kijken of die wellicht niet in het handboek worden vermeld (op de verschillende systemen zijn de handboeken van zeer verschillende kwaliteit).
Je zult na het lezen van deze tutorial geen vi-expert zijn, maar je kunt de mogelijkheden van vi dan wel juist inschatten. Slechts tijd en moeite kunnen een vi-expert van je maken. Maar de efficiëntie en alomvattenheid betalen dit op de lange termijn terug.
Mogelijk heb je besloten dat je vi haat. Het zij zo! Maar wees je er bewust van dat vi de standaard UNIX teksteditor blijft - de enige editor waar je op kunt rekenen dat het op ieder UNIX-systeem beschikbaar is - dus zelfs als je de voorkeur geeft om dagelijks iets anders te gebruiken, wordt je geadviseerd om bekend te zijn met het absolute minimum aan het vi-materiaal dat in deze tutorial is behandeld.