Linux: Kniha kouzel, vanilková příchuť 1.17 (27. února 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

21. Vim

Řada 1.x vanilkové příchuti Linuxu: Knihy kouzel je od 1. října 2020 do 1. března 2023 ve stavu dlouhodobé pasivní údržby; nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje novější vývojové řadě určené pro novější verze operačního systému a programů. Pokud nejste vázáni na starší verze programů, doporučuji vyhledat novou verzi z aktivně vyvíjené vývojové řady.
editor ovládání program

1. Úvod

Tato kapitola se věnuje editoru Vim. Vim je textový editor (původně terminálový, ale nabízí v samostatném balíčku také GUI), práce s nímž je založena na přepínání mezi řadou režimů, z nichž nejdůležitější jsou základní režim, ve kterém se zadávají příkazy, kterými uživatel ovládá editor, a vkládací režim, v němž uživatel píše text.

Tato verze kapitoly se nevěnuje stylu „práce s objekty“ a vyhýbá se funkcím, jejichž činnost závisí na konkrétní syntaxi editovaného textu (např. skok na deklaraci proměnné pod kurzorem). Rovněž nepokrývá doplňování s našeptáváním (autocomplete), skládání (folding), režim srovávání „vimdiff“, specifika GUI varianty (gvim) a zásuvné moduly (plug-ins). Nedostatečně pokrývá příkaz „g//“.

2. Definice

2/1 Režimy editoru Vim

Další režimy můžete najít v dokumentaci, ale pravděpodobně o nich nyní nepotřebujete vědět.

2/2 Další pojmy

3. Zaklínadla: Posuny kurzoru a pohledu, záložky

3/1 Posun kurzoru jen v rámci řádky

vlevo/vpravo o 1 znak#1
vlevo/vpravo o N znaků#2
N
N
na začátek/konec řádky#3
Home
End
na následující/předchozí výskyt určitého znaku#4
[počet-opakování]fznak
[počet-opakování]Fznak
před následující/předchozí výskyt určitého znaku#5
[počet-opakování]tznak
[počet-opakování]Tznak
zopakovat poslední zadaný příkaz „f“, „F“, „t“ či „T“#6
[počet-opakování];
na první nebílý znak řádky#7
^
ϯdo konkrétního sloupce (logického od 1/znakového od 0)#8 (1)
číslo-sloupce|
Homečíslo-sloupce

3/2 Posun kurzoru na jinou řádku

PNZ = první nebílý znak

nahoru/dolů o 1 řádek#1
nahoru/dolů o N řádek#2 (2)
N
N
řádek číslo N, PNZ (alternativy)#3
NG
:NEnter
na začátek/střed/konec pohledu, PNZ#4
H
M
L
na první/poslední řádku souboru, PNZ#5
gg
G
na N-tý řádek pohledu, PNZ#6
NH
na následující/předchozí řádku, PNZ#7
Enter
^
na následující prázdný/neprázdný řádek#8
[počet-opakování]/^$Enter
[počet-opakování]/^.Enter

3/3 Vyhledávání

\c = ignorovat velikost písmen; /e = kurzor nastavit na poslední znak shody (jinak na první).

najít následující/předchozí výskyt podřetězce#1 (3)
/[\c]\Vpodřetězec[/e]Enter
?[\c]\Vpodřetězec[/e]Enter
najít následující/předchozí shodu s regulárním výrazem#2 (4)
/[\c][\v]regulární výraz[/e]Enter
?[\c][\v]regulární výraz[/e]Enter
zopakovat poslední vyhledávání stejným/opačným směrem#3
n
N

3/4 Záložky

nastavit záložku na pozici kurzoru#1 (5)
mpísmeno
přejít kurzorem na pozici záložky#2
`písmeno
vypsat nastavené (a systémové) záložky#3
:marksEnter

3/5 Ostatní posuny

posun na znak, který je zobrazený nad/pod aktuálním#1
[počet-opakování]gk
[počet-opakování]gj
skok na odpovídající párovou závorku#2 (6)
%
skok na poslední upravenou pozici#3
g;

3/6 Posuny po slovech

Programátorské slovo“ je sekvence jakýchkoliv nebílých znaků; „standardních slovo“ je sekvence nebílých znaků, které jsou buď alfanumerické, nebo tvoří interpunkci. To znamená, že např. „a1a;;;B2B“ je jedno programátorské slovo, ale tři standardní! (Podobně „Ahoj, světe!“ jsou dvě programátoská slova, ale čtyři standardní.)

o jedno/N „programátorských slov“ vpřed#1
W
NW
o jedno/N „programátorských slov“ vzad#2
B
NB
na poslední znak programátorského/standardního slova#3
E
e
o jedno „standardní slovo“ vpřed/vzad#4 (7)
Shift+
Shift+
o N „standardních slov“ vpřed/vzad#5
Nw
Nb

4. Zaklínadla: Základní

4/1 Psaní textu (vkládání a přepisování)

psát text, počínaje znakem pod kurzorem/následujícím znakem/koncem řádky/začátkem řádky#1
i(režim vkládání)
a(režim vkládání)
A(režim vkládání)
0i(režim vkládání)
vložit novou prázdnou řádku před/za aktuální a psát na ní text#2
O(režim vkládání)
o(režim vkládání)
přepisovat text, počínaje znakem pod kurzorem#3 (8)
R(režim přepisování)
přepnout vkládání na přepisování/přepisování na vkládání#4
(režim vkládání)Insert(režim přepisování)
(režim přepisování)Insert(režim vkládání)
vložit text opakovaně#5
počet-opakováníitextEsc

4/2 Soubory, adresáře a aktivní pohled

uložit změny a zavřít pohled (alternativy)#1
ZZ
:wqEnter
zavřít pohled (opatrně/zahodit změny)#2
:qEnter
:q!Enter
otevřít soubor (opatrně/zahodit změny)#3
:e cestaEnter
:e! cestaEnter
uložit změny (v aktuálním pohledu/ve všech pohledech)#4 (9)
:wEnter
:waEnter
znovu načíst otevřený soubor (zahodit změny)#5 (10)
:e!Enter
vypsat/změnit aktuální adresář editoru#6
:pwdEnter
:cd cestaEnter
vytvořit adresář#7
:!mkdir [-p] cestaEnter
zapsat kopii souboru#8
:w cílová/cestaEnter
zapsat rozsah řádek do souboru (obecně/příklad)#9
:první-zapsaná,poslední-zapsanáw cílová/cestaEnter
:3,17w prehledy/radky.txtEnter
načíst soubor a vložit za aktuální řádek#10
:r cesta/k/souboruEnter
otevřít soubor jen pro čtení#11
:e[!] cestaEnter:set roEnter
ukončit editor (uložit změny/opatrně/zahodit změny)#12
:wqaEnter
:qaEnter
:qa!Enter

4/3 Kopírování, mazání a schránky

Tip: jako výchozí používejte schránku „p“.

aktuální řádka (smazat/vyjmout/zkopírovat/nahradit textem)#1
dd
"schránkadd
"schránkayy
["schránka]cctextEsc
znak pod kurzorem (smazat/vyjmout/zkopírovat/nahradit znakem/nahradit textem)#2
x
"schránkax
"schránkayl
rznak
["schránka]cltextEsc
znaky do konce aktuální řádky (smazat/vyjmout/zkopírovat/nahradit textem)#3
dEnd
"schránkadEnd
"schránkayEnd
["schránka]cEndtextEsc
znaky od začátku aktuální řádky před kurzor (smazat/vyjmout/zkopírovat/nahradit textem)#4
dHome
"schránkadHome
"schránkayHome
["schránka]cHometextEsc
aktuální řádek a všechny následující neprázdné (smazat/vyjmout/zkopírovat/nahradit textem)#5
d/^$Enter
"schránkad/^$Enter
"schránkay/^$Enter
["schránka]c/^$Entertext
N řádků počínaje aktuálním (smazat/vyjmout/zkopírovat/nahradit textem)#6
Ndd
"schránkaNdd
"schránkaNyy
["schránka]NcctextEsc

4/4 Vložit, spojit, duplikovat

vložit obsah schránky (za aktuální pozici/před ni)#1
"schránka][počet-opakování]p
"schránka][počet-opakování]P
vložit poslední smazaný či nahrazený text (za akt. pozici/před ni)#2
[počet-opakování]p
[počet-opakování]P
spojit řádky (viz poznámku)#3 (11)
J
duplikovat aktuální řádek#4
yypočet-opakováníp

4/5 Externí příkazy a spolupráce s bashem

˥ukončit editor bez uložení změn (opatrně/zahodit změny/uložit změny)#1
:qaEnter
:qa!Enter
:qwaEnter
odsunout editor na pozadí#2 (12)
Ctrl+Z
spustit externí příkaz#3
:!příkazEnter
otevřít interpret příkazové řádky (obvykle bash)#4
:shellEnter
vykonat externí příkaz a vložit jeho standardní výstup za aktuální řádek (obecně/příklad)#5
:r !příkaz [parametry]Enter
:r !ls -lhEnter
zamrznout na N sekund#6 (13)
Ngs

4/6 Nahradit text (příkaz „:s“)

Poznámka: parametr „kde“ u příkazu „:s“ může být: prázdný řetězec pro nahrazování v aktuální řádce; znak % pro nahrazování v celém souboru; číselný rozsah řádků (např. „5,25“) pro nahrazování na řádcích v uvedeném rozsahu „včetně“.

nahradit první výskyt podřetězce/všechny výskyty#1 (14)(15)
:kdes/\Vpodřetězec/čím nahradit/Enter
:kdes/\Vpodřetězec/čím nahradit/g[c]Enter
nahradit první shodu s reg. výrazem/všechny shody#2 (16)
:kdes/\vregulární výraz/čím nahradit/Enter
:kdes/\vregulární výraz/čím nahradit/g[c]Enter

4/7 Odsazení

nastavit šířku jedné úrovně odsazení#1 (17)
:set shiftwidth=počet-mezerEnter
zvětšit odsazení řádek (alternativy)#2
[počet-řádků]>>
(režim výběru)[počet-úrovní]>
zmenšit odsazení řádek (alternativy)#3
[počet-řádků]<<
(režim výběru)[počet-úrovní]<
odstranit odsazení z výběru#4 (18)
(režim výběru)999<
odstranit odsazení z aktuálního řádku#5 (19)
V999<

4/8 Velikost písmen

písmeno pod kurzorem (přepnout/malé/velké)#1
~
vu
vU
N písmen na aktuálním řádku, počínaje kurzorem (přepnout/malé/velké)#2
N~
vN-1lu
vN-1lU
řádka na malá písmena#3
Vu
řádka na velká písmena#4
VU
každé první písmeno slova velké, ostatní malá#5

4/9 Pokročilé úpravy

odstranit každý řádek vyhovující/nevyhovující regulárnímu výrazu#1
:g/[\v]regulární výraz/d [_]Enter
:v/[\v]regulární výraz/d [_]Enter

5. Zaklínadla: Režim výběru

5/1 Režim výběru

výběr po znacích (normální)#1
v(režim výběru)
výběr po celých řádkách (řádkový)#2
V(režim výběru)
sloupcový výběr#3
Ctrl+V(režim výběru)
obnovit poslední výběr#4 (20)
gv(režim výběru)
přepnout na opačný konec výběru#5
(režim výběru)o(režim výběru)
ve sloupcovém výběru přepnout do opačného rohu na stejném řádku#6
(režim výběru)O(režim výběru)

5/2 Operace nad jakýmkoliv výběrem

smazat#1
(režim výběru)d
vyjmout/zkopírovat#2
(režim výběru)"schránkad
(režim výběru)"schránkay
celý výběr na malá/velká písmena/přepnout velikost písmen#3
(režim výběru)u
(režim výběru)U
(režim výběru)~
nahradit (jen normální a řádkový výběr!)#4
(režim výběru)c(režim vkládání)
nahradit všechny znaky určitým znakem#5
(režim výběru)rznak

5/3 Operace nad řádkovým výběrem

spojit řádky#1
(režim výběru)J
profiltrovat externím příkazem#2
(režim výběru)!příkaz s parametryEnter
zvětšit/zmenšit odsazení#3
(režim výběru)[počet]>
(režim výběru)[počet]<
automaticky přeformátovat řádky na šířku okna#4
(režim výběru)gq
nahradit text#5 (21)
(režim výběru):s/co/čím/[parametry]Enter

5/4 Operace nad sloupcovým výběrem

před/za každý řádek výběru vložit text#1
(režim výběru)ItextEsc
(režim výběru)AtextEsc
nahradit každou řádku výběru textem#2
(režim výběru)ctextEsc
před/za každý řádek vložit obsah schránky#3 (22)
(režim výběru)"schránkaP
(režim výběru)"schránkap

6. Zaklínadla: Ostatní

6/1 Historie změn

zopakovat poslední provedenou změnu na aktuální pozici#1
[počet-opakování].
vrátit poslední změnu (zpět)#2
u
znovu provést vrácenou změnu (znovu)#3
Ctrl+R
vrátit poslední upravovaný řádek do původního stavu#4 (23)
U

6/2 Makra

Tip: jako výchozí schránku pro makra používejte schránku „q“.

nahrávat prováděné stisky kláves jako makro#1 (24)
qschránkastisky klávesq
spustit makro#2
[kolikrát]@schránka
znovu spustit poslední spuštěné makro#3
[kolikrát]@@

6/3 Správce souborů

otevřít správce souborů (v pohledu nad/pod/vlevo/vpravo/na novém panelu)#1
:SexEnter
:HexEnter
:VexEnter
:Vex!Enter
:TexEnter
otevřít soubor/adresář ze správce souborů#2
Nastavte kurzor na název souboru.
Enter
přejít o adresář výš#3
(ve správci souborů)-
zavřít správce souborů (alternativy)#4
(ve správci souborů)ZZ
(ve správci souborů):q

6/4 Zvýraznění syntaxe

zapnout/vypnout zvýraznění syntaxe#1
:syntax onEnter
:syntax offEnter
ručně nastavit syntaxi#2
:setfiletype syntaxeEnter
vypsat seznam podporovaných syntaxí#3
:setfiletypeSpace
Ctrl+D
zvýrazňovat klíčové slovo jako klíčové slovo/identifikátor/funkci/operátor#4
:syntax keyword Keyword slovoEnter
:syntax keyword Identifier slovoEnter
:syntax keyword Function slovoEnter
:syntax keyword Operator slovoEnter
vypsat platná pravidla zvýrazňování syntaxe (není pro začátečníky)#5
:syntax listEnter

6/5 Ostatní

zobrazit kódovou (číselnou) hodnotu znaku pod kurzorem#1
ga⊨ <ž> 382, Hex 017e, Octal 576
inkrementovat/dekrementovat celé číslo pod kurzorem#2
Ctrl+A
Ctrl+X
vložit název otevřeného souboru před/za kurzor#3
"%P⊨ test.txt
"%p

7. Zaklínadla: Pohledy a panely

7/1 Posun pohledu

o stránku nahoru/dolů#1
PageUp
PageDown
aktuální řádku doprostřed pohledu#2
zz
o půl okna nahoru/dolů#3
Ctrl+U
Ctrl+D
o řádek nahoru/dolů#4
Ctrl+Y
Ctrl+E
na začátek/konec souboru#5
gg
G
aktuální řádek na horní/dolní okraj pohledu#6
zt
zb
o N znaků vlevo/vpravo (jen při vypnutém zalamování)#7
Nzh
Nzl

7/2 Práce s rozděleným panelem

rozdělit panel a v novém pohledu (nad stávajícím/vlevo od stávajícího) otevřít jiný soubor#1
:split cesta/k/souboruEnter
:vsplit cesta/k/souboruEnter
přepnout zaměření o pohled nahoru/dolu/doleva/doprava#2
Ctrl+W
Ctrl+W
Ctrl+W
Ctrl+W
rozdělit panel na pohledy nad sebou/vedle sebe#3
:splitEnter
:vsplitEnter
otevřít nový prázdný pohled nad aktivním/vlevo od aktivního#4
:newEnter
:vnewEnter
nastavit výšku aktivního pohledu#5
:res počet-řádekEnter
nastavit všechna rozdělení rovnoměrně#6
Ctrl+W=
rotovat pohledy#7
Ctrl+WR

7/3 Práce s více panely

otevřít nový panel (prázdný/se stejným souborem jako v aktivním pohledu/s jiným souborem)#1
:tabnewEnter
:tabnew %Enter
:tabnew cesta/k/souboruEnter
přepnout se na další/předchozí panel#2
gt
gT
zavřít panel#3 (25)
:tabcloseEnter

8. Zaklínadla: Nastavení

8/1 Obecně

nastavit volbu typu „ano/ne“ (zapnout/vypnout/přepnout)#1
:set volbaEnter
:set novolbaEnter
:set invvolbaEnter
nastavit číselnou či textovou volbu#2 (26)
:set volba=hodnotaEnter
zjistit hodnotu volby#3
:set volba?Enter
vypsat hodnoty všech voleb#4
:set allEnter

8/2 Vzhled

před každou řádkou zobrazit její číslo (v rámci souboru/relativní)#1
:set numberEnter
:set relativenumberEnter
podtrhnout aktuální řádek#2
:set cursorlineEnter
vypnout zalamování řádků#3
:set nowrapEnter
zvýraznit sloupec s kurzorem#4
:set cursorcolumnEnter
zvýraznit konkrétní sloupce#5
:set cc=číslo-sloupce[,další-číslo-sloupce]Enter
skrýt informace o aktuální pozici ve stavové řádce (nedoporučuji)#6
:set norulerEnter
skrýt název aktivního režimu ve stavové řádce (nedoporučuji)#7
:set noshowmodeEnter

8/3 Chování

při vyhledávání ignorovat velikost písmen#1
:set ignorecaseEnter
vypnout a smazat dočasný odkládací soubor/nastavit, kam ho uložit#2
:set noswapfileEnter
:set dir=cesta[,další/cesta]Enter
zapnout automatické odsazování#3
:set autoindentEnter
místo tabulátorů vkládat odpovídající počet mezer#4
:set expandtabEnter
zapnout automatické znovunačtení po změně souboru mimo Vim#5
:set autoreadEnter
nechat vim nastavit titulek emulátoru terminálu (je-li to možné)#6
:set titleEnter

8/4 Ostatní

zapnout/vypnout ovládání myší (doporučuji zapnout)#1
:set mouse=aEnter
:set mouse=Enter
dovolit posun kurzoru mimo řádek při blokovém výběru (doporučuji)#2
:set virtualedit=blockEnter
kódová stránka souboru#3 (27)
:set fileencoding=kódováníEnter

8/5 Příznaky

zakázat jakoukoliv změnu textu/zápis do souboru bez !/jakýkoliv zápis do souboru#1
:set nomodifiableEnter
:set roEnter
:set nowriteEnter
vypnout příznak, že soubor byl změněn#2
:set nomodifiedEnter

9. Parametry příkazů

vim [parametry] [--] soubor [další-soubor]
view [parametry] [--] soubor [další-soubor]
○ -o ○ -O ○ -pJe-li zadáno více souborů, otevře je: v pohledech nad sebou (shora)/v pohledech vedle sebe (zleva)/v panelech. Výchozí chování: Je-li zadáno více souborů, otevře se pouze první a ostatní jsou otevřeny skrytě a uživatel se na ně musí přepnout příkazem „:n“.
"+příkaz"Po otevření vykoná příkaz v režimu příkazové řádky (+ se nahradí „:“). Tento parametr lze zadat opakovaně, ale maximální počet je omezen. Nejčastější použití je s číslem řádky (např. „+12“).
☐ -nVypne použití odkládacího souboru, vše udržuje jen v paměti.
☐ -u vimrcMísto běžných konfiguračních souborů (vimrc) použije uvedený.

Příkaz „view“ otevře soubor v režimu „jen pro čtení“, „vim“ ho otevře pro úpravy.

10. Instalace na Ubuntu

Editor Vim lze na Ubuntu doinstalovat tímto příkazem:

sudo apt-get install vim

Místo „vim“ si můžete nainstalovat balíček „neovim“, což je nová, víceméně kompatibilní implementace téhož editoru. Podle mé zkušenosti se z uživatelského hlediska liší prakticky jen odlišným výchozím nastavením.

Základní součástí Ubuntu (a mnoha jiných distribucí) je editor „vi“, což je předchůdce Vimu. V něm však většina zaklínadel z této kapitoly není použitelná.

11. Tipy a zkušenosti

12. Další zdroje informací

V začátcích je nejlepším zdrojem informací „Vim Reference: Quick Reference Guide“ a rozhodně doporučuji manuál Pavla Satrapy, nicméně pokud s editorem Vim nemáte dřívější zkušenosti, určitě si nejprve vyzkoušejte kurz spouštěný příkazem „vimtutor“.

K referenční příručce můžete získat přístup také přímo v editoru Vim příkazem „:help“, ale vzhledem k tomu, že Vim se téměř nevyvíjí, neměl by být problém použít online referenční příručku i s velmi starou verzí Vimu (ne však s „vi“).

1 V případě logických sloupců se tabulátor počítá jako 1 či více sloupců podle své šířky; v případě znakových sloupců se počítá vždy jako jeden znak.
2 K posunu kurzoru nahoru či dolů po řádkách obrazovky místo po řádkách souboru slouží příkazy „gk“ a „gj“.
3 V podřetězci je nutno odzvláštnit zpětná lomítka!
4 Poznámka: vim používá vlastní syntaxi regulárních výrazů, která je nejpodobnější základním regulárním výrazům. Při použití této funkce buďte opatrní a očekávajte problémy se složitějšími výrazy.
5 Jako označení záložky můžete použít malá písmena anglické abecedy („a“ až „z“.)
6 Tento příkaz funguje (za předpokladu správného spárování závorek) přinejmenším pro závorky (), [] a {}.
7 Funguje i v režimu vkládání.
8 Stisknete-li v režimu přepisování klávesu Backspace, obnoví se tím původně přepsaný znak.
9 Pokud nemáte otevřený žádný soubor, k prvnímu uložení textu musíte použít příkaz „:w“ s cestou, jinak skončíte s chybou „Žádný název souboru“.
10 Tip: účinky tohoto příkazu můžete zrušit okamžitým provedením příkazu „u“.
11 Připojí následující řádku na konec aktuální. Pokud aktuální řádka končí znakem, který není mezera, před připojením tam mezeru vloží. Prázdný řádek nekončí žádným znakem, proto za něj mezeru nevkládá.
12 Zpět na popředí obnovíte editor příkazem „fg“.
13 Zamrznutí můžete předčasně ukončit kombinací kláves Ctrl+C.
14 V podřetězci je nutno odzvláštnit znaky „\“ a „/“!
15 „c“ se před každým nahrazením zeptá a umožní vám nechtěné náhrady přeskočit.
16 „c“ se před každým nahrazením zeptá a umožní vám nechtěné náhrady přeskočit.
17 Výchozí hodnota je 8. Toto nastavení nezmění text, má vliv až na další operace.
18 Funguje jen tehdy, pokud je každá řádka výběru odsazená o méně než 999 úrovní (což je pro typické textové soubory splněno).
19 Funguje jen tehdy, pokud je aktuální řádka odsazená o méně než 999 úrovní (což je pro typické textové soubory splněno).
20 Např. po nechtěném stisknutí Esc.
21 Pro význam částí „co“ a „čím“ viz zaklínadla týkající se nahrazování textu. Tato varianta se od obyčejného příkazu „:s“ liší jen tím, že místo nad aktuálním řádkem pracuje nad řádky výběru.
22 Pozor! Toto funguje jen tehdy, pokud je obsah schránky ve „znakovém“ režimu; schránka tedy nesmí obsahovat celé řádky ani textový blok!
23 Poznámka: Pozor! Tento příkaz je sám o sobě změnou; k jeho odvolání použijte příkaz „u“, nikoliv Ctrl+R!
24 Zadáte-li schránku velkým písmenem, nahrané stisky kláves se připojí ke stávajícímu obsahu daného makra.
25 Obvykle panel uzavřete uzavřením posledního pohledu v něm příkazem „:q“.
26 Hodnota může být prázdná. Pokud textová hodnota obsahuje bílé či speciální znaky (kromě tečky a čárky), musíte je odzvláštnit zpětným lomítkem; použití uvozovek vim, zdá se, nepodporuje..
27 Tuto vlastnost jsem příliš nezkoušel/a. Pokud s ní nemáte zkušenosti, doporučuji překódování raději provádět příkazem „iconv“ mimo vim.
Datum, čas a kalendářMarkdownSystém