Editor VI - UNIX
1 Úvod a história
Editor VI je najrozšírenejší textový editor na systémoch typu UNIX. Jeho meno je v
dnešnej dobe trochu kuriózne. Editor vznikol v začiatkoch operačných systémov UNIX,
kedy boli k dispozícii iba editory, ktoré vedeli zobrazovať v jednom okamžiku iba
jeden riadok textu a ten upravovať. Editor VI už zobrazoval na obrazovke celú
stranu textu (dokumentu) naraz a umožňoval pohyb v tomto texte a jeho modifikácie,
tak ako sme dnes všetci zvyknutí. Táto jeho skvelá vlastnosť viedla jeho tvorcov k
menu, ktoré editor dostal. Okrem editora VI, ktorý vznikol veľmi dávno, existuje aj
editor VIM. Editor VIM je klasický editor VI rozšírený o množstvo ďalších
vlastností a funkcií. Editor VI je súčasťou každého OS UNIX. V OS LINUX je možné sa
stretnúť prevažne len s jeho vylepšenou verziou - VIM.
Editor VI je kvalitný editor poskytujúci používateľovi širokú škálu najrôznejších
funkcií, ktoré môže používateľ pri písaní textov a zdrojových kódov potrebovať.
Veľa ľudí aj napriek jeho dobrým vlastnostiam tento editor radšej nepoužíva.
Dôvodom je na prvé použitie komplikované ovládanie. Ide väčšinou o ľudí, ktorí
prišli z operačného systému Microsoft Windows, a teda ľudí zvyknutých na vizuálne
prostredie a textové editory (procesory), ktorých funkcie sú jednoducho prístupné
cez menu a použitie myši. Aj napriek komplikovanému ovládaniu nie je potrebné hneď
zanevrieť na tento editor a skúsiť sa naučiť používať ho. Jeho ovládanie je možno
trochu komplikovanejšie ako ovládanie MS Wordu, ale na druhej strane poskytuje
oveľa väčšiu efektívnosť pri práci. Treba skúsiť.
1.1 Na čo sa hodí a nehodí editor VI (M)
Editor VI (M) je vhodný na písanie ľubovolného textu, ktorý netreba nejako
špeciálne formátovať pre potreby tlače. Teda žiadne fonty, odrážky, formátovnia
odstavcov, farby (pre tlač) a podobne. Vzhľadom na funkčnú podporu, ktorú má editor
zabudovanú (odkazy na chyby po kompilácii, dopĺňanie textu), je editor vhodný na
písanie programov.
1.2 Prečo používať VI (M)
- editory VI (M) sú veľmi rozšírené v OS UNIX / LINUX, ktoré sa vyznačujú svojou
robustnosťou, stabilitou a (nie len) sieťovou bezpečnosťou => tieto OS sa v
komerčnom svete často používajú => je dobré vedieť používať štandardné nástroje,
ktoré sa nachádzajú v týchto OS
- editor VI (M) je veľmi efektívny editor, čo môže viesť k značnému ušetreniu času
pri jeho použití a zvládnutí jeho ovládania
- existujú aj verzie VIM pre OS Windows => stačí keď viete dobre používať jeden
editor a vystačíte si na najpoužívanejších OS (aspoň v Európe myslím, že sú
najpoužívanejšie)
2 Práca s editorom
2.1 Spustenie editora
Editor VI (M) umožňuje používateľovi editovať existujúci súbor a pokračovať v jeho
editácii alebo vytvoriť nový súbor. Príkaz na naštartovanie editora je vi
nasledované menom súboru. Napr.
vi temp.txt
pre editovanie súboru temp.txt (ak neexistuje, tak sa vytvorí pri uložení
otvoreného súboru na disk), alebo
vi
čím sa vytvorí dočasný súbor (neodporúčam).
Po spustení editora je možné na obrazovke vidieť začiatok textu súboru. Ak je súbor
malý alebo bol vytvorený nový súbor, tak je možné vidieť na začiatku riadkov znak
~. Tento znak sa objavuje na začiatku každého riadku obrazovky, ktorý je prázdny,
teda súbor končí posledným riadkom bez znaku ~.
2.2 Ukončenie editora
Keď máme otvorený editor VI je dobré aj vedieť, ako ho ukončiť. Na ukončenie
editora je potrebné dostať sa do tzv. príkazového módu (command mode) a zadať
príkaz na ukončenie práce s editorom. Do príkazového módu sa dostaneme stlačením
klávesy
Esc
(po spustení sa default nachádzame v príkazovom móde, teda netreba sa do neho
nijako dostávať). Potom treba zadať príkaz na ukončenie práce s editorom :q, ktorý
ukončí editor v prípade, že neboli vykonané žiadne zmeny v dokumente. V prípade, že
zmeny boli urobené, editor na to upozorní používateľa a nedovolí mu ukončiť ho. Keď
chceme ukončiť editor a ignorovať vykonané zmeny treba napísať príkaz
:q!
Ak chceme vykonané zmeny uložiť je potrebné v príkazovom móde napísať
:w
Ak chceme zmeny zapísať do iného súboru je potrebné napísať
:w filename
kde filename je meno súboru. Ak chceme uložiť zmeny a ukončiť prácu v editore je
možné príkazy spojiť a napísať
:qw
alebo napísať príkaz
ZZ
čo je ekvivalent pre :qw a je to rýchlejšie pri písaní (tie ZZ sú veľké).
2.3 Módy práce VI
Editor VI má dva módy práce. Ide o príkazový mód (command mode) a vkladací mód
(insert mode).
Príkazový mód umožňuje zadávať príkazy pre manipuláciu s textom a riadenie a
konfigurovanie editora (exit, nastavenie veľkosti tabulátora a pod.) . Tieto
príkazy sú väčšinou zadávané formou klávesových skratiek. Vkladací mód umožňuje
pridávať nový text.
Editor VI sa po štarte nachádza v príkazovom móde. Na prechod editora do
vkladacieho módu sa môžete použiť príkazy
a
a
i
ktoré budú popísané neskôr. Na prechod z vkladacieho módu do príkazového treba
stlačiť klávesu
Esc
Keď už sme v príkazovom móde, opätovné stlačenie klávesy Esc nespôsobí prechod do
vkladacieho módu.
2.4 Ako písať príkazy v príkazovom móde
Príkazy v príkazovom móde majú väčšinou takýto tvar:
[počet] príkaz [kde]
pričom počet definuje koľko krát sa má príkaz uskutočniť a je zadaný ako číslo. Ak
napríklad chcem zmazať 10 znakov napíšem v príkazovom móde
10x
pričom príkaz x zmaže znak v mieste kde sa nachádza kurzor.
Kde špecifikuje oblasť textu na ktoré sa má aplikovať príkaz. Možno špecifikovať
koľko riadkov alebo akú časť dokumentu má príkaz postihnúť. Kde môže byť aj ďalší
príkaz ktorý slúži na pohyb kurzora (v podstate vždy to je príkaz na pohyb
kurzoru). Napr. zmazanie všetkých riadkov do konca súboru by sa napísalo ako
dG
kde d je príkaz na mazanie a G je príkaz na posun kurzora na koniec dokumentu.
2.5 Jednoduché príkazy
Na začiatok niekoľko najpoužívanejších príkazov. V zátvorke budú uvedené varianty
pre daný príkaz v editore VIM.
a - prechod do vkladacie módu, vkladané znaky budú umiestňované za aktuálnu
pozíciu kurzoru. Ak sa špecifikuje počet, tak vložený text sa vloží opakovane na
toto miesto.
i - prechod do vkladacie módu, vkladané znaky budú umiestňované pred aktuálnu
pozíciu kurzora. Ak sa špecifikuje počet, tak vložený text sa vloží opakovane na
toto miesto (insert)
h - posun kurzora jednu pozíciu doľava (šipka vľavo)
j - posun kurzora jeden riadok nižšie (šipka dole)
k - posun kurzora jeden riadok vyššie (šipka hore)
l - posun kurzora jednu pozíciu doprava (šipka vpravo)
r - nahradí jeden znak pod kurzorom zadaným znakom. Ak sa špecifikuje počet, tak
zadaný text nahradí počet znakov na tomto mieste.
u - undo posledná zmena. Ak sa napíše znova tak to znamená redo. (viac krokové
undo)
x - zmaže znak na pozícii kurzora. Ak sa špecifikuje počet, tak je zmazaných
počet znakov.
2.6 Pohybovanie v texte
Na pohybovanie v texte slúžia okrem spomenutých základných príkazoch aj niektoré
ďalšie. Príkazy na pohyb kurzora sa používajú aj pri stanovení rozsahu platnosti
iných príkazov (mazanie, kopírovanie a pod.). Preto sa venujeme najskôr pohybom v
texte a až potom ostatným príkazom.
E, e - presun na koniec tohto slova, v prípade e je slovo text oddelený
interpunkčnými a inými znakmi, v prípade E je slovo všetko čo je oddelené bielymi
znakmi
B, b - presun na začiatok tohto slova, v prípade b je slovo text oddelený
interpunkčnými a inými znakmi, v prípade B je slovo všetko čo je oddelené bielymi
znakmi
W, w - presun na začiatok ďalšieho slova, v prípade w je slovo text oddelený
interpunkčnými a inými znakmi, v prípade W je slovo všetko čo je oddelené bielymi
znakmi
$ - presun na koniec riadku (end)
^ - presun na začiatok riadku (home)
G - presun na koniec súboru
rG - presun na riadok číslo r, kde r je počítané od začiatku súboru. Čiže 1G nás
presunie na začiatok prvého riadku súboru
2.7 Vystrihávanie, kopírovanie a vkladanie textu
Príkaz d slúži na vystrihnutie textu, čiže zmaže text a uloží ho do štandardného
buffera (niečo ako clipboard vo Windows) a príkaz y slúži na skopírovanie text do
štandardného buffera. Príkazy sú predchádzané špecifikáciu počtu použitia príkazu
(počet) a nasledované špecifikáciou pohybu kurzora (kde). Ak zapíšeme príkaz dva
krát po sebe znamená to že sa vzťahuje na aktuálny riadok. Nasledujú nejaké
príklady:
d^ - zmaže znaky od pozície kurzoru po začiatok riadku
d$ - zmaže znaky od pozície kurzoru po koniec riadku
dw - zmaže znaky od pozície kurzoru po koniec tohto slova
yy - skopíruje riadok na ktorom sa nachádza kurzor do buffera
3dd - zmaže tri riadky vrátane riadku kde je umiestnený kurzor
Príkazy p a P slúžia na vkladanie obsah buffera do textu. Príkaz P vloží pred
riadok, na ktorom je umiestnený kurzor a p za tento riadok.
2.8 Buffere
Ako už bolo spomínané príkazy y, d a p pracujú z buffrom, ktorého správanie je
možné prirovnať k správaniu clipboardu. Okrem štandardného buffera, ktorý sa
používa ak nie je uvedené inak, je možné používať aj pomenované buffere. Pomenované
buffere sa používajú tak, že pred samotný príkaz sa vloží postupnosť
"m
kde znak m je ľubovolné písmeno alebo číslica, tzv. meno buffera. Napríklad
skopírovanie 5 riadkov do buffera b a jeho vloženie na koniec súboru bude táto
postupnosť príkazov:
"m5yy
G
p
2.9 Vyhľadávanie v texte
Na vyhľadávanie slúžia príkazy /, ?, n. Vyhľadávanie sa vykonáva prostredníctvom
regulárnych výrazov (ak neviete regulárne výrazy nevadí, ani nezbadáte, že ich
potebujete). Pre hľadanie prvého výskytu textu awk smerom dole zapíšeme ako
/awk
Ak sa takýto text vyskytuje v texte kurzor sa presunie na pozíciu prvého výskytu.
Ak chceme hladať ďalší výskyt, tak zadáme príkaz
n
Ak sa hľadaný text nenachádza v texte editor nás na toto upozorní prostredníctvom
správy v stavovom riadku. Pre hľadanie toho textu turbo smerom hore zapíšeme príkaz
takto:
?turbo
V prípade ďalšieho hľadania opäť použijeme príkaz n.
2.10 Nahrádzanie textu iným textom
Nahrádzanie sa robí nasledujúcim príkazom:
:s/povodny_text/novy_text/g
povodny_text je regulárny výraz ktorý špecifikuje čo sa má nahrádzať, novy_text je
text, ktorým sa majú nájdené výskyty nahradiť. Ak sa neuvedie na konci príkazu g
tak sa nahradí len prvý výskyt na každom riadku. Ak sa g uvedie nahradia sa všetky
výskyty. Pred samotným príkazom s možno uviesť rozsah dokumentu na ktorý sa má
vyhľadávanie vzťahovať. Za všetky keci radšej nejaké príklady:
:1,$s/var_name/new_name/g
alebo
:%s/var_name/new_name/g
Nahradí v celom súbore všetky výskyty textu var_name za text new_name (od prvého
riadku po posledný).
:.,+20s/\<var_name/new_name/g
Nahradí v súbore od aktuálneho riadku po riadok o 20 nižšie všetky výskyty slova
začínajúceho var_name za text new_name (od aktuálneho riadku plus 20 riadkov).
:s/var_name/new_name/
Nahradí v aktuálnom riadku prvý výskyt textu var_name za text new_name.
3 Editovanie viacero súborov naraz
Ak potrebuje pracovať s viacerými súbormi naraz (kopírovať text z jedného do
druhého) je potrebné vedieť otvoriť viacero súborov naraz a prepínať sa medzi nimi.
Otvoriť viacero súborov sa dá spustením editora s viacerými argumentmi, ktoré
špecifikujú mená súborov.
vi filename1 filename2 ... filenameN
alebo
vi *.c
Prepínanie medzi súbormi je možné prostredníctvom príkazov :n smerom na ďalší
súbor, žiaľ smerom späť to nejde. To dokáže iba VIM pomocou príkazu :N.
4 Zhrnutie príkazov
V nasledujúcej časti sú zhrnuté príkazy pre príkazový mód editora VI. Žiaľ zatiaľ
len v anglickom jazyku ale myslím, že to nemôže robiť nikomu problémy.
4.1 Práca z blokmi textu (kopírovanie, mazanie a pod.)
" - Specify a buffer to be used any of the commands using buffers. Follow the "
with a letter or a number, which corresponds to a buffer.
D - Delete to the end of the line from the current cursor position.
P - Paste the specified buffer before the current cursor position or line. If no
buffer is specified (with the " command.) then 'P' uses the general buffer.
X - Delete the character before the cursor.
Y - Yank the current line into the specified buffer. If no buffer is specified,
then the general buffer is used.
d - Delete until where. "dd" deletes the current line. A count deletes that many
lines. Whatever is deleted is placed into the buffer specified with the " command.
If no buffer is specified, then the general buffer is used.
p - Paste the specified buffer after the current cursor position or line. If no
buffer is specified (with the " command.) then 'p' uses the general buffer.
x - Delete character under the cursor. A count tells how many characters to
delete. The characters will be deleted after the cursor.
y - Yank until , putting the result into a buffer. "yy" yanks the current line.
a count yanks that many lines. The buffer can be specified with the " command. If
no buffer is specified, then the general buffer is used.
4.2 Vkladanie textu
A - Append at the end of the current line.
I - Insert from the beginning of a line.
O - (letter oh) Enter insert mode in a new line above the current cursor
position.
a - Enter insert mode, the characters typed in will be inserted after the
current cursor position. A count inserts all the text that had been inserted that
many times.
i - Enter insert mode, the characters typed in will be inserted before the
current cursor position. A count inserts all the text that had been inserted that
many times.
o - Enter insert mode in a new line below the current cursor position.
4.3 Pohyb kurzoru v texte
^B - Scroll backwards one page. A count scrolls that many pages.
^D - Scroll forwards half a window. A count scrolls that many lines.
^F - Scroll forwards one page. A count scrolls that many pages.
^H - Move the cursor one space to the left. A count moves that many spaces.
^J - Move the cursor down one line in the same column. A count moves that many
lines down.
^M - Move to the first character on the next line.
^N - Move the cursor down one line in the same column. A count moves that many
lines down.
^P - Move the cursor up one line in the same column. A count moves that many
lines up.
^U - Scroll backwards half a window. A count scrolls that many lines.
$ - Move the cursor to the end of the current line. A count moves to the end of
the following lines.
% - Move the cursor to the matching parenthesis or brace.
^ - Move the cursor to the first non-whitespace character.
( - Move the cursor to the beginning of a sentence.
) - Move the cursor to the beginning of the next sentence.
{ - Move the cursor to the preceding paragraph.
} - Move the cursor to the next paragraph.
| - Move the cursor to the column specified by the count.
+ - Move the cursor to the first non-whitespace character in the next line.
- - Move the cursor to the first non-whitespace character in the previous line.
_ - Move the cursor to the first non-whitespace character in the current line.