Užitečné skripty a pluginy pro textový editor Vim (6.část – cestování v čase)

Pavel Tišnovský 21. 4. 2015

V dnešní části článku o užitečných pluginech pro editor Vim se budeme zabývat zdánlivou trivialitou: operacemi typu „undo“ a „redo“. Uvidíme však, že v posledních verzích Vimu došlo k poměrně dalekosáhlým změnám, které jsou dále podpořeny několika pluginy, například populárním modulem Gundo.

Obsah

1. Užitečné skripty a pluginy pro textový editor Vim (6.část – cestování v čase)

2. Chování příkazů undoredo ve Vimu

3. Příkaz U

4. Bloky vytvářené pro operace undo, rozdělení a spojování bloků

5. Perzistentní operace undo

6. Strom změn v dokumentu (bufferu)

7. Plugin histwin

   7.1 Popis pluginu histwin

   7.2 Instalace pluginu histwin

   7.3 Použití pluginu histwin

8. Plugin undotree

   8.1 Popis pluginu undotree

   8.2 Instalace pluginu undotree

   8.3 Použití pluginu undotree

9. Plugin Gundo

   9.1 Popis pluginu Gundo

   9.2 Instalace pluginu Gundo

   9.3 Použití pluginu Gundo

10. Odkazy na předchozí části článku

11. Odkazy na Internetu

1. Užitečné skripty a pluginy pro textový editor Vim (6.část – cestování v čase)

Mezi základní operace podporované prakticky všemi unixovými textovými editory (a to včetně minimalistického editoru e3 naprogramovaného v assembleru) patří i operace typu undoredo, tj. operace sloužící k vracení provedených změn popř. k obnovení těchto změn („odvolávám co jsem odvolal“ :-)). Díky existenci těchto dvou operací je možné se vracet v čase a sledovat, jaké změny byly v dokumentu provedeny (to, zda a jak se informace o těchto změnách zachová i po ukončení práce editoru, si vysvětlíme v navazujícím textu). Od dob textového editoru Vi, který podporoval pouze jednoúrovňovou operaci undo, se Vim posunul mnohem dále, takže dnes je podporováno dokonce i vracení změn s možností větvení, které částečně připomíná funkce poskytované systémy pro správu verzí, ovšem v menším časovém měřítku (pravděpodobně nikdo nedělá commity do VCS s každou provedenou operací v textovém editoru). Některé relativně nové vlastnosti Vimu v této oblasti si popíšeme v navazujících kapitolách.

Obrázek 1: I tak zdánlivě jednoduchým operacím, jako je undo a redo, je v integrované nápovědě textového editoru Vim věnována poměrně dlouhá kapitola.

Nejprve si popišme základní operace typu undoredo. Většina těchto operací je  velkou pravděpodobností uživatelům textového editoru Vim dobře známá, možná až na příkaz U:

# Příkaz Význam
1 u vrátí poslední změnu provedenou v aktuálním bufferu
2 nu vrátí posledních n změn (n je číslo větší než nula, samotná nula je samostatným příkazem)
3 U vrátí všechny změny provedené na jednom textovém řádku (velmi užitečné, viz též třetí kapitolu)
4 Ctrl+R opak operace undo (platí pro poslední provedenou změnu)
5 nCtrl+R umožňuje odvolat posledních n operací undo

Obrázek 2: Novinkou ve Vim 7.3 je takzvané perzistentní undo, což je téma, kterému se budeme věnovat v páté kapitole.

2. Chování příkazů undoredo ve Vimu

Připomeňme si ještě, že chování všech výše popsaných operací je do značné míry ovlivněno volbou compatible popř. nocompatible, tj. volbou určující, zda se má textový editor Vim chovat podobně jako stařičký editor Vi či zda má naopak nabízet funkce očekávané ve třetím tisíciletí :-) Pokud je volba compatible nastavena, bude se operace u chovat zcela odlišně, protože bude jen jednoúrovňová. Editor si v tomto případě bude pamatovat jen poslední provedenou operaci, což mj. znamená, že po zadání příkazu uu bude stav aktuálně editovaného bufferu stejný, jako před stlačením prvního u, neboť druhý příkaz undo vrátil změny provedené prvním undo (to vlastně znamená, že ve Vi měla klávesová zkratka u význam jak operace undo tak i redo).

Obrázek 3: Původní obsah zdrojového kódu po načtení do bufferu. Kurzor se nachází na místě, kde dojde k modifikaci obsahu bufferu.

Obrázek 4: Buffer byl změněn smazáním jednoho řádku příkazem dd.

Obrázek 5: Další změna bufferu: smazání druhého řádku příkazem dd.

Zkušení uživatelé původního textového editoru Vi tuto vlastnost často používali pro jednoduché vizuální ukázání změn provedené posledním editačním příkazem, nicméně naprostá většina uživatelů modernějšího Vimu pro jistotu zadává do svého konfiguračního souboru .vimrc následující volbu (bez které ostatně nebude korektně fungovat ani žádný plugin):

set nocompatible

Poznámka: současné verze Vimu v případě, že naleznou soubor .vimrc či .gvimrc automaticky provedou set nocompatible.

Obrázek 6: Po zadání příkazu uu se obnoví oba dva smazané řádky, ovšem pouze v případě, že je nastavena volba nocompatible.

Jen pro zajímavost si shrňme základní rozdíly mezi textovými editory ViVim, minimálně v jejich chování na příkaz u:

Příkazy Chování editoru Vi Chování editoru Vim
uu undo+redo→nic se ve výsledku neprovede vrácení posledních dvou změn (stejné jako 2u)
u Ctrl+R překreslení terminálu undo+redo→nic se ve výsledku neprovede

Obrázek 7: Pokud je nastavena volba compatible, vede použití příkazu uu k obnovení obsahu bufferu do podoby, která již byla zobrazena na obrázku číslo 5.

3. Příkaz U

V tabulce uvedené v první kapitole je zmíněn i velmi užitečný, ale současně i poněkud záludný příkaz U. Ten umožňuje vrátit všechny změny provedené na jednom textovém řádku, což se hodí například při tvorbě programů. Musíme mít ovšem na paměti, že příkaz U je Vimem považován za běžný editační příkaz, který nespadá do kategorie „undo/redo“. V praxi to znamená to, že změny provedené příkazem U se odvolávají příkazem u a nikoli Ctrl+R. Navíc se – stále kvůli tomu, že je příkaz U chápán jako běžný editační příkaz – aktivně používaný buffer dostane do stavu „modified“, a to i ve chvíli, kdy se příkazem U obnoví původní stav bufferu. Naproti tomu příkaz u se chová odlišně: pokud se podaří vrátit všechny změny až do takového stavu, v jakém byl buffer při posledním uložení či naopak otevření, je stav „modified“ vymazán. To zjistíme snadno pohledem na pravítko, protože buffery ve stavu „modified“ obsahují vedle jména souboru znaky [+].

Obrázek 8: Původní obsah bufferu po načtení zdrojového souboru do editoru Vim.

Obrázek 9: Změna na jediném textovém řádku operací cw{}Esc (buffer je ve stavu „modifikován“).

Obrázek 10: Vrácení této změny příkazem U (buffer je stále ve stavu „modifikován“!).

Obrázek 11: Příkaz u obnoví stav bufferu před použitím příkazu U, což znamená, že příkaz U vlastně není plnohodnotným „undo“, ale jen další editační operací.

4. Bloky vytvářené pro operace undo, rozdělení a spojování bloků

Textový editor Vim si udržuje přehled o všech nedávno provedených operacích, které následně sdružuje do bloků nazývaných undo blocks. Význam těchto bloků je jednoduchý – příkaz u vrátí všechny změny zaznamenané v jednom bloku a příkaz nu vrátí změny zaznamenané v posledních n blocích (pokud tedy není nastavený režim kompatibility s Vi). V některých případech však může být vhodnější „rozbít“ blok na více částí. Předpokládejme například, že budu chtít v tomto odstavci, jehož délka mimochodem přesahuje tisíc znaků, vrátit zpět pouze změny provedené v posledních dvou větách. V případě, že by celý odstavec byl napsán v jednom kroku, tj. přechodem do režimu vkládání (insert mode), zápisem celého textu a následně přechodem zpět do normálního režimu (normal mode), bylo by použití příkazu u vlastně zbytečné, neboť tento příkaz by vrátil celý blok a vlastně tak smazal celý odstavec.

Ve skutečnosti si však můžeme lehce vypomoci klávesovou zkratkou Ctrl+G u zadanou přímo v režimu vkládání. Tato zkratka sice zdánlivě nic nedělá (minimálně se nijak neprojeví v napsaném textu), ve skutečnosti však interně zavře aktuální undo block a začne zaznamenávat příkazy do bloku nového. Dokonce existuje i opačný postup, kterým lze spojit dva po sobě jdoucí undo blocky, ten však má význam především pro tvůrce skriptů a nikoli při běžné editaci (po skriptu totiž často požadujeme, aby se celá operace provedená skriptem dala vrátit jediným příkazem u). Krátké shrnutí:

Příkaz Režim Význam
Ctrl+G u insert mode uzavření aktuálního undo bloku a vytvoření bloku nového
:undojoin command mode spojení dvou po sobě jdoucích undo bloků

Příkaz Ctrl+G u pracuje jen ve vkládacím režimu z logických důvodů – jen zde totiž existuje praktická potřeba rozdělit potenciálně komplikovaný příkaz (konkrétně isáhodlouhý_textEsc) do většího množství bloků.

5. Perzistentní operace undo

Mezi poměrně nové vlastnosti textového editoru Vim patří možnost zaznamenávat celou historii příkazů undoredo na disk do zvláštního souboru, což uživateli umožní i po zavření Vimu a novém načtení dokumentu ihned použít příkaz u a vrátit tak poslední provedené operace. Soubor s historií undo/redo je binární, tj. některé jeho části jsou prakticky nečitelné bez znalosti jeho vnitřní struktury (ovšem při jeho otevření najdeme i bloky čitelného textu). Binární formát však v tomto případě vůbec není na škodu, protože tyto soubory – podobně jako (taktéž binární) soubory .swp – jsou určeny pouze pro zpracování Vimem a důraz je kladen na to, aby uživatel nebyl při své práci zdržován (v tomto ohledu stojí Vim na samotné technologické špičce).

Obrázek 12: Obsah binárního souboru s uloženými informacemi potřebnými pro provedení operací undo/redo. Soubor je sice binární, ovšem můžeme v něm vidět i části editovaného a modifikovaného textu.

Jak vlastně soubory držící historii příkazů undoredo použít v praxi? Je to velmi jednoduché, protože jediné, co se po uživateli vyžaduje, je nastavení konfigurační volby undofile. Jedná se o volbu typu ano/ne, tj. možné jsou jen dvě hodnoty undofilenoundofile. Pokud se například v konfiguračním souboru .vimrc použije následující řádek:

set undofile

bude to znamenat, že pro každý otevřený soubor se automaticky při jeho editaci vytvoří pomocný soubor s názvem .jméno_původního_souboru.un~, kde tilda na konci značí, že tento soubor je možné odstranit, nebude se ukládat do GIT repositáře atd. Je totiž nutné mít na paměti, že i tyto soubory mohou obsahovat citlivá data, která sice mohou být z finálního dokumentu odstraněna, ale strom undo je stále obsahuje! (ovšem i tyto soubory lze kryptovat, více viz :help encryption). To, ve kterém adresáři, se budou soubory obsahující historii undo/redo ukládat, je určeno obsahem konfigurační proměnné undodir, jejíž aktuální hodnotu lze zjistit velmi snadno:

:set undodir?

Soubor s undo stromem může vypadat například takto:

xxd -g1 .clanek.html.un~
0000000: 56 69 6d 9f 55 6e 44 6f e5 00 02 65 2f 3b e6 97  Vim.UnDo...e/;..
0000010: 59 cc 9c 7b bb 6d f3 e9 d9 49 4e 60 12 bb 39 ee  Y..{.m...IN`..9.
0000020: 65 b0 14 4f 88 26 67 2a d4 93 bd 00 00 00 02 00  e..O.xg*........
0000030: 00 00 07 3c 70 3e 3c 2f 70 3e 00 00 00 01 00 00  ...[p][/p]......
0000040: 00 02 00 00 00 01 00 00 00 08 00 00 00 00 00 00  ................
0000050: 00 08 00 00 00 08 00 00 00 08 00 00 00 00 55 33  ..............U3
0000060: f2 4d 04 01 00 00 00 05 00 5f d0 00 00 00 00 00  .M......._......
0000070: 00 00 02 00 00 00 00 00 00 00 00 00 00 00 01 00  ................
0000080: 00 00 01 00 00 00 00 00 00 00 00 ff ff ff ff 00  ................
0000090: 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

Poznámka: soubory s historií operací undo/redo mohou být poměrně velké, proto může být vhodné pro určité typy souborů (například při editaci obrovských databázových exportů) nastavit volbu :set noundofile.

6. Strom změn v dokumentu (bufferu)

Před popisem pluginů se ještě musíme seznámit s jednou novou vlastností Vimu, která opět souvisí s operacemi undoredo. V případě, že se kdykoli během práce s bufferem provede operace undo a následně se provedou další změny v bufferu (které obecně mohou být odlišné od původních změn), vytvoří Vim automaticky na pozadí novou větev v interně udržovaném stromu nazvaném příhodně undo tree. Všechny listy tohoto stromu je možné kdykoli vypsat s využitím příkazu :undolist. Listy se vypíšou do jednoduché tabulky se čtyřmi sloupci, jak je ukázáno na následujícím příkladu:

number changes  when               saved
     3       3  37 seconds ago
     5       4  32 seconds ago
     7       4  30 seconds ago
     9       4  28 seconds ago
    11       4  24 seconds ago
    13       4  21 seconds ago
    15       4  13 seconds ago
    17       4  8 seconds ago
    18       3  2 seconds ago   5

K jednotlivým změnám je možné se kdykoli vrátit, například s využitím příkazů :earlier count či :later count (popř. g+g-), ovšem mnohem jednodušší je využít některý z pluginů popsaných v navazujících kapitolách.

Obrázek 13: Seznam změn, které vznikly při vytváření tohoto článku.

7. Plugin histwin

7.1 Popis pluginu histwin

Prvním pluginem, se kterým se v dnešním článku seznámíme, je přídavný modul nazvaný histwin. Tento modul slouží zejména pro prohlížení historie úprav jednotlivých bufferů a taktéž pro manipulaci se stromem vytvářeným operacemi typu undoredo způsobem, s nímž jsme se seznámili v předchozích kapitolách. Navíc tento modul dokáže zobrazit rozdíl mezi jednotlivými verzemi bufferu, popř. je možné si jednotlivé stavy bufferu pojmenovat (přiřadit stavu nějakou značku neboli tag). Modul histwin obsahuje vlastní textové uživatelské rozhraní, v němž je zobrazeno jak jednoduché menu s příkazy, tak i jednotlivé větve stromu: tento způsob zobrazení jsme ostatně viděli již u některých dalších modulů, například u pluginu NERDTree či JavaBrowser

Obrázek 14: Nápověda k pluginu histwin.

Obrázek 15: Okno pluginu histwin otevřené pro zcela prázdný buffer bez historie operací.

7.2 Instalace pluginu histwin

Pro instalaci modulu histwin lze jednoduše použít Git, protože zdrojové kódy jsou uloženy na GitHubu, podobně jako tomu bylo u mnoha pluginů popsaných minule a taktéž předminule:

cd ~/.vim/bundle
git clone https://github.com/chrisbra/histwin.vim

Struktura adresáře ~/.vim/bundle může vypadat následovně:

.
├── calendar
│   ├── autoload
│   ├── doc
│   └── plugin
├── ctrlp.vim
│   ├── autoload
│   │   └── ctrlp
│   ├── doc
│   └── plugin
├── histwin.vim
│   ├── autoload
│   ├── doc
│   └── plugin
├── SearchComplete
│   └── plugin
├── snipmate.vim
│   ├── after
│   │   └── plugin
│   ├── autoload
│   ├── doc
│   ├── ftplugin
│   ├── plugin
│   ├── snippets
│   └── syntax
├── vim-fireplace
│   ├── autoload
│   │   └── fireplace
│   ├── doc
│   ├── plugin
│   │   └── fireplace
│   └── python
├── vim-fugitive
│   ├── doc
│   └── plugin
└── vim-surround
    ├── doc
    └── plugin

Obrázek 16: Takto vypadá okno pluginu histwin ve chvíli, kdy se již k bufferu zaznamenalo několik operací.

Obrázek 17: Zobrazení rozdílu mezi dvěma uzly stromu formou diffu.

7.3 Použití pluginu histwin

Základním příkazem pro vyvolání pluginu histwin je :UB, což je zkratka znamenající „Undo Browse“ (samozřejmě je možné si tento příkaz namapovat na vybranou klávesovou zkratku, například na klávesu F12). Po zadání tohoto příkazu se zobrazí nové okno, v němž je zobrazena krátká nápověda a taktéž historie provedených operací, včetně případných větvení v undo stromu. V historii se u každé operace mohou zobrazit i příznaky ! (větev není dostupná) či * (větev byla uložena) a navíc i případné pojmenování této větve. Plugin histwin totiž umožňuje ke každé větvi přiřadit takzvaný tag příkazem T, což je ostatně patrné i z přiložených screenshotů. Kromě toho lze zobrazit i rozdíl (diff) mezi vybranými větvemi.

Obrázek 18: V levém dolním rohu je ukázáno, jak lze jednotlivým uzlům přiřadit tagy.

Obrázek 19: Okno modulu histwin ve chvíli, kdy je vypnuta nápověda.

8. Plugin undotree

8.1 Popis pluginu undotree

Druhým pluginem, se kterým se v dnešním článku seznámíme, je přídavný modul pojmenovaný příznačně undotree. Tento plugin slouží, podobně jako plugin předchozí, především pro grafické znázornění obsahu stromu vytvářeného při editaci i při provádění operací undoredo způsobem, o němž jsme se zmínili zejména v šesté kapitole. Se znázorněným stromem, jehož pseudografika částečně připomíná způsob zobrazení větvení v GITu, je možné různým způsobem manipulovat, především zobrazit, jaké editační operace se již provedly a do kterého stavu dokumentu se má editor přenést. Modul taktéž zobrazí rozdíl (diff) mezi dvěma větvemi.

Obrázek 20: Nápověda k pluginu undotree.

8.2 Instalace pluginu undotree

Instalace tohoto modulu je stejně snadná jako instalace modulu předchozího, protože lze opět provést naklonování pluginu z jeho repositáře umístěného na populárním GitHubu:

cd ~/.vim/bundle
git clone https://github.com/mbbill/undotree
Cloning into 'undotree'...
remote: Counting objects: 434, done.
remote: Total 434 (delta 0), reused 0 (delta 0), pack-reused 434
Receiving objects: 100% (434/434), 110.64 KiB | 0 bytes/s, done.
Resolving deltas: 100% (117/117), done.
Checking connectivity... done.

Pro jistotu se podívejme, jak bude vypadat struktura adresáře cd ~/.vim/bundle:

.
├── calendar
│   ├── autoload
│   ├── doc
│   └── plugin
├── ctrlp.vim
│   ├── autoload
│   │   └── ctrlp
│   ├── doc
│   └── plugin
├── histwin.vim
│   ├── autoload
│   ├── doc
│   └── plugin
├── SearchComplete
│   └── plugin
├── snipmate.vim
│   ├── after
│   │   └── plugin
│   ├── autoload
│   ├── doc
│   ├── ftplugin
│   ├── plugin
│   ├── snippets
│   └── syntax
├── undotree
│   ├── doc
│   ├── plugin
│   └── syntax
├── vim-fireplace
│   ├── autoload
│   │   └── fireplace
│   ├── doc
│   ├── plugin
│   │   └── fireplace
│   └── python
├── vim-fugitive
│   ├── doc
│   └── plugin
└── vim-surround
    ├── doc
    └── plugin

Obrázek 21: Po delší editaci dokumentu je již historie změn poměrně dlouhá. Povšimněte si i větvení.

8.3 Použití pluginu undotree

Podobně jako výše popsaný modul histwin i modul undotree používá vlastní okno se zobrazenou nápovědou, seznamem změn, stromem změn atd. Toto okno se vyvolává příkazem :UndotreeToggle, ovšem díky možnosti automatického doplnění názvů příkazů klávesou Tab samozřejmě není zapotřebí zapisovat celý název tohoto příkazu. Samotné okno pluginu undotree může mít více podob: jsou podporovány celkem čtyři styly řízené globální proměnnou g:undotree_WindowLayout. Některé možnosti pluginu tohoto pluginu naznačují screenshoty.

Obrázek 22: I modul undotree obsahuje možnost zobrazení nápovědy.

9. Plugin Gundo

9.1 Popis pluginu Gundo

Třetím a současně i posledním modulem, jehož popisem se budeme v dnešním článku zabývat, je plugin nazvaný Gundo. Tento modul je mezi komunitou uživatelů textového editoru Vim velmi populární (řadí se dokonce mezi top ten vimovských pluginů), a to nikoli snad kvůli množství podporovaných funkcí, ale zejména díky jeho přehlednosti a v neposlední řadě i snadnému ovládání, což je patrné i při pohledu na screenshoty zobrazené na obrázcích číslo 23 až 25. Tento plugin opět dokáže ve vlastním podokně zobrazit strom změn a navíc se při pohybu kurzoru po jednotlivých uzlech tohoto stromu v dolním podokně automaticky zobrazuje změna mezi aktuálním stavem bufferu a stavem, který je reprezentován vybraným stromem. Tyto operace jsou velmi rychlé a především přehledné.

Obrázek 23: Nápověda k pluginu Gundo.

9.2 Instalace pluginu Gundo

Instalaci modulu Gundo nemusíme zdlouhavě popisovat, neboť se opět můžeme spolehnout na GIT a repositář pluginu umístněný na GitHubu:

cd ~/.vim/bundle
git clone https://github.com/sjl/gundo.vim
Cloning into 'gundo.vim'...
remote: Counting objects: 834, done.
remote: Total 834 (delta 0), reused 0 (delta 0), pack-reused 834
Receiving objects: 100% (834/834), 278.07 KiB | 0 bytes/s, done.
Resolving deltas: 100% (342/342), done.
Checking connectivity... done.
.
├── calendar
│   ├── autoload
│   ├── doc
│   └── plugin
├── ctrlp.vim
│   ├── autoload
│   │   └── ctrlp
│   ├── doc
│   └── plugin
├── gundo.vim
│   ├── autoload
│   ├── doc
│   ├── plugin
│   ├── site
│   └── tests
│       ├── bundled
│       │   ├── lh-vim-lib
│       │   │   ├── autoload
│       │   │   │   └── lh
│       │   │   │       ├── buffer
│       │   │   │       └── graph
│       │   │   ├── doc
│       │   │   ├── macros
│       │   │   ├── mkVba
│       │   │   ├── plugin
│       │   │   └── tests
│       │   │       └── lh
│       │   └── ut
│       │       ├── autoload
│       │       │   ├── lh
│       │       │   └── should
│       │       ├── doc
│       │       ├── ftplugin
│       │       │   └── vim
│       │       ├── mkVba
│       │       ├── plugin
│       │       └── tests
│       │           └── lh
│       └── vim_test
│           ├── autoload
│           │   └── lh -> ../../bundled/lh-vim-lib/autoload/lh
│           ├── colors
│           ├── ftplugin
│           │   └── vim -> ../../bundled/ut/ftplugin/vim
│           ├── macros
│           └── plugin
├── SearchComplete
│   └── plugin
├── snipmate.vim
│   ├── after
│   │   └── plugin
│   ├── autoload
│   ├── doc
│   ├── ftplugin
│   ├── plugin
│   ├── snippets
│   └── syntax
├── vim-fireplace
│   ├── autoload
│   │   └── fireplace
│   ├── doc
│   ├── plugin
│   │   └── fireplace
│   └── python
├── vim-fugitive
│   ├── doc
│   └── plugin
└── vim-surround
    ├── doc
    └── plugin

Obrázek 24: Strom změn provedených v dokumentu je podle mého názoru v modulu Gundo zobrazen nejpřehlednějším způsobem.

widgety

9.3 Použití pluginu Gundo

Základním příkazem přídavného modulu Gundo je příkaz :GundoToggle, který zobrazí popř. naopak skryje dvojici podoken. V horním podokně je zobrazen strom změn (aktuální uzel je označen zavináčem), v podokně dolním pak rozdíl (diff) mezi vybraným uzlem stromu změn a aktuálním stavem bufferu popř. diff znázorňující pouze změny zaznamenané v daném uzlu, tj. přesně ty změny, které mohou být vrácené příkazem u. Uzly stromu se vybírají pohybem kurzoru, kde kromě kláves jk je možné použít i další příkazy, například G či gg.

Obrázek 25: Při přechodu na jakoukoli větev se v dolním podokně zobrazí změna (diff) zaznamenaná v uzlu stromu změn.

10. Odkazy na předchozí části článku

  1. Užitečné skripty a pluginy pro textový editor Vim
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim/
  2. Užitečné skripty a pluginy pro textový editor Vim (2.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-2-cast/
  3. Užitečné skripty a pluginy pro textový editor Vim (3.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-3-cast/
  4. Užitečné skripty a pluginy pro textový editor Vim (4.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-4-cast/
  5. Užitečné skripty a pluginy pro textový editor Vim (5.část)
    http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-5-cast/

11. Odkazy na Internetu

  1. vi Editor Commands
    http://www.cs.rit.edu/~cslab/vi­.html#A1.4
  2. vi Manual
    http://www.cs.fsu.edu/gene­ral/vimanual.html
  3. Mastering the Vi Editor
    http://www.susnet.uk/mastering-the-vi-editor
  4. Using undo branches
    http://vim.wikia.com/wiki/U­sing_undo_branches
  5. Gundo
    http://sjl.bitbucket.org/gundo.vim/
  6. Vim as a Python IDE, or Python IDE as Vim
    http://blog.jetbrains.com/pychar­m/2013/06/vim-as-a-python-ide-or-python-ide-as-vim/
  7. histwin na GitHubu
    https://github.com/chrisbra/his­twin.vim
  8. histwin.vim : Browse the undo tree
    http://www.vim.org/scripts/scrip­t.php?script_id=2932
  9. undotree.vim : Display your undo history in a graph
    http://www.vim.org/scripts/scrip­t.php?script_id=4177
  10. Surround
    http://www.bestofvim.com/plu­gin/surround/
  11. SnipMate
    http://www.bestofvim.com/plu­gin/snipmate/
  12. Getting a Clojure REPL in Vim With VimClojure, Nailgun, and Leiningen
    http://naleid.com/blog/2011/12/19/get­ting-a-clojure-repl-in-vim-with-vimclojure-nailgun-and-leiningen/
  13. The NERD Commenter : A plugin that allows for easy commenting of code for many filetypes.
    http://www.vim.org/scripts/scrip­t.php?script_id=1218
  14. NERD Commenter na GitHubu
    https://github.com/scroolo­ose/nerdcommenter
  15. luarefvim : Lua reference manual
    http://www.vim.org/scripts/scrip­t.php?script_id=1291
  16. lua.vim : Lua file type plug-in for the Vim text editor
    http://www.vim.org/scripts/scrip­t.php?script_id=3625
  17. vim-lua-ftplugin
    https://github.com/xolox/vim-lua-ftplugin
  18. Vi Improved
    https://wiki.python.org/moin/Vim
  19. javacomplete : Omni Completion for JAVA
    http://www.vim.org/scripts/scrip­t.php?script_id=1785
  20. SearchComplete
    http://www.vim.org/scripts/scrip­t.php?script_id=474
  21. ShowMarks
    http://www.vim.org/scripts/scrip­t.php?script_id=152
  22. ctrlp.vim
    https://github.com/kien/ctrlp.vim
  23. ctrlp.vim
    http://kien.github.io/ctrlp.vim/
  24. vim-signature
    https://github.com/kshenoy/vim-signature
  25. Supertab
    http://www.vim.org/scripts/scrip­t.php?script_id=1643
  26. Supertab (GitHub)
    https://github.com/ervandew/supertab
  27. Vim Essential Plugin: NERD Tree
    http://code.tutsplus.com/tutorials/vim-essential-plugin-nerdtree–net-19692
  28. The NERD tree : A tree explorer plugin for navigating the filesystem
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=1658
  29. NERD Tree Guide
    http://usevim.com/2012/07/18/ner­dtree/
  30. vcscommand.vim : CVS/SVN/SVK/git/hg/bzr integration plugin
    http://www.vim.org/scripts/scrip­t.php?script_id=90
  31. vcscommand na GitHubu
    https://github.com/vim-scripts/vcscommand.vim
  32. Popis skriptu Vim Pathogen
    http://www.vim.org/scripts/scrip­t.php?script_id=2332
  33. Poslední verze skriptu Vim Pathogen
    https://tpo.pe/pathogen.vim
  34. Nejlepší pluginy pro Vim
    http://vimawesome.com/
  35. Nejlepší pluginy pro Vim
    http://www.vim.org/scripts/scrip­t_search_results.php?order_by=ra­ting
  36. Vim-airline na GitHubu
    https://github.com/bling/vim-airline
  37. Vim-airline na www.vim.org
    http://www.vim.org/scripts/dow­nload_script.php?src_id=22726
  38. Vim-fugitive na GitHubu
    https://github.com/tpope/vim-fugitive
  39. Vim-fugitive na www.vim.org
    http://www.vim.org/scripts/scrip­t.php?script_id=2975
  40. Textový editor Vim jako IDE (seriál)
    http://www.root.cz/clanky/textovy-editor-vim-jako-ide/
  41. Building Vim
    http://vim.wikia.com/wiki/Bu­ilding_Vim
  42. Getting the Vim source with Mercurial
    http://vim.wikia.com/wiki/Get­ting_the_Vim_source_with_Mer­curial
  43. Vim Perl Interface
    http://vim.dindinx.net/vim7/html/if_per­l.txt.php
  44. Vim Perl Support
    http://www.softpanorama.or­g/Editors/Vimorama/vim_per­l_support.shtml
  45. VIM as Python IDE
    http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/
  46. Stack Overflow: VIM: Perl interface: passing a variable to Perl and reading a vim variable from Perl
    http://stackoverflow.com/qu­estions/4999902/vim-perl-interface-passing-a-variable-to-perl-and-reading-a-vim-variable-from
  47. Stack Overflow: Getting started with vim scripting with Perl
    http://stackoverflow.com/qu­estions/2208618/getting-started-with-vim-scripting-with-perl
  48. Python with a modular IDE (Vim)
    http://www.sontek.net/python-with-a-modular-ide-vim
  49. Getting to VIM's Python interface
    http://zerokspot.com/weblog/2009/02/21/get­ting-to-know-vims-python-interface/
  50. Pretty-formatting XML
    http://vim.wikia.com/wiki/Pretty-formatting_XML
  51. Delete a pair of XML/HTML tags
    http://vim.wikia.com/wiki/De­lete_a_pair_of_XML/HTML_tags
  52. Vim as XML Editor
    http://www.pinkjuice.com/how­to/vimxml/
  53. xmledit: A filetype plugin to help edit XML, HTML, and SGML documents
    http://www.vim.org/scripts/scrip­t.php?script_id=301
  54. Poslední vývojová verze makra xmledit
    http://github.com/sukima/xmledit/
  55. vim.wikia: Display date-and-time on status line
    http://vim.wikia.com/wiki/Display_date-and-time_on_status_line
  56. vim.wikia: Writing a valid statusline
    http://vim.wikia.com/wiki/Wri­ting_a_valid_statusline
  57. vim.wikia: Statusline tab level ruler
    http://vim.wikia.com/wiki/Sta­tusline_tab_level_ruler
  58. vim.wikia: Switching between different statuslines
    http://vim.wikia.com/wiki/Swit­ching_between_different_sta­tuslines
  59. X Selections, Cut Buffers, and Kill Rings
    http://www.jwz.org/doc/x-cut-and-paste.html
  60. Accessing the system clipboard
    http://vim.wikia.com/wiki/Ac­cessing_the_system_clipbo­ard
  61. xcutsel(1) – Linux man page
    http://linux.die.net/man/1/xcutsel
  62. snipMate : TextMate-style snippets for Vim
    http://www.vim.org/scripts/scrip­t.php?script_id=2540
  63. msanders / snipmate.vim
    https://github.com/msander­s/snipmate.vim
  64. snipMate.vim Introductory Screencast
    http://vimeo.com/3535418
  65. Clewn home page
    http://clewn.sourceforge.net/
  66. How to connect vim with gdb – using clewn
    http://chunhao.net/blog/how-to-connect-vim-with-gdb-using-clewn
  67. yavdb : Yet Another (Generic) Vim Debugger Integration
    http://www.vim.org/scripts/scrip­t.php?script_id=1954
  68. Vim home page
    http://www.vim.org/
  69. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  70. Tutorial: Make Vim as Your C/C++ IDE Using c.vim Plugin
    http://www.thegeekstuff.com/2009/01/tu­torial-make-vim-as-your-cc-ide-using-cvim-plugin/
  71. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  72. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  73. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  74. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  75. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  76. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  77. JavaBrowser : Shows java file class, package in a tree as in IDEs. Java source browser.
    http://www.vim.org/scripts/scrip­t.php?script_id=588
  78. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318
  79. Vim plugins for developers
    http://www.linuxtoday.com/upload/vim-plugins-for-developers-140619094010.html
Našli jste v článku chybu?
DigiZone.cz: Rapl: seriál, který vás smíří s ČT

Rapl: seriál, který vás smíří s ČT

Vitalia.cz: Inspekce našla nelegální sklad v SAPĚ. Zase

Inspekce našla nelegální sklad v SAPĚ. Zase

DigiZone.cz: Test LG 55UH750V aneb Cena/výkon

Test LG 55UH750V aneb Cena/výkon

Lupa.cz: Další Češi si nechali vložit do těla čip

Další Češi si nechali vložit do těla čip

Vitalia.cz: Voda z Vltavy před a po úpravě na pitnou

Voda z Vltavy před a po úpravě na pitnou

Podnikatel.cz: Takhle se prodávají mražené potraviny

Takhle se prodávají mražené potraviny

Podnikatel.cz: EET pro e-shopy? Postavené na hlavu

EET pro e-shopy? Postavené na hlavu

DigiZone.cz: Numan Two: rozhlasový přijímač s CD

Numan Two: rozhlasový přijímač s CD

Vitalia.cz: Když všichni seli řepku, on vsadil na dýně

Když všichni seli řepku, on vsadil na dýně

Podnikatel.cz: Instalatér, malíř a elektrikář. "Vymřou"?

Instalatér, malíř a elektrikář. "Vymřou"?

DigiZone.cz: Světový pohár v přímém přenosu na ČT

Světový pohár v přímém přenosu na ČT

Lupa.cz: Patička e-mailu závazná jako vlastnoruční podpis?

Patička e-mailu závazná jako vlastnoruční podpis?

Vitalia.cz: dTest odhalil ten nejlepší kečup

dTest odhalil ten nejlepší kečup

Vitalia.cz: Jsou vegani a vyrábějí nemléko

Jsou vegani a vyrábějí nemléko

Lupa.cz: Aukro.cz mění majitele. Vrací se do českých rukou

Aukro.cz mění majitele. Vrací se do českých rukou

Podnikatel.cz: Babišovi se nedá věřit, stěžovali si hospodští

Babišovi se nedá věřit, stěžovali si hospodští

Podnikatel.cz: Dva měsíce na EET. Budou stačit?

Dva měsíce na EET. Budou stačit?

Vitalia.cz: Kterou dýni můžete jíst za syrova?

Kterou dýni můžete jíst za syrova?

120na80.cz: Hrbatá prsa aneb mýty o implantátech

Hrbatá prsa aneb mýty o implantátech

Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje