16    TEXTOVÝ EDITOR vi

<<vzad obsah vpřed>>

16.1    Vyvolání

vi [-r soubor] [-wn] [-R] [+povel] [soubor...]

vedit [-r soubor] [-wn] [-R] [+povel] [soubor...]

view [-r soubor] [-wn] [+povel] [soubor...]

Volby a parametry

-rsoubor
obnoví soubor po výpadku systému do stavu při poslední editaci
-wn
editor pracuje v okně o n řádcích
-R
soubory se budou pouze prohlížet a nelze je modifikovat
vi -R /usr/include/sys*
+povel
před začátkem editace se vykoná povel editoru.
vi +50 /etc/termcap
vi +/vt100 /etc/termcap
soubor
soubor, který chceme editovat. Pokud neexistuje, založí se. Současně můžeme pracovat s více soubory, mezi nimiž lze během práce přecházet
<<vzad obsah vpřed>>

16.2    Můj první text ve vi

  1. $ vi muj.denicek
    Přejdeme do vkládacího režimu stiskem i a budeme psát text:
    Milý deníčku!
    
    Můj  chlapec John  mi  dnes věnoval  manuál vi editoru 
    a v kavárně Slavia koupil panáka absintu
    a esej  Václava Havla v angličtině.
    Jsem tak málo nešťastná!
    
  2. Stiskneme <Esc>, přejdeme do povelového režimu a vyzkoušíme pohyb kurzoru po textu šipkami i pomocí
  3. K mazání znaku, na který ukazuje kurzor slouží povel x, ke smazání slova povel dw a celou řádku smaže dd. V našem souboru muj.denicek najedeme kurzorem na začátek slova nešťastná v posledním řádku a dvakrát stiskneme x. Potom nastavíme na témže řádku kurzor na slovo málo a stiskneme dw. Nakonec najedeme na libovolné místo řádku "a v kavárně Slavia koupil panáka absintu" a stiskneme dd. Obrazovka by měla nyní vypadat takto:
    Milý deníčku!
    
    Můj  chlapec John  mi  dnes věnoval  manuál vi editoru
    a esej  Václava Havla v angličtině.
    Jsem tak šťastná!
    
  4. Chceme-li vsunout text na místo, kde stojí kurzor, použijeme již známý povel i. Novou řádku vsuneme pod řádku, na kterou ukazuje kurzor povelem o. Tímto povelem se otevře nová řádka a můžeme psát nový text. Po vložení textu se přepneme do povelového režimu klávesou <Esc>. V našem textu kurzor přesuneme na první znak slova chlapec v druhém řádku a stiskneme i. Napíšeme slovo "americký" a stiskneme . Kurzor nastavíme na libovolný znak předposledního řádku a stiskneme o. Zapíšeme text "Je úplně jiný než ostatní chlapci!". Konečná verze deníčkového zápisu by měla vyhlížet:
    Milý deníčku!
    Můj americký chlapec John mi dnes věnoval manuál vi editoru
    a esej  Václava Havla v angličtině.
    Je úplně jiný než ostatní chlapci!
    Jsem tak šťastná!
    
  5. Nyní jsme se zápisem spokojeni a je třeba vyrovnávací paměť, v níž jsme doposud pracovali, uložit do souboru muj.denicek a opustit vi editor. K tomu slouží povel
    :x
    
  6. Pokud bychom text, který jsme vytvořili uložit nechtěli, opustíme editor povelem
    :q!
    

    a tím o změny v textu přijdeme, v našem příkladu tedy o celý soubor.

  7. Máme-li soubor muj.denicek uložený, můžeme jej potom kdykoliv vi editorem upravovat:
    $ vi muj.denicek
    
<<vzad obsah vpřed>>

16.3    Povely pro vkládání textu

atext
přidej text za kurzor
itext
vsuň text před kurzor
Atext
přidej text za konec řádky
Itext
vsuň text před prvý nebílý znak na řádce
otext
text vstupuje na dalším řádku
Otext
text vstupuje na předcházejícím řádku
<<vzad obsah vpřed>>

16.4    Povely pro pohyb kursoru po souboru

[n]<CTRL>F
vpřed o stránku
[n]<CTRL>B
vzad o stránku
[n]<CTRL>D
dolů o půl stránky
:z
dolů o půl stránky
[n]<CTRL>U
nahoru o půl stránky
[n]<CTRL>E
dolů o řádek
[n]<CTRL>Y
nahoru o řádek
[n]G
na n-tý řádek, standardně na poslední
[n]+
další řádka, prvý nebílý znak
[n]-
předcházející řádka, prvý nebílý znak
[n]<RETURN>
jako [n]+
[n]j
další řádek a stejný sloupec
šipka dolů
jako [n]j, má-li terminál tuto klávesu a je nastaven správný typ - viz proměnná prostředí TERM
[n]k
předcházející řádek a stejný sloupec
šipka nahoru
jako [n]k, má-li terminál tuto klávesu a je nastaven správný typ terminálu - viz proměnná prostředí TERM
[n]/vzor
na n-tý řádek obsahující vzor (základní regulární výraz směrem vpřed
[n]?vzor
na n-tý řádek obsahující vzor (základní regulární výraz směrem vzad
[n]n
na n-tý další nalezený vzor povelem / nebo ?
[nN]
na n-tý další nalezený vzor povelem / nebo ? v opačném směru ( bylo-li předtím hledáno dopředu pak dozadu a naopak)
[n]/vzor/+m
na m-tý řádek za řádkem, obsahujícím vzor (základní regulární výraz)
?vzor?-m
na m-tý řádek před řádkem, obsahujícím vzor (základní regulární výraz)
[n]w
směrem vpřed na další slovo; oddělovači jsou znaky různé od písmen, číslic a podtržítka
[n]b
směrem vzad na další slovo; oddělovači jsou znaky různé od písmen, číslic a podtržítka
[n]e
směrem vpřed na konec slova; oddělovači jsou znaky různé od písmen, číslic a podtržítka
[n]W
směrem vpřed na další slovo; oddělovači jsou pouze mezera a tabelátor
[n]B
směrem vzad na další slovo;oddělovači jsou pouze mezera a tabelátor
[n]E
směrem vpřed na konec slova; oddělovači jsou pouze mezera a tabelátor
]]
na další kapitolu ( hlavičku, oddělenou prázdnými řádky )
[[
na předcházející kapitolu ( hlavičku, oddělenou prázdnými řádky)
)
na začátek věty ( věta je text, ukončený znakem . nebo ! nebo ? a dvěma prázdnými znaky, nejde-li o větu poslední)
(
na konec věty
}
na další odstavec ( odstavec je text, začínající a ukončený prázdným řádkem)
{
na předcházející odstavec
%
na odpovídající otevírající nebo
uzavírající závorky ( ) { }
<<vzad obsah vpřed>>

16.4    Regulární výrazy vi editoru

znaky, které nejsou obsaženy v řetězci
Regulární výraz Vyhovující posloupnost znaků
znak znak bez zvláštního významu ( tj. kromě ^ & * . \ [ ] ~ ). Chceme-li je v regulárním výrazu použít jako ASCII znak, zamaskujeme předcházejícím znakem \
^ na začátku vzoru značí začátek řádky
$ na konci vzoru značí konec řádky
. libovolný jeden znak
\< začátek slova
\> konec slova
[řetězec] znak, obsažený v řetězci, lze použít intervaly znaků , ve tvaru počáteční-koncový. Např. [A-Z] značí velká písmena
[^řetězec]
řetězec* žádný nebo libovolný počet řetězců (lze použít i interval znaků)
řetězec1řetězec2 řetězec vyhovující regulárnímu výrazu řetězec1, následovaný řetězcem, vyhovujícímu regulárnímu výrazu řetězec2
\(řetězec\) uzavření regulárního výrazu řetězec do závorek pro jeho očíslování za účelem zkrácení zápisu. Každému takto uzávorkovanému regulárnímu výrazu odpovídá zleva číslo od jedné do maximálně šesti. Na tyto dílčí regulární výrazy se lze potom odkazovat jako \1 až \6 ve vzorech pro hledání a lze je použít při konstrukci nových řetězců v povelech náhrady.

Příklady regulárních výrazů

Vzor Vyhovuje
/^$/ prázdná řádka
/./ nejméně jeden znak na řádce
/^/ všechny řádky
/^vzor/ řetězec vzor na začátku řádky
/vzor/ řetězec vzor kdekoliv na řádce
/vzor$/ řetězec vzor na konci řádky
/^vzor$/ řádky obsahující pouze řetězec vzor
/vzor\./ řetězec 'vzor.' kdekoliv na řádce
/[Vv]arianta[1-3]/ řetězce Varianta1, Varianta2, Varianta3, varianta1, varianta2, varianta3
/^V Praze.*1\.1.97$/ řádky obsahující na začátku řetězec 'V Praze' a na konci řetězec '1.1.97'
<<vzad obsah vpřed>>

16.6    Pohyb kurzoru po obrazovce

[n]H
na n-tý řádek od začátku stránky, standardně na prvý
[n]L
na n-tý řádek od konce stránky, standardně na poslední
M
na prostřední řádek obrazovky
<<vzad obsah vpřed>>

16.7    Pohyb kurzoru na řádce

0
začátek řádku
[n]^ prvý znak na řádku, různý od tabelátoru nebo mezery
[n]$
poslední znak na řádku
[n]|
n-tý znak na řádce
[n]l
další znak vpravo
[n]<SPACE>
další znak vpravo, jako [n]l
[n]<šipka vpravo>
další znak vpravo, jako [n]l
[n]h
další znak vlevo
[n]<BACKSPACE>
další znak vlevo, jako [n]h
[n]<CTRL>h
další znak vlevo, jako [n]h
[n]<šipka vlevo>
další znak vlevo, jako [n]h
[n]fc
najdi znak c směrem vpravo
[n]Fc
najdi znak c směrem vlevo
[n]tc
najdi znak předcházející c směrem vpravo
[n]Tc
najdi znak předcházející c vlevo
[n];
opakuj poslední povel f, F, t nebo T
[n],
změna směru hledání pro povely f, F, t nebo T
<<vzad obsah vpřed>>

16.8    Umístění aktuálního řádku na obrazovce

z<RETURN>
aktuální řádek uprostřed
z.
aktuální řádek nahoře
z-
aktuální řádek dole
<<vzad obsah vpřed>>

16.9    Pohyb kurzoru po značkách

``
návrat kurzoru na předcházející pozici
''
návrat kurzoru na prvý nebílý znak řádku na kterém byl kurzor.
mc
označení aktuální polohy kurzoru značkou c (a-z)
`c
jdi na značku c
'c
jdi na prvý nebílý znak řádku, obsahující značku c
<<vzad obsah vpřed>>

16.10    Obecné povely pro manipulaci s textovými objekty

Textové objekty jsou definovány povely pro pohyb kurzoru, argument manipulačního povelu vymezuje text mezi aktuální pozicí kurzoru a polohou kurzoru, danou povelem objekt.

[n]dobjekt
vymazání objektu
[n]cobjekt
změna objektu
[n]>objekt
posun objektu o tabulátor vpravo
[n]<objekt
posun objektu o tabulátor vlevo
[n]yobjekt
zapamatování objektu
[n]!objekt povel
textový objekt se "přefiltruje" přes shellovský povel. Povel používá jako standardní vstup i výstup objekt a může pochopitelně mít argumenty.

Pokud se namísto objektu zopakuje manipulační povel, znamená to jeho aplikaci na celý řádek na němž stojí kurzor.


     dd    vymaže celý řádek, na  němž stojí kurzor

     20>>  posune  dvacet  řádků  od  řádku  na  němž  je  kurzor
o tabulátor doprava.

     100d+
     10d10+
     d+100+

           Tyto  povely mají  stejnou  funkci  a vymažou  text od
pozice kurzoru sto řádek.

     !Lsort setřídí řádky od řádku s kurzorem do posledního řádku
obrazovky

Co je to?

>M
cw
c)
c(
c}
<<vzad obsah vpřed>>

16.11    Syntaxe povelů v režimu řádkového editoru ex

Některé funkce pouze v režimu editoru ex (do něhož přejdeme povelem : ), popř. někdy jsou efektnější alternativou k povelům režimu vi.

Obecný formát povelu editoru ex
[adresa] [povel] [!][parametry][počet][příznak]

Adresa udává rozsah řádků, na kterých operuje povel:
adresa význam
. tečka značí aktuální řádek. Pracuje-li povel pouze s jedním řádkem, není třeba psát (standardní hodnotou povelů je zpravidla aktuální řádek
n n-tý řádek
$ poslední řádek vyrovnávací paměti
0 začátek vyrovnávací paměti
% celá vyrovnávací paměť (zkratka pro adresu 1,$)
+n n-tý řádek za řádkem aktuálním
-n n-tý řádek před řádkem aktuálním
/vzor/ hledá směrem vpřed text vyhovující regulárnímu výrazu vzor. Pokud se hledá pouze výskyt textu vzor, stačí pouze /vzor. Zadá-li se adresa pouze jako /, definuje další výskyt
'' návrat k poslednímu řádku
'c řádek označený v režimu vi povelem mc nebo v režimu ex :mc

Př.
Povel
:.,+2 co0
okopíruje  na začátek  souboru aktuální  řádek a
dva řádky následující