16.12    Změny v textu

~
změní malé písmeno na velké a naopak
[n]Ctext
přepíše řádek od kurzoru do konce
[n]C$text
přepíše řádek od kurzoru do konce, jako [n]Ctext
[n]Rtext
nahradí znaky textu znaky z klávesnice
[n]rznak
nahradí znak znakem z klávesnice
[n]Stext
nahradí řádek
[n]cctext
přepíše celý řádek
[n]cobjekttext
přepíše objekt textem
[n]stext
nahradí znak textem
.
opakuje jakoukoliv poslední změnu textu.
Př. Naposledy byl napsán ve vstupním režimu text 'nový telefon 24354259', pak . jej pokaždé znovu vloží na místo , na které ukazuje kurzor.
<<vzad obsah vpřed>>

16.13    Vymazání textu

D
vymaže text od kurzoru do konce řádku
[n]x
vymaže znak, na který ukazuje kurzor
[n]X
vymaže znak vlevo od kurzoru
[n]dobjekt
vymaže objekt
dd
vymaže řádek

Př.

dw
d3w
d3(
d5)
dG
<<vzad obsah vpřed>>

16.14    Obnovení textu

u
obnoví soubor do stavu před poslední změnou
U
obnoví text aktuálního řádku
"zásobníkp
obnoví jedno z posledních devíti smazání textu. Zásobník je číslo smazání , pro obnovení posledního smazání se zapíše 9 a pro poslední, které lze obnovit je zásobník 1.
[n].
zopakuje poslední příkaz, který editoval vyrovnávací paměť editoru
<<vzad obsah vpřed>>

16.15    Přesouvání textu

Vi editor má k dispozici devět očíslovaných registrů a jeden registr skrytý, do nichž ukládá smazaný text. Ty lze využít k přesunu textu; přesouvaný text se nejprve "vymaže do registru" a potom se z něj vloží na potřebné místo.

"rpovel_mazání
uložení vymazaného textu do registru r; r může nabývat hodnot a - z. Povely povel_mazání jsou uvedeny v kap. Vymazání textu.
"rp
vloží vymazaný text z registru r za kurzor
"rP
vloží vymazaný text z registru r před kurzor
"p
vloží poslední vymazaný text za kurzor
"P
vloží poslední vymazaný text před kurzor
:[adresa]m[kam] [volby]
přesune řádky definované adresou za řádek kam. Neuvede-li se kam, zkopíruje řádky za aktuální řádek.

Př.

Povel
: $-1,$m0
přesune  předposlední  a  poslední  řádek   souboru na jeho začátek.
<<vzad obsah vpřed>>

16.16    Kopírování textu

["r]yobjekt
uložení objektu do registru ; r může nabývat hodnot a - z. Nezadá - li se r, použije se nepojmenovaný registr Př. "byL uloží do registru b text vymezený aktuální pozicí kurzoru a koncem obrazovky
["r][n]yy
uložení n řádků (standardně jednoho) do registru ; r může nabývat hodnot a - z. Nezadá - li se r, použije se nepojmenovaný registr.
["r][n]Y
jako ["r][n]yy
["R]yobjekt
přidání objektu do registru ; R může nabývat hodnot A - Z a značí, že objekt se připojí za text, zapamatovaný v registru r (a - z). Př. Povel "Ay2w přidá dvě slova za kurzorem za text, který je již v registru a.
["R][n]yy
přidání n řádků (standardně jednoho) do registru ; R může nabývat hodnot A - Z. Nezadá - li se R, použije se nepojmenovaný registr.
["R][n]Y
jako ["R][n]yy
["r]p
vlož text z registru r za kurzor; nezadá-li se r, použije se nepojmenovaný registr
["r]P
vlož text z registru r před kurzor; nezadá-li se r, použije se nepojmenovaný registr
:[adresa] co [kam] [volby]
zkopíruje řádky definované adresou za řádek kam. Neuvede-li se kam, zkopíruje řádky za aktuální řádek.
<<vzad obsah vpřed>>

16.17    Povely pro manipulaci se soubory

ZZ
uložení aktuálního souboru, pokud se změnil a výstup z vi editoru
:w
uložení aktuálního souboru
:w!
uložení aktuálního souboru i v případě, že je do něj zakázán zápis
:sh
vyvolání nového shellu, po jeho opuštění návrat zpět do vi
:q
opuštění editoru
:q!
opuštění editoru s ignorováním změn
:e soubor
přechod k editování dalšího souboru
:e!
obnovení původního stavu souboru (v jakém byl tento naposledy uložen)
:e + soubor
edituje soubor od jeho konce
:e + n
edituje aktuální soubor od n-tého řádku
:[rozmezí]w[soubor]
uloží vyrovnávací paměť do souboru
:[rozmezí]wq! [soubor]
uloží vyrovnávací paměť do souboru i v případě, že soubor má zakázán zápis
:[rozmezí]w>> soubor
přidá obsah vyrovnávací paměti za konec souboru
:[rozmezí]w! povel
řádky, definované rozmezím zapíše do standardního vstupu povelu.Ten vykoná a jeho standardní výstup napíše pouze na obrazovku, ale neuloží do vyrovnávací paměti. Př. 1: :%w !sort vypíše na obrazovku setříděný obsah vyrovnávací paměti. Př. 2: :!%sort setřídí celý text a uloží jej do vyrovnávací paměti. Př. 3: w! sort uloží "natvrdo" obsah vyrovnávací poměti do souboru sort
:e#
edituje předcházející soubor, pokud bylo s ním pracováno
<CTRL>^
jako :e#
:e!#
edituje předcházející soubor, pokud bylo s ním pracováno , přičemž neuloží změny v aktuálním souboru
:! povel
vyvolá shellovský povel
:!!
zopakuje poslední shellovský povel
:n
edituje další soubor ze seznamu argumentů, byl-li editor vyvolán s několika argumenty
:n!
před editováním dalšího souboru neuloží změny v do souboru aktuálníhp
:n [+povel] soubor...
definuje nový seznam souborů pro editaci, je-li uveden povel vi editoru, vykoná se před editováním prvého souboru
:args
zobrazí aktuální seznam editovaných souborů
:f
zobrazí jméno aktuálního souboru a číslo řádku, obsahujícího kurzor
<CTRL>g
jako :f
:f soubor
přejde k editaci nového souboru
:ta návěští
umístí kurzor na návěští
:[n]r soubor
přečte soubor za n-tý řádek do vyrovnávací paměti; standardně za aktuální
:[n]r !povel
přečte obsah standardního výstupu shellovského povelu a uloží do vyrovnávací paměti za n-tý řádek
:rew
edituje prvý soubor ze seznamu argumentů při vyvolání vi
:rew!
jako :rew, ale neuloží změny v aktuálním souboru
:x [soubor]
pokud byl změněn obsah vyrovnávací paměti,
<<vzad obsah vpřed>>

16.18    Globální povely a náhrady textu

Globální povel má formát: :[adresa]g/vzor/povel...

  1. Povely mohou pokračovat na několika řádcích, které jsou s výjimkou posledního ukončeny \
  2. Rozsah řádků, na nichž operuje globální povel je dán adresou
  3. nezadá-li se, pak standardně pracuje s celou vyrovnávací pamětí.
:[adresa]g/řetězec/
nastaví kurzor na poslední řádek, obsahující řetězec
:[adresa]g/řetězec/p
vytiskne všechny řádky, obsahující řetězec
:[adresa]g/řetězec/nu
vytiskne čísla všech řádků, obsahující řetězec
:[adresa]g/starý/s//nový/
nahradí prvý výskyt řetězce starý na každém řádku řetězcem nový. Ve všech povelech náhrady (/s) lze pro úsporný zápis místo řetězce starý použít metaznaku &. Chceme-li využít řetězce nový z přecházejícího povelu náhrady, můžeme použít metaznaku ~. Př. Prvý výskyt slova malý na každém řádku chceme nahradit slovy malý český: :g/malý/s//& český/
:[adresa]g/starý/s//nový/g
nahradí každý výskyt řetězce starý na všech řádcích řetězcem nový
:[adresa]g/starý/s//nový/gp
nahradí každý výskyt řetězce starý na všech řádcích řetězcem nový a všechny změněné řádky vytiskne
:[adresa]g/starý/s//nový/gc
před nahrazením každého výskytu řetězce starý na všech řádcích řetězcem nový vyžaduje schválení. Odpoví-li se Y, pak se náhrada provede, jinak nikoliv.
:[adresa]g/terč/s/starý/nový/g
povel nejprve nalezne všechny řádky, obsahující terč. Pro ně pak nahradí každý výskyt řetězce starý řetězcem nový.
:[adresa]g!/vzor/povel
povel se vykoná na všech řádcích, neobsahujících vzor
:[adresa]v/vzor/povel
jako :[adresa]g!/vzor/povel Př.:
     :[adresa]g/^/s//     /g 
vsune pět mezer před začátek každého řádku v celém souboru
:[adresa]s/vzor/náhrada/volby
na každém řádku, který vyhovuje regulárnímu výrazu vzor se nahradí prvý jeho výskyt řetězcem náhrada. .Volby: g - náhrada všech výskytů vzoru na řádku, c vyžaduje pokaždé potvrzení (ano=Y, ostatní klávesy ne )
&
zopakování náhrady směrem vpřed, rovněž :&
:~
zopakování náhrady směrem vzad
<<vzad obsah vpřed>>

16.19    Různé povely a triky

<CTRL>?
zruší přerušení
i<RETURN>
rozdělení řádku před kurzorem
a<RETURN>
rozdělení řádku za kurzorem
<CTRL>l
překreslení obrazovky
[n]J
spojení n následujících řádků do jednoho
:[rozmezí]j
spojení řádků definovaných rozmezím
:[rozmezí]nu
opíše řádky definované rozmezím, uvozené jejich čísly
:[adresa]=
vypíše číslo řádky s danou adresou. Př. Číslo aktuálního řádku se zjistí povelem :.= Číslo řádku obsahujícíhob řetězec "heslo" :/heslo/=
xp
vymění znak na který ukazuje kurzor se znakem předcházejícím
:abbr zkratka text
definuje pro delší text zkratku; lze použít v proměnné prostředí EXINIT nebo v souboru .exrc Př. :abbr pi Ludolfovo číslo V dalším textu místo Ludolfovo číslo stačí napsat pi
:una zkratka
zrušení zkratky Př. :una pi Řetězec pi ztrácí již význam zkratky
:mapznak povely
definice makra, které přiřadí znaku ( i netisknutelnému ) posloupnost povelů příkazového režimu vi. Pochopitelně nebude vhodné měnit znaky, které označují již povely ve vi editoru ( a,i,r...). Př. Chceme nadefinovat makro, které po stisku <CTRL>A vypíše na nový řádek řetězec Zapsal: , následovaný uživatelským jménem, aktuálním datem ve formátu dd.mm.rr a čárkou odděleným aktuálním časem ve formátu hh:mm. Potřebné makro má tento tvar:
 :map ^A A^M^[:r!echo "Zapsal: $LOGNAME `date "+\%d.\%m.\%y,\%H:\
 %M" ` "^[
Připomínám, že ^A značí a a ve vi editoru se zapíše při stisknuté klávese postupným stiskem va. Sekvence ^M je kód pro a ^[ pro . Ve formátovém řetězci je třeba zamaskovat znak % pomocí zpětného lomítka, protože % ve vi editoru representuje aktuální jméno souboru.
:map!znak povely
jako map, ale makro nelze zrušit povelem :unmap
:unmapznak
zruší makro, definované povelem map (nikoliv map!)
:preserve
v případě neúspěchu při zápisu do souboru uloží vyrovnávací paměť vi editoru do systémové oblasti (pokud je definována). Použít pouze jako poslední možnost, nepovede-li se povel :wm.
:recover soubor
obnoví soubor ze systémové oblasti, kam byl uložen při havarii Unixu nebo povelem :preserve
:tag cíl
nastaví kurzor na cíl v aktuálním souboru, případně v jiném souboru aktuálního adresáře. Cíl je název vzoru, který musí být s ním a se jménem souboru jej obsahujícím uložen v souboru se jménem tags, který je v aktuálním adresáři. Soubor tags obsahuje pro každý cíl jeden řádek, obsahující tyto položky, oddělené mezerami či tabulátory: -cíl, název na něž se odkazuje povelem tag -jméno souboru, obsahující cíl -regulární výraz, který slouží k nalezení cíle. Ten by měl být konstruován tak, aby byl pokud možno jednoznačný při opravách okolního textu. Řádky souboru tags musí být vzestupně setříděny. Soubor tags se zpravidla generuje utilitami, např. příkazem ctags, který jej vytvoří pro zdrojové texty v jazyce C. Jako cíle tento příkaz považuje funkce jazyka C. Zadáme-li povel tag bez argumentu, použije se argument z předchozího povelu tag. Stiskneme-li ], považuje se za cíl slovo na kterém stojí kurzor. Př.: V aktuálním adresáři máme řadu zdrojových programů v jazyce C. Příkazem shellu ctags *.c se vytvoří v tomto adresáři soubor tags. Při psaní programu nove_reseni.c vi editorem chceme opravit funkci iterace_1, přičemž jsme zapomněli, ve kterém souboru je deklarována. To však nevadí; povelem vi editoru :tag iterace_1 se automaticky přepneme do správného souboru na začátek funkce iterace_1.
<<vzad obsah vpřed>>

16.20    Volby a jejich nastavení

Nastavení a výpis voleb pomocí :

Nejdůležitější volby, ostatní viz man:

autoindent, zkratka ai, standardně noai
Nastaví zarovnávání textu.
autoprint, zkratka ap, standardně ap
Zobrazí aktuální řádku po každém ex povelu pro kopírování, přesun nebo náhradu textu.
errorbells, zkratka eb, standardně noeb
Chybovému hlášení předchází zvukový signál.
ignorecase, zkratka ic, standardně noic
V regulárních výrazech považuje velká písmena za písmena malá s výjimkou písmen, uzavřených v závorkách.
lisp, standardně nolisp
Zarovnávání textu tak, aby se příjemně psal text v jazyce Lisp.
list, standardně nolist
Text se tiskne s vyznačenými tabelátory (jako ^I ) a konci řádky (jako $ ).
magic, standardně magic
Nastaví-li se volba nomagic, pak v regulárních výrazech se za metaznaky se zvláštním významem považují pouze ^ a $
mesg, standardně nomsg
Volba nomsg zakáže psát unixové zprávy na obrazovku v režimu vi - ochrana před přepsáním obrazovky.
number, zkratka nu, standardně nonu
Před každým řádkem je zobrazeno jeho číslo.
shell, zkratka sh, standardně sh=/bin/sh
Cesta na shell, spouštěný povely :! nebo :sh; je-li nastavena proměnná prostředí SHELL, pak se vezme její hodnota jako standardní
tabstop, zkratka ts, standardně ts=8
Nastaví tabulátory
<<vzad obsah vpřed>>