Pufferkezelés
Névtelen és nevesített pufferek
A vi a "fő" pufferen kívül, ahol a szerkesztett állományt tartja, még számos egyéb kiegészítő puffert is használ. Ezeknek elsősorban a komplexebb szövegmozgatásoknál, vagy a fájlok közti adatcserében láthatjuk hasznát.
A vi összesen 36 puffert bocsát rendelkezésünkre. Ezek között van egy névtelen, melyet automatikusan használunk minden olyan vi műveletnél, ahol valami módosult a fájlban; a változtatás által érintett, "elvesző", felülírandó szövegrészlet kerül ide. (Rövidesen látni fogjuk, hogyan nyerhetjük ki e puffer tartalmát.) A következő 9 puffert, melyekre a "n jelöléssel hivatkozhatunk (n a megfelelő puffer száma), szintén automatikusan használjuk, ugyanis ezekbe shiftelődik el a névtelen puffer tartalma minden egyes újabb puffermódosító műveletnél. Pontosabban fogalmazva, minden állománymódosítással járó parancsnál a frissen törölt szövegrész kerül a névtelen pufferba, ami eddig ott volt, az az egyesbe, és így tovább.
A maradék 26 pufferre (vagy másnéven regiszterre) a "c formulával hivatkozhatunk, ahol c az angol ábécé egy kisbetűje lehet.
A regiszterhivatkozásokat mindig az opcionális számparaméter után, de még a vi parancs előtt kell elhelyezni, így egy vi parancs legkomplexebb formája az alábbi lehet:
argumentum regiszter parancs szövegobjektum
A fentiekre mindjárt látunk példákat is.
Eddigi parancsaink közvetlen hatással voltak a szerkesztett fájlra, valamit töröltek, vagy valamit valamire cseréltek. Az alábbi parancsok a pufferkezeléssel kapcsolatosak.
yx |
A y (yank) parancs hatására az x szövegobjektum a névtelen pufferbe kerül. y a d parancshoz hasonlóan működik, az egyetlen eltérés, hogy a pufferbe tett részt nem törli eredeti helyéről. x az eddig megszokott módon kijelölhető tetszőleges szövegobjektum lehet. |
yy |
Az aktuális sort helyezi a névtelen pufferbe. |
p |
A névtelen puffer tartalmát a kurzor karakter mögé szúrja be. Ha a névtelen pufferben egy vagy több teljes sor szerepel, akkor a kurzort tartalmazó sor után helyezi el őket. |
P |
A névtelen puffer tartalmát a kurzor karakter elé szúrja be. Ha a névtelen pufferben egy vagy több teljes sor szerepel, akkor a kurzort tartalmazó sor előtt helyezi el őket. |
Ne felejtsük el, hogy a névtelen pufferbe explicit módon csak a y paranccsal pakolhatunk, viszont minden állománytörléssel járó parancs eredménye automatikusan oda kerül, esetlegesen felülírva az általunk ott elhelyezett szöveget. Célszerű ezért a yank paranccsal elhelyezett információt minél hamarabb kivenni a pufferből, vagy pedig a 26 regiszter valamelyikét használni, amelyeket az automatikus mentés nem érint.
Az alábbi példák a p és y parancsok használatát mutatják be:
xp |
Két karakter cseréjére alkalmas: törli a kurzor alatti karaktert (a kurzor a következő karakterre kerül), majd a névtelen puffer tartalmát (azaz a frissen törölt karaktert) a kurzor után helyezi el. Magyarul megcseréltük a két karaktert, például amla helyett alma került a fájlba. |
4y) |
A kurzortól kezdve négy mondatot a névtelen pufferbe másol. |
"4p |
A megelőző harmadik fájlmódosítás által elvesztett szöveget a kurzor mögé helyezi. |
"zd3w |
A kurzortól előre 3 szót töröltünk, s a z regiszterben helyeztük el. |
"zp |
A z regiszter tartalmát a kurzor mögé szúrtuk be. |
"ty`a |
A kurzortól az a jelzőpontig kijelölt részt a t regiszterbe másolja. |
A jelzőpontok és regiszterek használatával szinte határtalan lehetőségek nyílnak meg előttünk, fájlok tetszőleges részeit tudjuk kijelölni, és egy paranccsal mozgatni. Nem említettük még a regisztereknek azt a nagy előnyét, hogy az egyszerre megnyitott összes fájlból elérhetőek, azaz akár fájlok közti "húzd és vidd" (drag-and-drop) műveleteket is meg tudunk valósítani, ha eléggé "fapados" módon is. Alábbi példánk ezt szemlélteti.
Tegyük fel, hogy már megnyitottuk a file1 nevű állományt, s ennek egy részét szeretnénk áthelyezni a file2 állományba, mégpedig úgy, hogy a kutya és a macska szó első előfordulásai közti részt tesszük át file2-be, a haziallatok kezdetű sor után (az alábbi parancsok természetesen sorfolytonosan gépelhetőek, csak a jobb láthatóság miatt szeparáltuk őket külön sorokba, s kivételesen külön jelöltük az újsor karaktereket):
1G/kutya/
RETURNma
/macska/
RETURN"bd'a
:efile2
RETURN/haziallatok/
RETURN"bp
:e#
RETURNAz 1G/kutya/RETURN hatására a kurzor file1 első sorára áll, onnan megkeresi a kutya szót tartalmazó sort és rááll. Az ma parancs hatására elhelyez egy jelzőpontot ezen a soron. /macska/RETURN hatására rááll a macska szót tartalmazó sorra. "bd'a hatására törli a kurzortól az a jelzőpontig tartó szövegrészt, de a névtelen puffer helyett a b regiszterben helyezi el. :efile2RETURN hatására megnyitja file2-t is, /haziallatok/RETURN hatására rááll a haziallatok szót tartalmazó első sorra, végül "bp hatására e sor mögé beszúrja a b regiszter tartalmát. :e#RETURN hatására visszaáll file1-be, a kitörölt, macska szót tartalmazó sor utáni első sorra.