Rövidítések és makrók
A vi alatt lehetőség van bizonyos billentyűkhöz megadott parancsokat vagy karakterszekvenciákat rendelni. E makrók, illetve rövidítések használata adott körülmények között sok felesleges munkától és gépeléstől menthet meg minket. Rövidítéseket a :ab (abbreviation) paranccsal definiálhatunk, feloldásukat pedig a :una (unabbreviation) paranccsal érhetjük el. (A parancsok teljes nevét is végiggépelhetjük, de ekkora mazochizmust egyik olvasónkról sem tételezünk fel, kiváltképp, ha a vi sem kényszerít erre minket...:-)
:ab
rövidítés kifejtés:una
rövidítésrövidítés jelzi az általunk használt kifejezést, kifejtés pedig a vi által behelyettesített kifejezést.
:ab ux SVR4 UNIX (TM)
hatására, valahányszor a szerkesztett szövegben az ux szót leírjuk, a vi az SVR4 UNIX (TM) mintát fogja a helyére behelyettesíteni. A rövidítés feloldását az
:una ux
paranccsal érhetjük el.
Makrókat a :map és :map! parancsokkal definiálhatunk. Formátumuk a következő:
:map m
makró_parancs:map! m
makró_parancsahol m a szóban forgó makróhoz rendelt billentyű, makró_parancs pedig maga a ténylegesen végrehajtandó makróutasítás. Az első formátum csak parancsmódban használható, azaz a vi beviteli módban nem értelmezi és fejti ki a makróutasítást. A második megadási forma esetén szövegbeviteli módban is értelmeződik a makró.
Mivel a vi az ábécé legtöbb betűjét lefoglalja parancsoknak, gyakran legalább akkora ügyességet igényel a makróhívó karakter kiválasztása, mint a makró megírása. makró_parancs írásakor vigyázzunk, hogy betűhelyesen írjuk a végrehajtandó utasításokat, épp úgy, mintha interaktívan gépelnénk be végrehajtáskor; ez többek közt azt jelenti, hogy az újsor karaktereket is meg kell adni a makróleírásban, ha a makróra tett parancsot is újsor karakterrel kell befejezni. (Ne feledjük a vezérlőkaraktereket a CTRL-V karakterrel levédeni!). Néhány példa, csak étvágygerjesztőnek (a betűhelyes megadás igénye miatt kivételesen minden leütött karaktert jelölünk):
:map
CTRL-V CTRL-X !}fold -s 72 CTRL-V CTRL-MA fenti makró a ^x karakterhez egy szövegtördelő makrót köt, ami a kurrens bekezdést a fold -s 72 paranccsal a megfelelő hosszúságú sorokra tördeli. (Mivel egy ex parancsot tettünk makróra, kell az újsor karakter a végén.)
:map t 1G!Guuencode tmp.uu
Ezt a makrót a sima t karakterhez kötöttük, hatására a kurzorral a fájl elejére megyünk, majd a végéig kijelölt részt (azaz az egész fájlt) ráengedjük az uuencode parancsra, s a kódolt változattal cseréljük le az eredetit. Vegyük észre, hogy ezzel ekvivalens (csak hosszabb) az alábbi makródefiníció:
:map t :%!uuencode tmp.uu
CTRL-V CTRL-MVégül az alábbi makró a ^a karakter hatására beszúr a fájl legelejére egy # Date: kezdetű sort, a napi dátummal:
:map
CTRL-V CTRL-A 1GO# Date: CTRL-V ESC :r !date CTRL-V CTRL-M JA fenti makró 1G hatására a fájl elejére áll, az O parancs hatására új sort szúr be a kurzor elé (tehát ez lesz az új első sor), beírja a fejrész szövegét, majd ESC karakterrel lezárja a sort (ekkor a kurzor az új sor végén áll). A :r parancs a date eredményét a kurzor utáni sorba szúrja be (a kurzor ettől még marad az első sorban), végül a J parancs segítségével a két új sort összevonjuk.