vi ,,VILLÁM'' Hogyan


1. Amelyben arról ejtünk néhány keresetlen szót, hogy ,,Na most mi is az a vi''?

A vi - ejtsd "vi-áj" - egy szabványos UNIX szövegszerkesztő, amely - az előbbi félmondatból is következően - valamennyi UNIX rendszeren megtalálható. Nyilvánvaló tehát, hogy mindenképpen érdemes megismerkedni legalább az alapszintű használatával, hiszen bárki kerülhet olyan helyzetbe, hogy semmifélé egyéb editor nem áll rendelkezésére (például nem tudunk a normál módon bejelentkezni a rendszerünkre, csak egy rendszerhelyreállító bootlemez segítségével) és az ilyen esetekben adunk majd hálát a Mindenhatónak azért, hogy voltunk olyan előrelátók, és megtanultuk a vi alapszintű használalát.

2. E bekezdés témája, tömören összefoglalva: De miért pont "vi" lett a neve?

Jó kérdés. Állítólag a "visual editor" rövidítése. A vi alapanyaga az "ex" (extended editor) nevű sorszerkesztőből (ilyen például az "ed" is) ered. Bill Joy - az ex kitalálója - később írt egy képernyő-alapú felhasználói felületet az ex-hez és ezt elnevezte vi-nak. Mivel ez a kis tanmese a vi-ról szól és nem az ex-ről, ezért ha az ex-vel bővebben szeretnél megismerkedni, akkor csak gépeld be: ex (ez általában hatásos szokott lenni:-)

3. Amelyben mindenki választ kaphat arra a fontos kérdésre, hogy hogyan kell elindítani a vi-t?

Csak gépeljük be, hogy:

vi

És már benne is vagyunk a vi kellős közepében. Természetesen előfordulhat, hogy a vi egy klónja található a rendszerünkön. Szabványos esetben ilyenkor is elég a vi szót begépelnünk, amely egy link az adott klónra (pl. vim, nvi). Most nem kívánok még egy külön pontot kijelölni a vi-ból való kilépésre is, bár valószínűleg erre sokkal nagyobb szükség lehet, mint az elindítási segédletre...:-) Tehát kilépés előtt térjük át parancsmódra(a leírása a következő pontban olvasható) és használjuk a

:x
parancsot (ekkor mentjük a dokumentumot a módosításokkal együtt és kilépünk a programból). Amennyiben megijedtünk, hogy esetleg valami fontos dolgot is megsemmísítettünk a módosítás alatt, akkor használjuk a
:q!
parancsot, ekkor mentés nélkül lépünk ki a programból.

(A szerk. megjegyzése: Persze mire rájöttem erre a két parancsra anno, hát majdnem megőszültem..:-)

4. Itt fellebbentjük a fátylat a sejtelmes parancs- és adatbeviteli módokról?

Mivel ezesetben egy karakteres módú szövegszerkesztőről van szó és a vi megalkotásakor az emberek még nem egérrel a kezükben születtek, ezért valahogyan lehetővé kellett tenni, hogy a szöveg beírása mellett néhány egyéb formázó, szerkesztő parancsot is lehessen használni.

Nevéből is adódóan az adabeviteli módban gépelhetjük be a kívánt szöveget. Ilyenkor valamennyi - nem funkcióbillentyűs - begépelt karakter megjelenítődik a monitoron. Nagyon hamar nyilvánvalóvá válik azonban, hogy hiába vagyunk képesek szöveget begépelni, nem tudunk törölni, adott sorra ugrani, karaktereket cserélni...és meg sorolhatnám.., de sorolom is: másol-kivág-beilleszt funkció, insert, keresés...

És ekkor válik értelmes dologgá a vi parancsmódja.

Parancsmódba a legegyszerűbben egy ESC billentyű lenyomásával juthatunk el. Ha kétszer is lenyomjuk, akkor csipogást hallhatunk, esetleg megvillan a monotor...most már biztosan parancsmódban vagyunk. A parancsokat általában megelőzi egy kettőspont, amelynek helyes írása a hibás ".." helyett, a ":" alakban történik. Például, ha mindíg szeretnénk tudni, hogy éppen melyik módban vagyunk, akkor előszőr lépjünk parancsmódba, majd gépeljük be:

:set showmode

Ezután a vi folyamatosan tájékoztat bennünket, hogy melyik éppen az aktuális mód.

Ha szöveget szeretnénk begépelni a vi editorba, akkor adatbevitelimódra kell átváltanunk. Ez megtehető például az "i" billentyű lenyomásával, amikoris az aktuális kurzorpozíció elé kerül a beírt szöveg, vagy az "a" billentyű lenyomásával, amikor viszont éppenhogy mögé.

5. Mi a teendő, ha lusták vagyunk, de élelmesek, azaz: A .exrc fájl - indítási inicializálás.

Indításakor a vi előszőr leellenőrzi, hogy a HOME könyvtárunkban létezik-e a .exrc fájl. Ebben a fájlban definiálhatjuk, a számunkra általános vi beállításokat. Ezek tulajdonképpen parancsok, amelyeket az ex program haj végre a vi meghívásakor. Végrehajthatunk shellparancsokat is a .exrc fájlon keresztül, ilyenkor a "!" jelet írjuk a shellparancs elé. Kommenteket is írhatunk a .exrc fájlba. A komment jele itt a kettős idézőjel, azaz a " jel. A vi a space és a tabulátor jeleket sem veszi figyelembe, így már viszonylag emészhető kinézetűvé tehetjük a .exrc fájlunkat. A viszont FONTOS:

Egy igen rövid példa a .exrc fájlra :-)

6. Most már csak rajtunk múlik...

A következő leírást bárki önmaga is előkeresheti, ha használja a vi editorban a :help parancsot , vagy az erre felkínált választási lehetőségek közül (viusage, exusage) valamelyiket.

Na jó nyelvi eltérések azért lehetnek...:-)

^A a kurzornál lévő szóra keres rá a doksi további részében
^B egy képernyőnyit lapoz visszafelé
^C megszakít egy folyamatot (pl. olvasás, írás, keresés)
^D lefelé lapoz egy fél oldalnyit (beállítástól függően)
^E egy sort lép lefelé (képernyő görgetéssel)
^F egy képernyőnyit lapoz előre
^G fájl állapot információk (pl. unmodified: line 26 of 334 [7%])
^H balra lép egy karakternyit
^J egy sort lép lefelé (amíg lehet, addíg scroll nélkül)
^L képernyő frissítés
^M soronként lépked lefelé (az első, nem üres helyre)
^N soronként lépked lefelé
^P soronként lépked felfelé
^R képernyőfrissítés
^T tag pop
^U felfelé lapoz egy fél oldalnyit (beállítástól függően)
^V input a literal character
^W átvált a következő képernyőre (ha több fájl is meg van nyitva)
^Y soronként lapoz visszafelé
^Z megszakítja a szerkesztő működését
^[ <escape> kilép az adatbeviteli módból, megszakítja a részleges parancsokat
^\ átvált ex módba
^] tag lekérés a kurzor a kurzor utáni szóból
^^ átvált az előző fájlra
space jobbra mozog oszloponként
! filter a shellparancsok outputjának fájlbamozgatására
Példa: ! <ENTER> ls
# ha számon áll a kurzor, akkor növeli vagy csökkenti az értékét
$ az utolsó oszlopra ugrik
% move to match
& megismétli a helyettesítést (sustitution)
' move to mark (to first non-blank)
( az előző mondatra ugrik
) a következő mondatra ugrik
+ soronként lépked lefelé (az első, nem üres helyre)
, ellenkező irányban megismétli az utolsó F, f, T vagy t keresést
- soronként ugrik felfelé (az első, nem üres helyre)
. megismétli az utolsó parancsot
/ keresés előrefelé
0 a legelső karakterre ugrik
: ex parancs
; megismétli az utolsó F, f, T vagy t keresést
< a sort jobbra mozgatja
> a sort jobbra mozgatja
? keresés visszafelé
@ lefuttatja a puffer tartalmát
A hozzáfűz a sor végéhez
B minden nagyobb szóra elejére ugrik, visszafelé
C szövegmódosítás a sor végéig
D a sor végéig töröl
E minden nagyobb szó végére ugrik, előrefelé
F a sorban visszafelé keresve a keresett karakterre ugrik
G a szöveg utolsó sorára viszi a kurzort
H az aktualis legfelső sorra viszi a kurzort
I a első, nem üres karakterhely elé szúr be
J az aktuális sor végéhez fűzi a következő sort
L a képernyő aljára ugrik
M a képernyő közepére ugrik
N az utolsó keresés, de visszafelé
O beillesztés az adott sor fölé
P beilleszti a puffer tartalmát a kurzor elé
Q ex módra vált át
R felülírja a begépelt szöveggel az adott sor tartalmát
S az aktuális sort helyettesíti a begépelt adattal
T a sorba visszafelé keresve a keresett betű elé ugrik
U visszaállítja a sor eredeti tartalmát
W a következő szóra ugrik
X törli a kurzor előtti karaktert
Y másolja az aktuális sort
ZZ lementi a fájlt és kilép
[[ visszaugrik a paragrafus (fájl eleje is lehet) elejére
]] a paragrafus (fájl vége is lehet) végére ugrik
^ a sorban lévő, első, nem üres karakterre ugrik
_ a sorban lévő, első, nem üres karakterre ugrik
` a megjelölt részhez ugrik
a a kurzor utáni helyre illeszt
b az előző szóra ugrik
c módosítás visz végbe a mozgás irányában
d törlést végez a mozgás irányában
e a szó végére ugrik
f adott karakter keresése a sor vége felé (pl. fg, akkor a köv. g-re ugrik)
h balra ugrik egy oszlopot
i szövegetbemenetet illesz a kurzor elé
j lefelé ugrik egy sort
k felfelé ugrik egy sort
l jobbra ugrik egy oszlopot
m megjelöl egy fájlrészt
n megismétli az előző keresést
o beilleszt a sor után
p beilleszti a kurzor mögé a puffer tartalmát
r kicserél egy karaktert
s helyettesíti az adott karaktert (akár több karakterrel is)
t a keresett karakter előtti karakterre ugrik a sor vége felé
u visszaállítja az előző állapotot (undo)
w a következő szóra ugrik
x karakter törlés
y a vágólapra (pufferbe) másolja az aktuális sort
z újrapoziciónálja a képernyőt
{ visszafelé lépked a bekezdéseken
| a sor elejére ugrik (az első oszlophoz)
} előrefelé lépked a bekezdések mentén
~ a nagybetűket kisbetűre irja át, a kisbetűket nagyra

Extra lehetőségek:

^D : scrollozza a sorokat
! : szűri a sorokat a parancsokon keresztül, vagy futtat egy parancsot
# : megjeleníti az adott sor sorszámát és magát a sort is
& : repeat the last subsitution
* : lefuttetja a puffert
< : eltolja a sort balra
= : a dokumentum teljes sorszámát jeleníti meg
> : eltolja a sort jobbra
@ : lefuttatja a puffert
append : az adott sor után adatot vihetunk be pl. ^C -ig
abbreviate : meghatároz egy bemeneti (input) rövidítést
args : megjeleníti a fájl argumentumlistáját
bg : a szöveget a háttérbe teszi át
change : megváltoztatja az aktuális sor tartalmát
cd : megváltoztatja az aktuális könyvtárat
chdir : megváltoztatja az aktuális könyvtárat
copy : sorokat másol a fájl tetszöleges részébe
cscope : create a set of tags using a cscope command
delete : sorokat töröl ki a fájlból
display : megjeleníti a puffereket, kapcsolatokat, képernyőket vagy a tagokat
[Ee]dit : elkezd szerkeszteni egy másik fájlt
[Ee]x : elkezd szerkeszteni egy másik fájlt
exusage : megjeleníti az extra parancshasználat megállapításait
file : megjeleníti (vagy opcionálisan be is állítja) a fájl nevét
[Ff]g : előrehoz egy képernyőt a háttérből
global : lefuttat egy globális parancsot adott sorokon a RE-nek megfelelően
help : megjeleniti a verzióhoz tartozó aktuális help szöveget
insert : szövegadatokat illeszt az aktuális sor elé
join : a következő sort az aktuális sor mögé fűzi
k : megjelöl egy sorpozíciót
list : megjeleníti a sorokat félreérthetetlen formában
move : sorokat mozgat át valahová a fájlban
mark : megjelöl egy sorpozíciót
map : begépelt adatokat vagy parancsokat rendel, egy vagy több billentűzethez
mkexrc : létrehoz egy .exrc fájlt
[Nn]ext : szerkeszt (és esetlegesen meghatározza) a következő fájlt
number : átváltja a megjelenítési formát adott számú sorra
open : belép az "open" módba (egyenlőre nem elérhető)
print : sorokat jelenít meg
perl : futtatja a perl értelmezőt/interpretert az adott paranccsal
perldo : lefuttatja a perl értelmezőt a paranccsal, de valamennyi sorra
preserve : fenntart egy szerkesztői munkafázist (session) az esetleges helyreállításra
[Pp]revious : szerkeszti a fájl argumentumlista előző fájlját
put : hozzáfűz egy vágólap (puffer) tartalmat a sorhoz
quit : kilép az ex/vi -ból
read : hozzáfűzi egy parancs kimenetét vagy egy fájl tartalmát a sorhoz
recover : visszaállít egy mentett fájlt
resize : grow or shrink the current screen
rewind : újraolvassa valamennyi fájlt, amely a fájl argumentum listában megtalálható
s : substitute on lines matching an RE
script : futtat egy shell-t a képernyőn
set : opciókat állít be (használd a ":set all" -t, a lehetőségek megtekintésére)
shell : felfüggeszti a szerkesztést és elindít egy shell-t
source : beolvas egy ex parancsokat tartalmazo fájlt
stop : felfüggeszti a szerkesztési munkafázist
suspend : felfüggeszti a szerkesztési munkafázist
t : átmásol egy sor a fájl adott részébe
[Tt]ag : szerkeszti a tag-et tartalmazó fájlt
tagnext : átlép a következő tag-re
tagpop : visszatér az előző tag csoportra
tagprev : visszalép az előző tag-re
tagtop : érvényteleníti valamennyi tag-et
tcl : meghívja a tcl parancsértelmezőt egy paranccsal
undo : visszaállítja a legutolsó változtatást
unabbreviate : töröl egy rövidítést
unmap : delete an input or command map
v : execute a global command on lines NOT matching an RE
version : megjeleníti a program verzióinformációit
visual : belépés visual (vi) módba (ex módból)
[Vv]isual : egy másik fájl szerkesztése (csak vi módból lehet kiadni)
viusage : megjeleníti a vi kulcsbillentyűk használati információi
write : írja a fájlt
wn : írja a fájlt és átvált a következő fájlra
wq : írja a fájlt és kilép
xit : kilép
yank : copy lines to a cut buffer
z : megjeleníti egy fájl különböző képernyőoldalait (pl. z+ z- ,...)
~ : replace previous RE with previous replacement string

Highlighting funkció a programozáshoz/de ez tényleg csak néhány példa/:

vim-awk vim-c
AwkC
vim-html vim-perl
htmlPerl
vim-tex vim-sh
Texshellscript

Még néhány megjegyzés:

Néhány igen jó leírás található a vi-t, illetve a klónokat tartalmazó csomagokban (mint ahogy azt a többi programcsomag esetében is megszokhattuk..:-).

vim/usr/doc/vim/examples/tutor Bevezető leírás a vim használatába (viszonylag jó és rövid, emellett jól tagolt).
vim/usr/doc/vim/*Minden ami a programnyelvi támogatásokhoz, a highlighting támogatáshoz és még sok egyébhez szükséges.
nvi/usr/doc/nvi/FAQ.gzNincs mit hozzáfűzni..bár elég rövid..:-(

És persze man vi, man nvi, man vim, ...

Szóval...jó ez a vi.....:-)