VI - textovy editor

(M.Mach)

Pozn: Znaky <text> oznacuju miesto, kde sa vklada specificky text (jeho obsah zavisi na kontexte). Znaky [] oznacuju volitelnost. Text medzi nimi moze alebo nemusi byt. Samotne znaky [] sa nevkladaju. Stlacenie klavesy je oznacene <KLAVESA>. Konstrukcia <KLAVESA> + <klavesa> oznacuje sucasne stlacenie dvoch klaves. Ak nie je uvedene inak, tak v pripade, ze [<n>] nie je dane, implicitne sa uvazuje hodnota 1. Znaky <retazec> oznacuju lubovolny (aj viacriadkovy) text.

Ako sa startuje a ukoncuje praca s editorom?

vi - editacia noveho suboru (bez priradeneho mena)
vi <subor> - zaciatok editacie konkretneho suboru
vi <subor1> <subor2> ... - editacia viacerych suborov
:q<ENTER> - ukoncenie (ak nie su neulozene zmeny v texte)
:q!<ENTER> - ukoncenie prace (neulozene zmeny sa stratia)
ZZ - ukoncenie prace (ak je potrebne, zmeny sa najprv ulozia)

Ako mozem pracovat so subormi?

Ako pracovat s jednym suborom?

(<rozsah> je implicitne cely text; inak moze byt napr. stanoveny cislami dvoch riadkov v tvare <r1>,<r2>):
:[<rozsah>]w<ENTER> -zapis textu do suboru s implicitnym menom (ak existuje, bude prepisany)
:[<rozsah>]w <subor><ENTER> - zapis textu do suboru (iba ak tento este neexistuje)
:[<rozsah>]w! <subor><ENTER> - zapis textu do suboru (ak existuje, bude prepisany)
:[<rozsah>]w >><subor><ENTER> - zapis textu na koniec suboru (iba ak tento subor uz existuje)
:[<rozsah>]w! >><subor><ENTER> - zapis textu na koniec suboru (ak neexistuje, bude vytvoreny)
:[<riadok>]r <subor><ENTER> - obsah suboru sa vlozi za specifikovany riadok. Implicitne za aktualny.
:f <subor><ENTER> - zmena implicitneho mena suboru (pre prikazy ZZ a :w)

Ako pracovat s viacerymi subormi?

:n<ENTER> - prechod na dalsi subor (ak nie su ziadne neulozene zmeny v texte)
:n!<ENTER> - prechod na dalsi subor
:rewind<ENTER> - prechod na prvy subor (ak nie su ziadne neulozene zmeny vtexte)
:rewind!<ENTER> - prechod na prvy subor +^ - navrat na posledne editovany subor
:e <subor><ENTER> - prechod na zadany subor

Ake su moznosti pre ovladanie polohy kurzora?

[<n>]k ( [<n>]j ) - n riadkov nahor (nadol)
[<n>]h ( [<n>]l ) - n pozicii vlavo (vpravo)
0 - na prvy znak aktualneho riadku
^ - na prvy neprazdny znak v aktualnom riadku
[<n>]| - na n-tu poziciu v aktualnom riadku
[<n>]$ - nadol o n-1 riadkov na posledny znak
[<n>]+ ( [<n>]- ) - n riadkov nadol (nahor) na prvy neprazdny znak v riadku
[<n>]G - na riadok cislo n (implicitne posledny riadok)
[<n>]+f ( [<n>]+b ) - n stran nadol (nahor)
[<n>]L ( [<n>]H ) - na n-ty riadok od konca (zaciatku) obrazovky
M - na stredny riadok na obrazovke
[<n>]+e ( [<n>]+y ) - rolovanie obrazovky o n riadkov nahor (nadol)
[<n>]w - o n slov dopredu, kurzor na zaciatok slova
[<n>]b - o n-1 slov spat, kurzor na zaciatok slova
[<n>]e - o n-1 slov dopredu, kurzor na koniec slova

Ako mozem vlozit text?

[<n>]i<retazec><ESC> - pred kurzor vlozi n-krat text
[<n>]I<retazec><ESC> - pred prvy neprazdny znak na aktualnom riadku vlozi n-krat text
[<n>]a<retazec><ESC> - za kurzor vlozi n-krat text
[<n>]A<retazec><ESC> - na koniec aktualneho riadku sa vlozi n-krat text
o<retazec><ESC> - za aktualny riadok vlozi novy riadok a do neho vlozi text
O<retazec><ESC> - pred aktualny riadok vlozi novy riadok a do neho vlozi text

Ako mozem zrusit text?

[<n>]x - zrusi znak pod kurzorom a n-1 nasledujucich znakov v aktualnom riadku
[<n>]X - zrusi znak pred kurzorom a n-1 predchadzajucich znakov v aktualnom riadku
[<n>]dw - zrusi znaky od kurzoru az do konca slova a n-1 nasledujucich slov
[<n>]d$ - zrusi znaky od kurzoru az do konca riadku a n-1 nasledujucich riadkov
[<n>]dd - zrusi aktualny riadok a n-1 nasledujucich riadkov
[<n>]dL ( [<n>]dH ) - zrusi znaky od kurzora po n-ty riadok od konca (zaciatku) obrazovky
d0 - zrusi znaky od zaciatku riadku az po kurzor
:<r1>,<r2>d<ENTER> - zrusi riadky r1 az r2
:<r>d<n><ENTER> - zrusi n riadkov pocnuc riadkom r

Ako mozem nahradit text?

[<n>]r<znak> - nahradi znak pod kurzorom a nasledujucich n-1 znakov znakmi
[<n>]R<retazec><ESC> - od pozicie kurzora tolko znakov, kolko ich obsahuje, nahradi n vyskytmi retazca
[<n>]cw<retazec><ESC> - znaky od kurzoru az do konca slova a n-1 nasledujucich slov nahradi textom
[<n>]c<retazec><ESC> - znaky od kurzoru az do konca riadku a n-1 nasledujucich riadkov nahradi textom
[<n>]cc<retazec><ESC> - aktualny riadok a n-1 nasledujucich riadkov nahradi textom
c0 - nahradi znaky od zaciatku riadku az po kurzor
[<n>]s<retazec><ESC> - znak pod kurzorom a n-1 nasledujucich znakov nahradi textom

Ako mozem kopirovat text?

Text nie je mozne kopirovat priamo ale iba prostrednictvom implicitneho bufra alebo jedneho z bufrov oznacenych a - z. Ak sa neuvadza meno bufra,pracuje sa s implicitnym.

Ako realizovat prenos do bufra?

["<bufer>][<n>]yw - kopiruje znaky od kurzoru az do konca slova a n-1 nasledujucich slov
["<bufer>][<n>]y$ - kopiruje znaky od kurzoru az do konca riadku a n-1 nasledujucich riadkov
["<bufer>][<n>]yy - kopiruje aktualny riadok a n-1 nasledujucich riadkov
["<bufer>]y0 - kopiruje znaky od zaciatku riadku az po kurzor
["<bufer>][<n>]yL ( ["<bufer>][<n>]yH ) - kopiruje od kurzora po n-ty riadok od konca (zaciatku) obrazovky
Pozn: ak sa ako meno bufra uvedie velke pismeno, ma to za nasledok pripojenie textu k obsahu bufra.

Ako realizovat prenos z bufra do textu?

["<bufer>][<n>]p - obsah bufra vlozi n krat za kurzor
["<bufer>][<n>]P - obsah bufra vlozi n krat pred kurzor

Ako mozem vratit text do povodneho stavu?

Mozem obnovit text po lubovolnej modifikacii textu?

u - zrusenie posledneho prikazu, modifikujuceho text (pri pouziti v tele makra rusi vsetky zmeny textu vykonane od zaciatku tela makra)
U - zrusenie vsetkych zmien aktualneho riadku od vstupu kurzora na tento riadok

Mozem obnovit text po zruseni textu?

Zruseny text je umiestnovany do implicitneho bufra. Odtial ho mozno prekopirovat spat do textu. Okrem toho existuje 9 bufrov oznacenych cislicami 1 az 9. Ak su rusene cele riadky, tak tieto sa ukladaju do bufra 1, obsah bufra 1 sa presunie do bufra 2 atd. Obnovit zruseny text z niektoreho bufra
"<bufer>[<n>]p - obsah bufra vlozi n-krat za kurzor
"<bufer>[<n>]P - obsah bufra vlozi n-krat pred kurzor

Ako mozem v texte vyhladavat?

/<retazec><ENTER> - hladanie retazca <retazec> od pozicie kurzora smerom dopredu
?<retazec><ENTER> - hladanie retazca <retazec> od pozicie kurzora smerom spat
n ( N ) - pokracuje v hladani posledne hladaneho retazca v rovnakom (opacnom) smere
[<n>]f<znak> - v aktualnom riadku od kurzora ku koncu riadku hlada dany znak a zastane na nom
[<n>]F<znak> - v aktualnom riadku od kurzora k zaciatku riadku hlada dany znak a zastane na nom
[<n>]t<znak> - v aktualnom riadku od kurzora ku koncu riadku hlada dany znak a zastane pred nim
[<n>]T<znak> - v aktualnom riadku od kurzora k zaciatku riadku hlada dany znak a zastane za nim

Ako mozem v texte vyhladavat a nahradzat?

:[<rozsah>]s/<stary ret.>/<novy ret.>/[g][c]<ENTER>
Rozsah je implicitne aktualny riadok. Inak moze byt napr. stanoveny dvoma riadkami vo forme <r1>,<r2> alebo cely subor dany znakom % Znaky na konci prikazu:
c - vyzaduje sa potvrdenie nahrady
g - nahrada sa tyka vsetkych vyskytov v danom rozsahu

Ako si zapamatat poziciu v texte?

Do textu je mozne vsuvat znacky. Celkove je moznych tolko znaciek, kolko je malych pismen abecedy. Znacky su oznacene a - z. Zavedenie znacky:
m<znacka>
Niektore moznosti vyuzitia:
`<znacka> - nastavenie kurzora na znacku
'<znacka> - nastavenie kurzora na riadok so znackou
y`<znacka> - kopirovanie textu od kurzora po znacku
d`<znacka> - rusenie textu od kurzora po znacku
c`<znacka> - nahrada textu od kurzora po znacku
:'<znacka>,.w <subor><ENTER> - ulozenie textu od znacky po aktualny riadok do suboru

Ako pri editovani vyuzit ostatne programy?

Je mozne zadat prikaz operacneho systemu
:!<unix prikaz><ENTER>
Ak chceme vysledok prikazu vlozit do textu tak prikaz
:[<riadok>]r!<unix prikaz><ENTER>
tento vysledok vlozi za specifikovany riadok (implicitne za aktualny riadok).
Ak je potrebne nejaku cast textu spracovat externym programom (napr. sort,grep, expand ap.) a nahradit ju vysledkom tohto spracovania, potom je mozne pouzit napr.:
!`<znacka><unix prikaz><ENTER> - pre oblast od kurzora po znacku v texte
!}<unix prikaz><ENTER> - od kurzora po koniec paragrafu
!!<unix prikaz><ENTER> - pre aktualny riadok
!G<unix prikaz><ENTER> - od kurzora po koniec suboru

Ako mozem definovat makra?

Zobrazenie momentalne definovanych makier
:map<ENTER> - makra pre prikazovy rezim
:map!<ENTER> - makra pre vkladaci rezim
Definicia makier
:map <volanie makra> <telo makra><ENTER>
:map! <volanie makra> <telo makra><ENTER>
Makro moze byt volane stlacenim jednej klavesy alebo sekvencie klaves. Pri zobrazitelnych znakoch sa zada priamo ten znak alebo sekvencia znakov. Pri zadavani nezobrazitelnych znakov kazdy z nich musi byt uvedeny kombinaciou <CTRL>+v napr.:
:map <CTRL>+v<F1> :!more vihelp
alebo
:map! <CTRL>+v<sipka dole> <CTRL>+v<ESC>ja ).
Pozn: pri volani makra sekvenciou klaves tieto musia byt stlacene v kratkom intervale, inak su povazovane za samostatne znaky.

S ktorymi makrami pre ulahcenie prace mam zacat?

Vkladaci rezim:
  • pohyb smerovymi sipkami
  • map! <CTRL>+v<sipka nahor> <CTRL>+v<ESC>ka
    map! <CTRL>+v<sipka nadol> <CTRL>+v<ESC>ja
    map! <CTRL>+v<sipka vlavo> <CTRL>+v<ESC>ha
    map! <CTRL>+v<sipka vpravo> <CTRL>+v<ESC>la
  • mazanie znaku pod kurzorom
  • map! <CTRL>+v<Del> <CTRL>+v<ESC>lxi
  • mazanie znaku pred kurzorom
  • map! <CTRL>+v<Backspace> <CTRL>+v<ESC>xi
    Prikazovy rezim:
  • hladanie dopredu podla slova pod kurzorom
  • map =/ moI<Space><CTRL>+v<ESC>`olT<Space>moi/<CTRL>+v<ESC>"odEu` o@o<CTRL>+v<ENTER>
  • v ELM vlozenie obsahu nejakej posty do pripravovanej posty (cislo vkladanej posty je pod kurzorom)
  • map =m moI<Space><CTRL>+v<ESC>`olT<Space>i!!readmsg<Space><CTRL>+v<ESC>2b"o3de @o<CTRLv+v<ENTER>

    Ako si skratit pracu skratkami?

    Editor dovoluje definovat skratky, ktore potom sam rozvija na plny tvar.Skratku je mozne definovat
    :ab <skratka> <plny rozvinuty tvar><ENTER>
    a potom vo vkladacom rezime napisat <skratka><SPACE> alebo <skratka><ENTER>a skratka sa automaticky nahradi svojim plnym tvarom.

    Ako prisposobit nastavenie editora?

    Momentalne nastavenie editora je mozne zistit prikazom
    :set all<ENTER>
    Jednotlive volby mozu byt alebo logicke alebo mozu mat numericku hodnotu. Je ich mozne nastavit
    :set <volba><ENTER>
    :set <volba>=<hodnota><ENTER>
    Niektore zaujimave volby:
    (no)magic - (ne)povoluje regularne vyrazy pri hladani pomocou / ci ? a pri hladani s nahradou
    (no)wrapscan - (ne)povoluje pri hladani pomocou / a ? cyklicky prechod z konca textu na jeho zaciatok a naopak
    (no)list - (vypina)zapina zobrazovanie tabelatorov a koncov riadkov
    (no)showmatch - (vypina)zapina zobrazovanie protilahlych zatvoriek
    (no)ignorecase - pri hladani (rozoznava)nerozoznava velke a male pismena
    (no)autoindent - (vypina)zapina zarovnavanie podla prveho neprazdneho znaku predchadzajuceho riadku
    (no)showmode - (vypina)zapina indikaciu rezimu vkladania (nie je dostupne v kazdej verzii VI)
    (no)number - (vypina)zapina cislovanie riadkov wrapmargin=<hodnota> - ak kurzor dosiahne zadaneho poctu znakov od konca riadku, automaticky prechod na novy riadok (hodnota 0 vypina tento prechod)

    Ako vytvorit konfiguracny subor?

    Je mozne vytvorit subor s menom .exrc v domovskom adresari. Tento moze obsahovat definicie
    map <volanie makra> <telo makra>
    map! <volanie makra> <telo makra>
    set <volba>
    set <volba>=<hodnota>
    ab <skratka> <plny rozvinuty tvar>
    spolu s komentarovymi riadkami (zacinaju znakom " ).
    Ak obsahuje aj riadiace znaky, potom postup jeho vytvorenia je zlozitejsi.Je to mozne napr.:
    1. vo VI sa vytvori ako text
    2. nastavit kurzor na jeho zaciatok a zakodovat, napr.
      !Guuencode .exrc
    3. nastavit kurzor na zaciatok riadku begin 666 .exrc (mozu byt uvedene ine pristupove prava) a ulozit v rozkodovanom tvare
      !Guudecode

    Existuju este nejake zaujimave moznosti editora?

    Je ich vela. Niektore z nich:
    +g - na spodnom riadku sa zobrazi okrem ineho cislo aktualneho riadku a priznak modifikovanosti textu
    [<n>]. - n-krat sa zopakuje posledny prikaz, ktory modifikoval text
    % - ak je kurzor na zatvorke, presunie sa na odpovedajucu opacnu zatvorku
    [<n>]J - spojenie aktualneho a n-1 nasledujucich riadkov do jedneho riadku (implicitne sa spajaju dva riadky)
    ~ - male pismeno pod kurzorom sa nahradi velkym a naopak
    [<n>]>> ( [<n>]<< ) - posun n riadkov o tabelator vpravo (vlavo)
    @<bufer> - obsah bufra sa vykona ako sekvencia prikazov