Editace textu
Nejdůležitější editační operaci – vkládání nového
textu – již znáte z předchozí stránky. Stačí přejít do vkládacího
režimu a psát a psát a psát. Pokud uděláte chybu, lze ji obvyklým způsobem
umazat klávesou Backspace a nahradit správným
textem. Takto však Backspace funguje jen do té doby,
než opustíte vkládací režim. Pak je třeba sáhnout k jiným prostředkům.
Mazání
S výjimkou výše zmíněných elementárních oprav se mazání odehrává v normálním
režimu. Základní operaci – smazání znaku pod kurzorem – obstará
klávesa x. Samozřejmě jí lze předsadit číslo, takže
20x zlikviduje 20 znaků, počínaje tím pod
kurzorem.
Druhou obvyklou operací je smazání řádku. Na ten již budete potřebovat klávesy
dvě, a sice dd. Řádek, na němž se momentálně nachází
kurzor, bude zlikvidován.
Kopírování
Veškeré likvidační operace mají jednu zajímavou vlastnost: vymazaný text se
automaticky ukládá do registru, z nějž jej následně můžete vložit na
jiné místo. O vložení se postará klávesa p (vkládá
za aktuální pozici) nebo P (před aktuální
pozici).
Chování vkládaného materiálu se liší podle jeho charakteru. Pokud se jedná o pouhou část řádku, bude vložen do aktuálního řádku za nebo před kurzor. Jestliže však text v registru obsahuje alespoň jeden celý řádek, bude vložen za/před aktuální řádek.
Příklad:
Hezkým příkladem činnosti mazacích a vkládacích mechanismů je změna pořadí dvou po sobě jdoucích znaků. Obstará ji klávesová kombinace
xp, sledujte její chování:Vyjdeme ze slova
pohoda ^Stisknutím
xbude z textu odstraněn znak pod kurzorem (písmeno „h“) a zbytek řádku se posune doleva. Smazaný znak se automaticky uloží do registru. Aktuální stav tedy vypadá takto:pooda ^Stisknutím klávesy
pvložíte obsah registru za aktuální pozici. Jelikož v registru je jediný znak („h“), bude vložen do řádku za kurzor a vznikne:poohda ^
Příklad:
Druhý příklad zaměřím na likvidaci řádků. Řekněme, že máme text
raz dva tři čtyřiKurzor je na druhém řádku (odpovídající znak je vyznačen tučně a podtržen). Použijete-li příkaz
2dd, odstraníte druhý a třetí řádek:raz čtyřiChcete-li se vrátit k původnímu stavu, stačí stisknout
P. Jelikož registr obsahuje více než řádek, bude jeho obsah vložen jako samostatné řádky před řádek s kurzorem. Vznikne tedy opět původní textraz dva tři čtyři
Pokud chcete řádek (nebo jejich skupinu) přesunout do registru, ale
ponechat v textu, použijte yy. Tento příkaz uloží do
registru aktuální řádek. Chcete-li tedy zdvojit aktuální řádek,
použijte yyp.
Každé uložení do registru samozřejmě znamená, že jeho stávající obsah
bude zlikvidován. Z tohoto důvodu je podstatný rozdíl, zda při mazání pěti
znaků pětkrát stisknete klávesu x nebo použijete
5x. V prvním případě se provede pět samostatných
příkazů mazání. Každý z nich vloží do registru právě likvidovaný znak
a zruší jeho předchozí obsah. Po provedení posledního tudíž v registru
bude jediný (poslední vymazaný) znak. Naproti tomu 5x vymaže naráz všech pět znaků a do registru
uloží celou pětici.
Odvolávání a vracení
Dějiny nás učí, že umění v pravou chvíli odvolat bývá rozhodující mezi bytím a
nebytím. Proto většina moderních editorů dokáže odvolávat poslední provedené
změny a (pokud si to uživatel znovu rozmyslí) zase je vracet zpět. V případě
vim k odvolání poslední editační operace slouží klávesa u (jakožto „undo“). Můžete ji používat opakovaně a
odvolávat tak další a další akce.
Pokud si později uvědomíte, že některá z editačních operací zase nebyla až tak
špatná, můžete ji vrátit pomocí Ctrl-R (redo). Opět
je lze používat opakovaně.
Speciální druh odvolání představuje klávesa U.
Odvolá všechny změny, provedené na naposledy změněném řádku.
Ve skutečnosti je vnitřní život změn košatější. Může se stát, že po odvolání několika změn začnete dokument upravovat jinak. Pro mnoho editorů to znamená, že odvolané změny zmizí v nenávratnu. Vim si je ale bude pamatovat jako opuštěnou větev v editačním stromu a umožní se k nim vrátit.
Podívejme se na praktický příklad. Přidáme postupně po jednom tři slova, pak poslední dvě odvoláme a místo nich přidáme opět po jednom dvě nová. Následující tabulka ukazuje editační operace a obsah textu po jejich provedení. Čísla v prvním sloupci znázorňují stavy zapamatované pro historii editací:
| editace | výsledek | |
|---|---|---|
| 1 | ArazEsc |
raz |
| 2 | A dvaEsc |
raz dva |
| 3 | A třiEsc |
raz dva tři |
u |
raz dva |
|
u |
raz |
|
| 4 | A desetEsc |
raz deset |
| 5 | A dvacetEsc |
raz deset dvacet |
Odvoláváním nevznikají nové stavy, ale editor se vrací do stavů dříve
zapamatovaných. Zde postupně do stavů 2 a 1. Klávesy u a Ctrl-R se pohybují po
aktuální větvi stromu historie. Po provedení výše uvedených změn tedy budou
přecházet mezi stavy 5, 4 a 1. Vypadá to, jako by odvolané stavy byly
zapomenuty.
Ovšem pak tu máme ještě dvojice kláves g- a
g+, které se přesouvají do
předchozího/následujícího zapamatovaného stavu bez ohledu na to, na které větvi
se nachází. Ze stavu 4 vás klávesa u přesune do
stavu 1, zatímco dvojice kláves g- do stavu 3.
Tímto způsobem se můžete vrátit i do dříve opuštěných větví editace.
A pokud si ještě zapnete :set undofile, bude
vim ukládat změnové stavy do souboru, takže se k nim můžete vrátit i
poté, co soubor zavřete a znovu otevřete. Maximální počet zapamatovaných změn
(implicitní je 1000) nastavíte příkazem :set
undolevels=číslo.
Používání g- a g+
není uživatelsky dvakrát přívětivé. Základní vim nenabízí o mnoho
více, ale můžete si nainstalovat plugin, který
pseudograficky znázorní strom editace a zobrazuje, jak se dokument v
jednotlivých stavech změní. Existuje jich několik, například
undotree.
Editační lahůdky
Nastal čas nasadit sprint a zmizet milovníkům přesýpacích hodin za obzorem. Pro tuto část jsem si nechal několik specialit, které práci s vim velmi významně zrychlují.
První chuťovkou je prostá tečka. Příkaz . zopakuje
vaši poslední editační operaci. To znamená poslední vložení, smazání či změnu
textu. Pohyby nejsou považovány za editační operace.
Příklad:
Strohý popis činnosti tečky nezní nijak bombasticky. Je třeba si však uvědomit, že editační operace může být dosti inteligentní, místy až rafinovaná. Například budu mít seznam pěti jmen
Eleonora Líbezná Otýlie Kyselá Mojmír Slizký Jiří Milý Leonid Vasiljevič Brownkterý chci zařadit na WWW stránku. Chci z něj strukturálně udělat seznam, což znamená, že každé jméno má být obaleno prvkem
<li>. Přesunu kurzor na první řádek a použiji příkazI<li>[Esc]. Tím jsem na jeho začátek vložil<li>. Nyní stačí jen střídavě mačkatkurzor dolůa.a přidávat<li>na začátky dalších a dalších řádků. Obdobně mohu příkazemA</li>[Esc]přidat na konec řádku ukončovací značku a pomocí tečky ji pak snadno zopakovat na každém řádku.
Nejkouzelnější možností však je kombinace editačního příkazu s libovolným pohybem. Pokud před pohybem stisknete kouzelnou klávesu, bude se editační operace týkat textu od aktuální polohy kurzoru až po cílovou pozici, na niž se dostane provedením dotyčného pohybu. Základními kouzelnými klávesami jsou
d |
vymazání (delete), likvidovaný text se uloží do registru |
y |
kopírování do registru (yank) |
c |
změna (nahrazení novým obsahem, change) |
Takže například změnu slova zařídíte tak, že najedete kurzorem na jeho začátek
a použijete příkaz cw. Likvidaci odstavce (od
aktuální pozice do konce) obstará d}. Mým často
používaným příkazem je změna lokátoru v odkazu ve zdrojovém textu WWW stránky.
Přesunu kurzor za zahajující uvozovky a pak nasadím ct", čímž požaduji změnu textu až po následující
uvozovky. Kromě pohybů lze používat i
logické objekty, ale ty si nechám až na
později.
Samozřejmě je k dispozici též opakování. Nezáleží při něm na tom, zda použijete
2dw nebo d2w. V obou
případech budou vymazána dvě slova a uložena do vyrovnávací paměti.
Skutečnost, že zmiňované vylomeniny lze navíc snadno opakovat pomocí tečky,
představuje zcela novou úroveň rozkoše při používání vim.
Příklad:
Řekněme, že z firmy odešla paní Černá a místo ní nastoupila paní Bílá. Na webové stránce je třeba na několika místech aktualizovat její jméno. Můžete to udělat tradičně, dojet kurzorem na začátek jména, pětkrát stisknout
xneboDeletek jeho vymazání a následně přesivložit nové jméno. To by ale znamenalo, že se jedná o šest editačních operací – pětkrát odstranění písmene a jednou vložení nového textu. Když místo toho použijetecw(změnit slovo) a zadáte nové jméno, ušetříte si pár kláves a hlavně bude celá změna jednou editační operací. Snadno ji pak můžete zopakovat pomocí.pro další výskyty jména.Pro plošnou změnu by asi bylo lepší použít nahrazení, ale pokud by se měly měnit jen některé výskyty, je třeba udělat to ručně. Osobně používám
cwadwuž jen kvůli tomu, že to je jednodušší a rychlejší než opakované mačkáníDelete, zejména u delších slov.
Příklad:
Dalším pěkným příkladem je prohození pořadí dvou slov. Přesunete kurzor na začátek prvního a stisknete
dw. Tím slovo vymažete a zároveň si je vim uloží do registru. Přesunete kurzor za druhé slovo a stisknutímpvložíte obsah registru za něj. Kdybyste první slovo mazali po jednotlivých písmenech, bude v registru zapamatováno jen poslední písmeno.
Kromě základních tří modifikátorů d, y a c je k dispozici ještě řada
dalších. K používání některých z nich budete potřebovat pokročilejší
znalosti. Zde se omezím na pouhý výčet.
g~ |
zamění malá/velká písmena v textu |
gu |
převede text na malá písmena |
gU |
převede text na velká písmena |
! |
zpracuje text externím programem |
= |
zpracuje text externím formátovačem; jeho jméno lze nastavit pomocí :set equalprg; není-li nastaveno, uspořádá se jako
zdrojový text v C |
gq |
přeformátuje text podle platných okrajů |
> |
posune text doprava |
< |
posune text doleva |
© 2026 Pavel Satrapa