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é.