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.
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:-)
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
:xparancsot (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..:-)
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é.
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 :-)
"Alapbeállítások set showmode set wrapmargin=10 "A pontos idő !date;sleep 2
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 |
^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ő) | |
: 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 |
Awk | C |
html | Perl |
Tex | shellscript |
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.gz | Nincs mit hozzáfűzni..bár elég rövid..:-( |
És persze man vi, man nvi, man vim, ...
Szóval...jó ez a vi.....:-)