Obsah
1. Užitečné skripty a pluginy pro textový editor Vim (6.část – cestování v čase)
2. Chování příkazů undo a redo ve Vimu
4. Bloky vytvářené pro operace undo, rozdělení a spojování bloků
6. Strom změn v dokumentu (bufferu)
8.2 Instalace pluginu undotree
10. Odkazy na předchozí části článku
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 undo a redo, 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 undo a redo. 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ů undo a redo 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 Vi a Vim, 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ů undo a redo 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ů undo a redo 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 undofile a noundofile. 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 undo a redo. 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+ a 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 undo a redo 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í undo a redo 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.
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 j a k 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
- Užitečné skripty a pluginy pro textový editor Vim
http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim/ - 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/ - 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/ - 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/ - 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
- vi Editor Commands
http://www.cs.rit.edu/~cslab/vi.html#A1.4 - vi Manual
http://www.cs.fsu.edu/general/vimanual.html - Mastering the Vi Editor
http://www.susnet.uk/mastering-the-vi-editor - Using undo branches
http://vim.wikia.com/wiki/Using_undo_branches - Gundo
http://sjl.bitbucket.org/gundo.vim/ - Vim as a Python IDE, or Python IDE as Vim
http://blog.jetbrains.com/pycharm/2013/06/vim-as-a-python-ide-or-python-ide-as-vim/ - histwin na GitHubu
https://github.com/chrisbra/histwin.vim - histwin.vim : Browse the undo tree
http://www.vim.org/scripts/script.php?script_id=2932 - undotree.vim : Display your undo history in a graph
http://www.vim.org/scripts/script.php?script_id=4177 - Surround
http://www.bestofvim.com/plugin/surround/ - SnipMate
http://www.bestofvim.com/plugin/snipmate/ - Getting a Clojure REPL in Vim With VimClojure, Nailgun, and Leiningen
http://naleid.com/blog/2011/12/19/getting-a-clojure-repl-in-vim-with-vimclojure-nailgun-and-leiningen/ - The NERD Commenter : A plugin that allows for easy commenting of code for many filetypes.
http://www.vim.org/scripts/script.php?script_id=1218 - NERD Commenter na GitHubu
https://github.com/scrooloose/nerdcommenter - luarefvim : Lua reference manual
http://www.vim.org/scripts/script.php?script_id=1291 - lua.vim : Lua file type plug-in for the Vim text editor
http://www.vim.org/scripts/script.php?script_id=3625 - vim-lua-ftplugin
https://github.com/xolox/vim-lua-ftplugin - Vi Improved
https://wiki.python.org/moin/Vim - javacomplete : Omni Completion for JAVA
http://www.vim.org/scripts/script.php?script_id=1785 - SearchComplete
http://www.vim.org/scripts/script.php?script_id=474 - ShowMarks
http://www.vim.org/scripts/script.php?script_id=152 - ctrlp.vim
https://github.com/kien/ctrlp.vim - ctrlp.vim
http://kien.github.io/ctrlp.vim/ - vim-signature
https://github.com/kshenoy/vim-signature - Supertab
http://www.vim.org/scripts/script.php?script_id=1643 - Supertab (GitHub)
https://github.com/ervandew/supertab - Vim Essential Plugin: NERD Tree
http://code.tutsplus.com/tutorials/vim-essential-plugin-nerdtree–net-19692 - The NERD tree : A tree explorer plugin for navigating the filesystem
http://vim.sourceforge.net/scripts/script.php?script_id=1658 - NERD Tree Guide
http://usevim.com/2012/07/18/nerdtree/ - vcscommand.vim : CVS/SVN/SVK/git/hg/bzr integration plugin
http://www.vim.org/scripts/script.php?script_id=90 - vcscommand na GitHubu
https://github.com/vim-scripts/vcscommand.vim - Popis skriptu Vim Pathogen
http://www.vim.org/scripts/script.php?script_id=2332 - Poslední verze skriptu Vim Pathogen
https://tpo.pe/pathogen.vim - Nejlepší pluginy pro Vim
http://vimawesome.com/ - Nejlepší pluginy pro Vim
http://www.vim.org/scripts/script_search_results.php?order_by=rating - Vim-airline na GitHubu
https://github.com/bling/vim-airline - Vim-airline na www.vim.org
http://www.vim.org/scripts/download_script.php?src_id=22726 - Vim-fugitive na GitHubu
https://github.com/tpope/vim-fugitive - Vim-fugitive na www.vim.org
http://www.vim.org/scripts/script.php?script_id=2975 - Textový editor Vim jako IDE (seriál)
http://www.root.cz/clanky/textovy-editor-vim-jako-ide/ - Building Vim
http://vim.wikia.com/wiki/Building_Vim - Getting the Vim source with Mercurial
http://vim.wikia.com/wiki/Getting_the_Vim_source_with_Mercurial - Vim Perl Interface
http://vim.dindinx.net/vim7/html/if_perl.txt.php - Vim Perl Support
http://www.softpanorama.org/Editors/Vimorama/vim_perl_support.shtml - VIM as Python IDE
http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/ - Stack Overflow: VIM: Perl interface: passing a variable to Perl and reading a vim variable from Perl
http://stackoverflow.com/questions/4999902/vim-perl-interface-passing-a-variable-to-perl-and-reading-a-vim-variable-from - Stack Overflow: Getting started with vim scripting with Perl
http://stackoverflow.com/questions/2208618/getting-started-with-vim-scripting-with-perl - Python with a modular IDE (Vim)
http://www.sontek.net/python-with-a-modular-ide-vim - Getting to VIM's Python interface
http://zerokspot.com/weblog/2009/02/21/getting-to-know-vims-python-interface/ - Pretty-formatting XML
http://vim.wikia.com/wiki/Pretty-formatting_XML - Delete a pair of XML/HTML tags
http://vim.wikia.com/wiki/Delete_a_pair_of_XML/HTML_tags - Vim as XML Editor
http://www.pinkjuice.com/howto/vimxml/ - xmledit: A filetype plugin to help edit XML, HTML, and SGML documents
http://www.vim.org/scripts/script.php?script_id=301 - Poslední vývojová verze makra xmledit
http://github.com/sukima/xmledit/ - vim.wikia: Display date-and-time on status line
http://vim.wikia.com/wiki/Display_date-and-time_on_status_line - vim.wikia: Writing a valid statusline
http://vim.wikia.com/wiki/Writing_a_valid_statusline - vim.wikia: Statusline tab level ruler
http://vim.wikia.com/wiki/Statusline_tab_level_ruler - vim.wikia: Switching between different statuslines
http://vim.wikia.com/wiki/Switching_between_different_statuslines - X Selections, Cut Buffers, and Kill Rings
http://www.jwz.org/doc/x-cut-and-paste.html - Accessing the system clipboard
http://vim.wikia.com/wiki/Accessing_the_system_clipboard - xcutsel(1) – Linux man page
http://linux.die.net/man/1/xcutsel - snipMate : TextMate-style snippets for Vim
http://www.vim.org/scripts/script.php?script_id=2540 - msanders / snipmate.vim
https://github.com/msanders/snipmate.vim - snipMate.vim Introductory Screencast
http://vimeo.com/3535418 - Clewn home page
http://clewn.sourceforge.net/ - How to connect vim with gdb – using clewn
http://chunhao.net/blog/how-to-connect-vim-with-gdb-using-clewn - yavdb : Yet Another (Generic) Vim Debugger Integration
http://www.vim.org/scripts/script.php?script_id=1954 - Vim home page
http://www.vim.org/ - vim (man page)
http://www.linux-tutorial.info/modules.php?name=ManPage&sec=1&manpage=vim - Tutorial: Make Vim as Your C/C++ IDE Using c.vim Plugin
http://www.thegeekstuff.com/2009/01/tutorial-make-vim-as-your-cc-ide-using-cvim-plugin/ - c.vim : C/C++ IDE
http://vim.sourceforge.net/scripts/script.php?script_id=213 - c.vim : C/C++ IDE key mappings
http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf - Základní základy editoru Vim
http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/ - Jak si přizpůsobit Vim
http://www.root.cz/serialy/jak-si-prizpusobit-vim/ - Taglist (plugin)
http://www.vim.org/scripts/script.php?script_id=273 - The NERD tree: A tree explorer plugin for navigating the filesystem
http://www.vim.org/scripts/script.php?script_id=1658 - JavaBrowser : Shows java file class, package in a tree as in IDEs. Java source browser.
http://www.vim.org/scripts/script.php?script_id=588 - snippetsEmu : An attempt to emulate TextMate's snippet expansion
http://www.vim.org/scripts/script.php?script_id=1318 - Vim plugins for developers
http://www.linuxtoday.com/upload/vim-plugins-for-developers-140619094010.html