Mire jó a vi?
Hihetetlen, de a vi a visual rövidítése, merthogy ez egy "screen-oriented
(visual) display editor based on ex" (man vi). A sor-orientált szerkesztőkhöz
képest ez mindenképpen igaz. Felmérhetetlen előnye, hogy gyakorlatilag minden
*NIX-on rajta van. Gyakorlott vi-osok sokkal gyorsabban tudnak vele dolgozni,
mint bármelyik másik, korszerű, grafikus felületű szövegszerkesztővel.
A vi üzemmódjai
Ellentétben a normális szövegszerkesztőkkel, alaphelyzetben mindig parancsot
vár (parancsmód), nem a szöveget. Ahhoz, hogy a szöveget elkezdhesd gépelni, ki
kell adni egy parancsot (pl. i vagy c), ekkor kerülsz inzert módba.
A vi-nak két üzemmódja van: az egyikben sípol, a másikban nem.
(ismeretlen kezdő vi-os)
Talán helyesebb az a szemlélet, hogy csak egy üzemmódja van, a parancsmód,
viszont néhány parancs (ilyen pl. a beszúrás) argumentumát (ti. a szöveget,
amit beszúrsz) escape-pel kell lezárni.
Van olyan parancs, amit csak be kell gépelni¸ másokat a kettősponttal nyitott
parancssorba lehet írni.
A lényeg:
Ha nem tudod mi van, nyomj escape-et amíg sípolni nem kezd, akkor parancsmódban vagy.
A vi indítása
vi file
Csak olvasásra:
view file
Linuxon a vi általában egy link és valójában a vim indul el. Ha sima (vanilla)
vi-ra vágyik valaki, akkor valószínűleg az nvi-ra van szüksége.
Mozgás
Ha szerencsénk van, működnek a nyilak és a PgUp/PgDown. Ha nem, akkor vagy
megcsináljuk, hogy menjen, lásd lejjebb, vagy:
| h | balra
|
| l | jobbra (kis L betű)
|
| j | le
|
| k | fel
|
| Ctrl-f | egy oldal előre (forward)
|
| Ctrl-b | egy oldal vissza (backward)
|
Ha okosabban akarunk mászkálni:
| 0 | (nulla) a sor elejére
|
| ^ | a sor első nem-whitespace karakterére
|
| $ | a sor végére
|
| w | egy szót előre
|
| b | egy szót hátra
|
| } | bekezdés végére (a bekezdéseket a vi szerint egy üres sor választja el egymástól)
|
| { | bekezdés elejére
|
| % | ha zárójelen állunk, átugrik a párjára (nyitóról záróra és fordítva)
|
| fu | előre az első u betűig (soron belül)
|
| Fa | vissza az utolsó a betűig
|
| ti | előre az első i előtti karakterig
|
| Te | vissza az utolsó e utáni karakterig
|
A vi-ban a legtöbb parancshoz meg lehet adni, hogy hányszor hajtódjon végre, így lehet még az előzőnél is okosabban mozogni:
| 3j | 3 sort le
|
| 4w | 4 szót előre
|
| 3Ctrl-f | 3 oldalt előre
|
Adott pozícióra ugrani:
| :34 | a 34. sorra ugrik
|
| 34G | ez is
|
| :$ | az utolsó sorra ugrik
|
| G | szintén
|
| Ctrl-g | megmutatja, melyik sorban vagy
|
| 15| | (pipe) a 15. oszlopba ugrik
|
Keresés
| /valami | keresés előre
|
| ?valami | keresés hátra
|
| n | ugrás a következő találatra
|
| N | ugrás az előző találatra
|
A valami egyébként egy szabályos kifejezés (azaz regular expression) ami végtelen távlatokat nyit meg a gondolkodó ember előtt...
Kilépés
| :q | kilép
|
| :q! | kilép mentés nélkül, akkor is ha módosítottad a fájlt (pánik)
|
| :w | ment
|
| :w! | csakazért is ment, akkor is, ha csak olvasásra nyitottuk meg a fájlt, vagy ha csak olvasható, de van írásjogunk
|
| :wq | ment, majd kilép
|
| :x | ment ha kell, majd kilép
|
| ZZ | szintén
|
Kis módosítások
Mielőtt még bármit módosítanánk:
| u | undo - utolsó változtatás, ha mégegyszer megnyomod, akkor meglepő módon redo-t (undo undo) csinál
|
| . | redo - az utolsó módosítást ismétli. u után redo undo, azaz ha egy lépésnél többet (maximum tízet) akarsz undo-zni, akkor a pontot kell nyomkodni
|
| U | undo - az aktuális sorban történt változtatások visszacsinálása, ez csak addig megy, amíg ki nem megyünk a sorból
|
Sajnos ennyit tud a vi, ezért érdemes, ha csak lehet a vim-et használni, ott korlátlan undo van.
Szöveg beszúrása és módosítása sokféleképpen történhet, a lényeg, hogy ilyenkor
mindig inzert módba kerülünk, azaz a vi azt várja tőlünk, hogy gépeljük be a
beszúrandó szöveget, és ha befejeztük, nyomjuk meg az escape-et.
Az inzert mód elsőre ijesztő, mert kurzort nem lehet mozgatni benne, ha odébb
akarsz menni, ki kell lépni parancsmódba az escape-el. Inzert módban egyet
lehet: visszatörölni a backspace-el, ha elgépeltél valamit. Ilyenkor ne lepődj
meg, az előzőleg begépelt szöveg ott marad, de csak addig, amíg felül nem
írjuk, vagy kiszállunk az inzert módból (igen, az escape-pel).
Soremeléssel lehet új sort kezdeni, sorvéget törölni azonban nem lehet a
backspace-el, mint máshol, sőt, inzert módban egyáltalán nem lehet, erre külön
parancs van, a J (join).
Beszúrás
Nézzük akkor, hogy vehetjük rá a vi-t, hogy végre azt mutassa, amit gépelünk (ezek mind inzert módba tesznek):
| i | szöveg beszúrása a kurzor elé (insert)
|
| a | szöveg beszúrása a kurzor mögé (append)
|
| I | szöveg beszúrása a sor elejére
|
| A | szöveg beszúrása a sor végére
|
| o | új sor nyitása a kurzor alatt
|
| O | új sor nyitása a kurzor felett
|
Törlés
| x | kurzor alatti karakter törlése (Del)
|
| X | kurzor előtti karakter törlése (Backspace)
|
| 3x | három karakter törlése
|
| D | törlés a sor végéig
|
| dd | az egész sor törlése
|
| 5dd | öt sor törlése
|
A törlésre azonban alapvetően a d (delete) parancsot használjuk. Önmagában ez
nem működik, viszont a vi egyik legszebb tulajdonsága, hogy a paracsokat
kombinálni lehet egymással, például a törlést a mozgással, lássunk erre néhány
példát:
| d0 | törlés a sor elejéig
|
| d$ | törlés a sor végéig, ugyanaz mint D
|
| de | szó törlése előre (a szó végéig töröl)
|
| dw | szó törlése előre (a következő szó elejéig töröl)
|
| db | szó törlése hátra (a szó elejéig töröl)
|
| 3dw | a következő 3 szó törlése (sorvégen át is)
|
| d} | törlés a bekezdés végéig
|
Sőt, mivel strapás dolog a sorokat számolgatni ha sokat akarunk törölni, ilyet is lehet:
| d/valami | törlés előre, amíg valami-ig nem érünk (valami megmarad)
|
| d?valami | törlés hátra, valami-t is beleértve
|
Ismét felhívom a figyelmet a valami szabályos kifejezés voltából következő
határtalan lehetőségekre.
Átírás
A d párja, a c (change), a vi egyik leghasznosabb parancsa. A c ugyanaz, mintha
a megfelelő d-s parancs után nyomnál egy i-t, azaz a törlés után inzert módba
rak. Lássuk:
| c0 | a kurzor és a sor eleje közti szöveg átírása
|
| c$ | a kurzor és a sor vége közti szöveg átírása
|
| C | szintén
|
| cw | átírás a szó végéig
|
| 3cw | a következő 3 szó átírása
|
További parancsok:
| r | a kurzor alatti karakter cseréje egy másikkal (replace)
|
| s | a kurzor alatti karakter helyettesítése bármennyi karakterrel (substitute, inzert módba tesz)
|
| 3s | a következő három karakter helyettesítése bármennyi karakterrel (inzert módba tesz)
|
Kivágás
Ez lényegében maga a d parancs, amit ezzel törlünk, az a vágólapra kerül.
Másolás
Az y (yank) paranccsal lehet valamit a vágólapra másolni. Pontosan úgy kell használni, mint a d-t:
| yy | az egész sor a vágólapra
|
| Y | ugyanaz
|
| 5yy | Öt sor a vágólapra
|
| y0 | kurzortól a sor elejéig a vágólapra
|
| y$ | kurzortól a sor végéig a vágólapra
|
| yw | szó másolása előre (a kurzortól a szó végéig a vágólapra)
|
| y/valami | kurzortól valami-ig a vágólapra
|
és így tovább...
Beillesztés
Ez marha bonyolult lesz:
| p | vágólap tartalmának beillesztése a kurzor után (paste)
|
| P | vágólap tartalmának beillesztése a kurzor elé
|
Csere
A csere (substitute) általános formája :[tartomány]s/mit/mire/[opciók]. A mit
egy szabályos kifejezés. Opciók közül egyet jegyezzünk meg: a g-t, enélkül csak
a soron belüli első előfordulását cseréli le a vi a mintának. Lássunk néhány
egyszerű példát:
| :s/true/false | az aktuális sorban a true első előfordulását false-ra cseréli
|
| :s/true/false/g | az aktuális sorban a true minden előfordulását false-ra cseréli
|
| :%s/true/false/g | a teljes fájlban
|
| :1,$s/true/false/g | szintén
|
| :.,$s/true/false/g | a kurzor sorától a fájl végéig
|
| :1,.s/true/false/g | a fájl elejétől a kurzor soráig
|
Több fájl
Több fájl megnyitása:
vi file1 file2 file3
Indulás után az első fájlt látjuk. A következő parancsokat lehet használni a fájlok közti váltáshoz:
| :n | következő fájl
|
| Ctrl-^ | váltás az utolsó két fájl között
|
| :rew | vissza az első fájlra
|
| :arg | alul megmutatja a nyitott fájlok nevét, az aktuális szögletes zárójelek közt
|
Könyvjelzők
26 darabot lehet letenni, a-z-ig minden betű használható. Kétféleképpen lehet
ugrani egy könyvjelzőhöz, a ` (backtick) vagy a ' (aposztróf) paranccsal. A
backtick pont a lerakott markerre ugrik, az aposztróf a marker sorának első,
nem whitespace karakterére.
A könyvjelzők ugyanúgy használhatók pl. másoláshoz mint más, mozgásparancsok,
ha sok sort kell másolni, egyszerűbb, mint számolgatni. Tehát:
| ma | lerakja az a markert.
|
| `a | ugrás a-hoz
|
| 'a | ugrás a sorába
|
| y`f | másolás a kurzortól az f markerig
|
| d'd | törlés a d marker soráig
|
Másolás fájlok közt
A vágólapra másolás fájlok között nem működik, hogy ez bug-e vagy feature azt
mindenki döntse el maga. Van viszont 26, az angol ABC betűivel jelölt buffer,
amiket lehet erre a célra (is) használni. Ilyenkor minden copy/paste
utasításnál meg kell mondanunk a vi-nak, hogy melyik buffert használja:
| "aY | az a bufferbe másolja az aktuális sort
|
| "AY | hozzáadja az a bufferhez az aktuális sort!
|
| "ap | a-t bemásolja a kurzor után
|
| "b10yy | b-be másolunk a kurzor sorától kezdve 10 sort
|
| "cy`f | másolás a c-bufferbe a kurzortól az f markerig
|
| "cP | c tartalmának beszúrása a kurzor elé
|
A 26, betűvel jelölt bufferen kívűl van 10, számmal azonosított bufferünk (0-9)
is. A 0-ás a vágólap, ezen dolgoznak a dd, yy, p parancsok. Az 1-9 bufferek
mindig az utolsó 9 törölt szöveget tartalmazzák, ha törlünk valamit, az az
1-esbe kerül, a 9-es elveszik, az 1-es a 2-esbe másolódik, és így tovább. Az
1-es ugyanaz, mint a 0-ás, de lehet fájlok között is használni. Ezekre ugyanúgy
idézőjellel lehet hivatkozni, mint a betűsekre. Nézzük:
| "0p | ugyanaz, mint p
|
| "ap | a-t bemásolja a kurzor után
|
| "b10yy | b-be másolunk a kurzor sorától kezdve 10 sort
|
| "cy`f | másolás a c-bufferbe a kurzortól az f markerig
|
| "cP | c tartalmának beszúrása a kurzor elé
|
Makrók
A :map-pel egy billentyűhöz rendelhetünk tetszőleges parancsokat (a kettőspontot és az u-t nem lehet átdefiniálni). Adott például a következő kódrészlet:
m_action = action;
m_subsystem = subsystem;
m_eventTrigger = eventTrigger;
m_subEventTrigger = subEventTrigger;
Tegyük fel, hogy éppen a fordított értékadásokra lenne szükségünk, de baromi
lusták vagyunk, a rejtvényeket viszont szeretjük. Ezért a definiáljunk a q-ra
(a vi-ban nem használt) egy makrót, ami felcseréli nekünk a két azonosítót:
| :map q ^2x2wim_^[ | buta, egyszerű
|
| :map q "adedf f;Pt;"ap | intelligens, bonyolult
|
Figyeljük meg, hogy az első változatban az inzert módból való kilépéshez
szükséges escape-et a ^[ karaktersorozat jelzi. Ezt és a többi vezérlőkaraktert
úgy lehet előállítani, hogy a megfelelő billentyű (esetünkben az Esc) lenyomása
előtt egy Ctrl-v-t nyomunk.
Másik megoldás az a-z bufferek használata a makrókhoz:
@a az a buffer tartalmát parancskén értelmezi
Billentyűzet átdefiniálás
A :map kiválóan alkalmazható a nyilak, PgUp, PgDown, Home, End gombok életrelehelésére is. Pl:
| :map ^[[6~ ^F | a PgDown-hoz rendeli a Ctrl-f-et.
|
A ^[[6~ hieroglifa a Ctrl-v majd a PgDown lenyomásával állítható elő, a ^F
egyszerűen egy Ctrl-f. Ezeket be lehet tenni az ~/.exrc-be is, az ebben leírt
parancsokat a vi induláskor lefuttatja. Pl. a
map ^[[6~ ^F
map ^[[5~ ^B
map ^[OD h
map ^[OC l
map ^[OA k
map ^[OB j
tartalmú .exrc fájl definiálja nekünk a négy nyilat és a PgUp/PgDown gombokat,
de ez gépfüggő. A kontrolszekvenciákat persze itt is a Ctrl-v-vel kell
beadogatni.
Beállítások
A :set paranccsal a mindeféle, a vi működését befolyásoló opciót állíthatunk
be. A kétállapotú opciók beállítása a :set valami, törlése a :set novalami
paranccsal történik. Lássuk a leghasznosabbakat:
| :set all | megmutatja az aktuális beállításokat
|
| :set showmode | a jobb alsó sarokba mindig kiírja, ha inzert vagy átírási módban vagyunk (CHANGE/INSERT MODE)
|
| :set noautoindent | kikapcsolja az autoindentet. Baromi hasznos, amikor xterm-ek között a középső egérgombbal másolunk, nem lesz lépcsőzetesen eltolva a bemásolt szöveg
|
| :set noai | ugyanaz
|
| :set number | beszámozza a sorokat
|
| :set ic | kereséskor nem különbözteti meg a kis és nagybetűket (ignorecase)
|
Persze az állandóan használt opciókat is be lehet tenni a .exrc-be.
Egyéb hasznos parancsok
| . | (pont) megismétli az utolsó parancsot
|
| !parancs | kilép a shellbe és végrehajtja a parancsot
|
| & | Megismétli az utolsó csere parancsot
|
| ; | Megismétli az utolsó f, F, t vagy T parancsot
|
| , | Utolsó f, F, t vagy T parancs, de visszafelé
|
A vim
A vim a vi improved, azaz továbbfejlesztett változata, ma már ez is
hozzáférhető minden létező operációs rendszeren, a Linuxokban
szériafelszerelés. Mindent tud, amit a vi, az életet legjobban megkönnyítő
fejlesztések a következők:
- korlátlan undo és redo (Ctrl-r)
- több buffer és ablak
- inzert módban lehet mozogni a nyilakkal
- makrók könnyen rögzíthetők
- Vizuális mód
- Parancssor történet
Több fájl
Akár a vi-ban, itt is lehet több bufferünk nyitva. A különbség, hogy itt
működik a vágólap fájlok között. A bufferek közötti váltás is gördülékenyebben
megy:
| :e | file megnyitja file-t egy új bufferban, a tabbal való kiegészítés működik, akár a bash-ben
|
| :e . | megnyitja az aktuális könyvtárat egy bufferban, ahol kedvünkre lépkedhetünk a fájlrendszerben, keresve, amit meg akarunk nyitni
|
| :ls | kilistázza a buffereket
|
| :b2 | a 2-es bufferre lép
|
| :q | bezárja az aktuális buffert (a listában megmarad)
|
| :bd | bezárja és a listából is törli az aktuális buffert.
|
Ablakok
| :split | az aktuális ablakot vízszintesen kettéosztja
|
| :vsplit | az aktuális ablakot függőlegesen kettéosztja
|
| Ctrl-w nyíl | a nyíl szerinti irányban levő ablakba ugrik
|
| Ctrl-w + | egy sorral megnöveli az aktuális ablak méretét
|
| Ctrl-w - | egy sorral csökkenti az aktuális ablak méretét
|
| Ctrl-w 4+ | 4+ négy sorral megnöveli az aktuális ablak méretét
|
| Ctrl-w > | egy oszloppal növeli az aktuális ablak méretét
|
| Ctrl-w < | egy oszloppal csökkenti az aktuális ablak méretét
|
Vizuális mód
A vizuális mód lehetőséget ad arra, hogy jól láthatóan kiválasszuk azt a
szövegrészt, amin a következő műveletet akarjuk végrehajtani. Nincs szükség a
sorok számolgatására vagy fifikás mozgásparancsok kitalálására, a hülye is ki
tud jelölni bármit egyszerűen. A vizuális módot a következőképpen használjuk:
- bekapcsoljuk a vizuális módot, ezzel egyben az aktuális kurzorpozíció
helyén ki is jelöltük a szövegblokk egyik határát.
- bármilyen mozgásparanccsal kijelöljük a blokk másik határát
- a kijelölt szöveggel csinálunk valamit, másolunk, kivágunk, stb.
Vizuális mód tulajdonképpen háromféle van, a bekapcsolás módjától függően, az
aktuális módot a státuszsor jelzi:
| v | normál mód (VISUAL), kijelölés karakterenként
|
| Shift-v | sor mód (VISUAL LINE), kijelölés soronként
|
| Ctrl-v | blokk mód (VISUAL BLOCK), négyszögletes terület jelölhető ki
|
A kijelölés után leggyakrabban az x (kivágás) és y (másolás) parancsokat
használjuk. Néhány érdekesebb vizuális módbéli parancs még:
| > | jobbra tolja a kijelölt szövegrészt
|
| < | balra tolja a kijelölt szövegrészt
|
| ~ | megfordítja a kijelölést, kisbetűből nagyot csinál és fordítva
|
| u | a kijelölést kisbetűsre konvertálja
|
| U | a kijelölést nagybetűsre konvertálja
|
| A | ha blokk módban vagyunk és a blokk végét a $ paranccsal (sor vége) jelöltük ki, akkor a blokk minden sorának a végére odaírja a begépelt szöveget
|
A részleteknek utánanézhetsz a :help visual_mode paranccsal.
Makrók
A könnyítés a vi-hoz képest, hogy nem kell :map-pel bíbelődni, lehet makrókat
menet közben felvenni, amíg le nem állítjuk, minden gombnyomásunkat rögzíti:
| qa | felvétel indítása az a bufferbe (állapotsorban recording látható)
|
| q | felvétel befejezése
|
| @a | a buffer tartalmát parancsként értelmezi
|
Ne feledjük, hogy ezek ugyanazok az a-z bufferek, amiket a másolásnál
használunk, tehát pl. egy qf parancs felül fogja írni az f bufferünket.
Vajkó Péter 2004-05-04
Ezt a művet
Creative Commons Nevezd meg!-Ne add el! 2.5 Hungary Licenc alatt tették közzé.