Obsah
1. Tvorba vlastního pluginu pro textový editor Vim
2. První verze pluginu pro promítání slajdů
3. Odstranění globálních proměnných
4. Odstranění globálních funkcí
5. Unikátní jména funkcí pro mapování příkazů na klávesy
6. Adresářová struktura pluginu kompatibilního s modulem Pathogen
7. Soubor README.md a soubor obsahující nápovědu
9. Repositář s demonstračním pluginem
10. Odkazy na předchozí části článku
1. Tvorba vlastního pluginu pro textový editor Vim
Používání pluginů ve Vimu je při použití nástrojů typu Pathogen či Vundle z hlediska uživatele velmi jednoduché, protože samotná instalace přídavného modulu se v naprosté většině případů omezuje na naklonování repositáře s pluginem, popř. na rozbalení archivu, v němž je tento přídavný modul distribuován. V porovnání s dříve používanými metodami distribuce a instalace pluginů se tedy jedná o krok vpřed, na druhou stranu je však nutné, aby tvůrci pluginů dodržovali několik pravidel zajišťujících například to, že si pluginy nebudou navzájem přepisovat funkce, klávesové zkratky či proměnné. V dnešním článku si ukážeme způsob tvorby velmi jednoduchého pluginu, který byl již několikrát úspěšně použit pro promítání slajdů přímo z Vimu. To s sebou přináší – minimálně pro skalního vimaře – poměrně velké množství výhod, například možnost zobrazení zdrojových souborů se zvýrazněním syntaxe, možnost výběru velikosti znaků v závislosti na kvalitě projektoru, mnohem rychlejší tvorbu slajdů, úplný WYSIWYG :-) apod.
Obrázek 1: Promítání slajdů v praxi.
Obrázek 2: Promítání slajdů v praxi.
2. První verze pluginu pro promítání slajdů
Podívejme se nejdříve na první verzi skriptu určeného pro prohlížení slajdů. Jeho funkce je poměrně jednoduchá. Nejdříve se s využitím externích příkazů ls a grep získá seznam všech souborů umístěných v aktuálním adresáři (do něj se lze přepnout příkazem :cd), tento seznam se setřídí, inicializuje se počitadlo slajdů a nastaví se mapování některých kláves (PageUp, PageDown, Home a End) na funkce sloužící k přepínání slajdů, tj. k načtení příslušného souboru příkazem execute „edit“ jméno_souboru s případným nastavením Vimu takovým způsobem, aby správně obarvil jednotlivé syntaktické kategorie. Navíc se ještě zaregistruje funkce zavolaná ve chvíli, kdy se má překreslit stavová řádka (status line), což je důležité, neboť zde potřebujeme zobrazit stav počitadla slajdů i celkový počet slajdů. Mapování klávesových zkratek je nastaveno následujícím způsobem:
Klávesa | Význam |
---|---|
PageUp | přechod na předchozí slajd |
PageDown | přechod na následující slajd |
Home | přechod na první slajd |
End | přechod na poslední slajd |
První – a hned v několika ohledech špatně implementovaná – verze prohlížeče slajdů vypadá takto:
" Slideshow tool v1.0 " Pavel Tisnovsky 2012, 2013, 2014, 2015 " Ziskani seznamu vsech souboru v aktualnim adresari function! GetFileList() return split(system("ls -1 | sort")) endfunction " Prechod na prvni slajd function! GotoFirstSlide() let g:index = 0 endfunction " Prechod na posledni slajd function! GotoLastSlide() let g:index = len(g:slides) - 1 endfunction " Zjisteni, zda uzivatel nepresel pred prvni slajd function! BeforeFirstSlide() return g:index < 0 endfunction " Zjisteni, zda uzivatel nepresel za posledni slajd function! AfterLastSlide() return g:index >= len(g:slides) endfunction " Zobrazeni predchoziho slajdu function! ShowNextSlide() let g:index += 1 if AfterLastSlide() call GotoFirstSlide() endif call ShowActualSlide() endfunction " Zobrazeni nasledujiciho slajdu function! ShowPrevSlide() let g:index -= 1 if BeforeFirstSlide() call GotoLastSlide() endif call ShowActualSlide() endfunction " Zobrazeni prvniho slajdu function! ShowFirstSlide() call GotoFirstSlide() call ShowActualSlide() endfunction " Zobrazeni posledniho slajdu function! ShowLastSlide() call GotoLastSlide() call ShowActualSlide() endfunction " Funkce zajistujici nacteni slajdu function! ShowActualSlide() execute "edit" g:slides[g:index] endfunction " Uprava stavove radky - bude se zobrazovat cislo " slajdu, pocet slajdu a jmeno souboru obsahujiciho slajd function! StatusLine() return "Slide " . (1+g:index) . "/" . len(g:slides) . " : " . g:slides[g:index] endfunction " Nastaveni zpusobu ovladani prohlizecky function! SetupKeys() map <PageUp> :call ShowPrevSlide()<cr> map <PageDown> :call ShowNextSlide()<cr> map <Home> :call ShowFirstSlide()<cr> map <End> :call ShowLastSlide()<cr> endfunction function! WeakPoint() " Promenna obsahujici seznam slajdu let g:slides = GetFileList() " Index aktualniho slajdu let g:index = 0 " Kontrola if g:slides == [] echo "Zadne soubory v pracovnim adresari" else " Registrace funkce pouzite pro zjisteni obsahu stavove radky set statusline=%!StatusLine() " Nastaveni zobrazeni stavove radky i v pripade, ze je pouzito " jen jedno okno set laststatus=2 call ShowFirstSlide() call SetupKeys() endif endfunction call WeakPoint()
Poslední volání call WeakPoint() samozřejmě taktéž není korektní, lepší bude deklarovat nový příkaz command WeakPoint :call s:WeakPoint().
3. Odstranění globálních proměnných
Výše uvedený skript je sice funkční, ale trpí poměrně mnoha nectnostmi, které budeme muset postupně odstranit. Mezi první nedostatek patří použití globálních proměnných, tj. proměnných, před jejichž jména je přidán prefix g:. Ve chvíli, kdy má uživatel nainstalováno větší množství pluginů, může dojít k přepisům globálních proměnných, a proto je více než vhodné se jejich použití vyhnout, minimálně ve chvíli, kdy jsou tyto proměnné použity pouze uvnitř skriptu/pluginu a nikoli například pro uložení konfiguračních voleb. Řešení tohoto problému je ve skutečnosti velmi jednoduché, protože můžeme použít proměnné lokální v rámci modulu, v němž je skript napsán. V tomto případě se před jméno proměnné přidá prefix s:, kde „s“ znamená „script variable“. Taková proměnná je sdílena mezi všemi funkcemi v jednom skriptu (což potřebujeme), ale již není viditelná z dalších skriptů ani modulů. Takto by mohla vypadat upravená verze našeho prohlížeče slajdů:
" Slideshow tool v1.0 " Pavel Tisnovsky 2012, 2013, 2014, 2015 " Ziskani seznamu vsech souboru v aktualnim adresari function! GetFileList() return split(system("ls -1 | sort")) endfunction " Prechod na prvni slajd function! GotoFirstSlide() let s:index = 0 endfunction " Prechod na posledni slajd function! GotoLastSlide() let s:index = len(s:slides) - 1 endfunction " Zjisteni, zda uzivatel nepresel pred prvni slajd function! BeforeFirstSlide() return s:index < 0 endfunction " Zjisteni, zda uzivatel nepresel za posledni slajd function! AfterLastSlide() return s:index >= len(s:slides) endfunction " Zobrazeni predchoziho slajdu function! ShowNextSlide() let s:index += 1 if AfterLastSlide() call GotoFirstSlide() endif call ShowActualSlide() endfunction " Zobrazeni nasledujiciho slajdu function! ShowPrevSlide() let s:index -= 1 if BeforeFirstSlide() call GotoLastSlide() endif call ShowActualSlide() endfunction " Zobrazeni prvniho slajdu function! ShowFirstSlide() call GotoFirstSlide() call ShowActualSlide() endfunction " Zobrazeni posledniho slajdu function! ShowLastSlide() call GotoLastSlide() call ShowActualSlide() endfunction " Funkce zajistujici nacteni slajdu function! ShowActualSlide() execute "edit" s:slides[s:index] endfunction " Uprava stavove radky - bude se zobrazovat cislo " slajdu, pocet slajdu a jmeno souboru obsahujiciho slajd function! StatusLine() return "Slide " . (1+s:index) . "/" . len(s:slides) . " : " . s:slides[s:index] endfunction " Nastaveni zpusobu ovladani prohlizecky function! SetupKeys() map <PageUp> :call ShowPrevSlide()<cr> map <PageDown> :call ShowNextSlide()<cr> map <Home> :call ShowFirstSlide()<cr> map <End> :call ShowLastSlide()<cr> endfunction function! WeakPoint() " Promenna obsahujici seznam slajdu let s:slides = GetFileList() " Index aktualniho slajdu let s:index = 0 " Kontrola if s:slides == [] echo "Zadne soubory v pracovnim adresari" else " Registrace funkce pouzite pro zjisteni obsahu stavove radky set statusline=%!StatusLine() " Nastaveni zobrazeni stavove radky i v pripade, ze je pouzito " jen jedno okno set laststatus=2 call ShowFirstSlide() call SetupKeys() endif endfunction call WeakPoint()
4. Odstranění globálních funkcí
Další nepříjemnou vlastností původního skriptu je použití globálních funkcí. Textový editor Vim totiž za běžných podmínek nedovoluje přepis deklarace funkce jinou funkcí stejného jména, což znamená, že následující skript skončí s chybou:
function g:x() echo "Hello world!" endfunction function g:x() echo "Hello again..." endfunction
Tuto kontrolu lze obejít velmi snadno – za klíčové slovo function se přidá vykřičník. V tomto případě Vim bez jakéhokoli upozornění přepíše již deklarovanou funkci novou deklarací:
function! g:x() echo "Hello world!" endfunction function! g:x() echo "Hello again..." endfunction
Ani toto chování nám ovšem nevyhovuje, protože náš plugin může omylem přepsat funkce deklarované a používané jiným pluginem. Proto musíme přistoupit k deklaraci lokálních funkcí:
" Ziskani seznamu vsech souboru v aktualnim adresari function! s:GetFileList() ... endfunction " Prechod na prvni slajd function! s:GotoFirstSlide() ... endfunction " Prechod na posledni slajd function! s:GotoLastSlide() ... endfunction " Zjisteni, zda uzivatel nepresel pred prvni slajd function! s:BeforeFirstSlide() ... endfunction " Zjisteni, zda uzivatel nepresel za posledni slajd function! s:AfterLastSlide() ... endfunction " Zobrazeni predchoziho slajdu function! s:ShowNextSlide() ... endfunction " Zobrazeni nasledujiciho slajdu function! s:ShowPrevSlide() ... endfunction " Zobrazeni prvniho slajdu function! s:ShowFirstSlide() ... endfunction " Zobrazeni posledniho slajdu function! s:ShowLastSlide() ... endfunction " Funkce zajistujici nacteni slajdu function! s:ShowActualSlide() ... endfunction " Nastaveni zpusobu ovladani prohlizecky function! s:SetupKeys() ... endfunction function! s:WeakPoint() ... endfunction command WeakPoint :call s:WeakPoint()
5. Unikátní jména funkcí pro mapování příkazů na klávesy
U lokálních funkcí však nastává problém – jak lze tyto funkce namapovat na klávesové zkratky? Konkrétně se jedná o následující řádky skriptu:
noremap <PageUp> :call s:ShowPrevSlide()<cr> noremap <PageDown> :call s:ShowNextSlide()<cr> noremap <Home> :call s:ShowFirstSlide()<cr> noremap <End> :call s:ShowLastSlide()<cr>
Tyto čtyři příkazy nebudou ve skutečnosti funkční, protože nastavení klávesových zkratek je záležitostí globálního nastavení Vimu a nikoli lokálního nastavení provedeného v jednom modulu. Řešením je použití symbolu <SID>, který je při načítání skriptu nahrazen za jednoznačný a přitom unikátní celočíselný identifikátor, takže nedojde ke kolizi se jménem jiné funkce. Výše uvedené mapování by tedy mělo vypadat takto:
noremap <PageUp> :call <SID>ShowPrevSlide()<cr> noremap <PageDown> :call <SID>ShowNextSlide()<cr> noremap <Home> :call <SID>ShowFirstSlide()<cr> noremap <End> :call <SID>ShowLastSlide()<cr>
Po načtení pluginu (a všech dalších pluginů) je možné si všechny deklarované funkce jednoduše vypsat příkazem:
:function
Obrázek 3: Na tomto výpisu funkcí můžete mj. vidět i funkce deklarované v pluginu vim-weakpoint. Před názvy funkcí je uveden jednoznačný identifikátor, takže nedojde ke kolizi jmen.
6. Adresářová struktura pluginu kompatibilního s modulem Pathogen
V současnosti se prakticky žádný přídavný modul neskládá pouze z vlastního skriptu, ale minimálně ze dvou dalších souborů. Jedná se o soubor nazvaný README či častěji README.md, který obsahuje krátkou informaci o účelu pluginu i o způsobu jeho instalace. Většina pluginů, jejichž repositáře jsou umístěny na GitHubu, používá soubor README.md, v němž lze využít značkovací jazyk Markdown, který je přímo na stránkách GitHubu korektně renderován, o čemž se ostatně můžeme snadno přesvědčit. Druhým souborem je nápověda uložená v podadresáři doc. Vlastní skript pluginu je pak uložen v podadresáři plugin, takže celá struktura přídavného modulu by měla vypadat následovně (předpokládejme, že plugin neobsahuje žádné soubory s definicí barev, obarvení syntaxe atd.):
. ├── doc │ └── weakpoint.txt ├── plugin │ └── weakpoint.vim └── README.md
7. Soubor README.md a soubor obsahující nápovědu
Struktura souboru README.md může být následující. Povšimněte si použití znaků # a ## pro vytvoření základní struktury nadpisů, dále pak způsobu zápisu odkazu a taktéž použití odsazení, které v tomto případě povede k tisku zdrojového kódu (šedé pozadí, znaky z neproporcionálního fontu atd.):
# weakpoint Simple slideshow tool ## Installation With [pathogen.vim](https://github.com/tpope/vim-pathogen): cd ~/.vim/bundle git clone git://github.com/tisnik ## Usage :cd directory_with_slides :WeakPoint If you use pathogen, you can use :Helptags to regenerate documentation. You then can see ":h weakpoint" for more information. ## License Copyright (c) 2012-2015 Pavel Tisnovsky (BSD-Like)
Soubor s nápovědou je nepatrně složitější, protože i zde se používá značkovací jazyk, konkrétně značkovací jazyk používaný všemi soubory nápovědy ve Vimu. Podle mých zkušeností je nejlepší mít tento soubor otevřený dvakrát – v jednom okně se zvýrazněním syntaxe, ve druhém okně bez zvýraznění syntaxe. Důvod je jednoduchý: při zvýraznění syntaxe Vim některé znaky schová, protože mají speciální význam. Jedná se například o hvězdičky, kterými jsou uvozeny cíle odkazů (nápověda ve Vimu je hypertextová):
*weakpoint.txt* Simple slideshow tool Author: Pavel Tisnovsky License: BSD-like (see |weakpoint-license|) INTRODUCTION *weakpoint* *WeakPoint* Simple slideshow tool REQUIREMENTS *weakpoint-requirements* - On Unix, you need to have "cp" and "sort" in your path. INSTALLATION *weakpoint-installation* cd ~/.vim/bundle git clone git://github.com/tisnik USAGE *weakpoint-usage* *:WeakPoint* > :WeakPoint < LICENSE *weakpoint-license* Copyright (c) 2012-2015 Pavel Tisnovsky Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name William Lee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WILLIAM LEE AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. vim:tw=78:et:ft=help:norl:
Zajímavé je označení příkladu, které se provádí značkami >[konec řádku] a ^< [na začátku samostatného řádku]:
syn region helpExample matchgroup=helpIgnore start=" >$" start="^>$" end="^[^ \t]"me=e-1 end="^<"
Použití nápovědy:
:help weakpoint | zobrazí nápovědu od začátku |
:help weakpoint-requirements | zobrazí nápovědu od sekce REQUIREMENTS |
:help weakpoint-installation | zobrazí nápovědu od sekce INSTALLATION |
:help weakpoint-usage | zobrazí nápovědu od sekce USAGE |
:help weakpoint-license | zobrazí nápovědu od sekce LICENSE |
Obrázek 4: Zobrazení nápovědy ve Vimu.
8. Finální verze pluginu
Poslední verze pluginu pro zobrazení slajdů je vypsána pod tímto odstavcem. Jedná se o stejnou verzi, jakou naleznete v GIT repositáři:
" Slideshow tool v1.3 " Pavel Tisnovsky 2012, 2013, 2014, 2015 " Ziskani seznamu vsech souboru v aktualnim adresari function! s:GetFileList() return split(system("ls -1 | sort")) endfunction " Prechod na prvni slajd function! s:GotoFirstSlide() let s:index = 0 endfunction " Prechod na posledni slajd function! s:GotoLastSlide() let s:index = len(s:slides) - 1 endfunction " Zjisteni, zda uzivatel nepresel pred prvni slajd function! s:BeforeFirstSlide() return s:index < 0 endfunction " Zjisteni, zda uzivatel nepresel za posledni slajd function! s:AfterLastSlide() return s:index >= len(s:slides) endfunction " Zobrazeni predchoziho slajdu function! s:ShowNextSlide() let s:index += 1 if s:AfterLastSlide() call s:GotoFirstSlide() endif call s:ShowActualSlide() endfunction " Zobrazeni nasledujiciho slajdu function! s:ShowPrevSlide() let s:index -= 1 if s:BeforeFirstSlide() call s:GotoLastSlide() endif call s:ShowActualSlide() endfunction " Zobrazeni prvniho slajdu function! s:ShowFirstSlide() call s:GotoFirstSlide() call s:ShowActualSlide() endfunction " Zobrazeni posledniho slajdu function! s:ShowLastSlide() call s:GotoLastSlide() call s:ShowActualSlide() endfunction " Funkce zajistujici nacteni slajdu function! s:ShowActualSlide() execute "edit" s:slides[s:index] endfunction " Uprava stavove radky - bude se zobrazovat cislo " slajdu, pocet slajdu a jmeno souboru obsahujiciho slajd function! StatusLine() return "Slide " . (1+s:index) . "/" . len(s:slides) . " : " . s:slides[s:index] endfunction " Nastaveni zpusobu ovladani prohlizecky function! s:SetupKeys() noremap <PageUp> :call <SID>ShowPrevSlide()<cr> noremap <PageDown> :call <SID>ShowNextSlide()<cr> noremap <Home> :call <SID>ShowFirstSlide()<cr> noremap <End> :call <SID>ShowLastSlide()<cr> endfunction function! s:WeakPoint() " Promenna obsahujici seznam slajdu let s:slides = s:GetFileList() " Index aktualniho slajdu let s:index = 0 " Kontrola if s:slides == [] echo "Zadne soubory v pracovnim adresari" else " Registrace funkce pouzite pro zjisteni obsahu stavove radky set statusline=%!StatusLine() " Nastaveni zobrazeni stavove radky i v pripade, ze je pouzito " jen jedno okno set laststatus=2 call s:ShowFirstSlide() call s:SetupKeys() endif endfunction command WeakPoint :call s:WeakPoint()
9. Repositář s demonstračním pluginem
Plugin, který jsme si v dnešním článku popsali, byl uložen do GIT repositáře dostupného na adrese https://github.com/tisnik/vim-weakpoint. Z tohoto repositáře lze provést snadnou instalaci nám již důvěrně známou sekvencí příkazů:
cd ~/.vim/bundle git clone https://github.com/tisnik/vim-weakpoint Cloning into 'vim-weakpoint'... remote: Counting objects: 18, done. remote: Compressing objects: 100% (13/13), done. remote: Total 18 (delta 3), reused 17 (delta 2), pack-reused 0 Unpacking objects: 100% (18/18), done. Checking connectivity... done.
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/ - Užitečné skripty a pluginy pro textový editor Vim (6.část)
http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-6-cast-cestovani-v-case/ - Užitečné skripty a pluginy pro textový editor Vim (7.část)
http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-7-cast/
11. Odkazy na Internetu
- Writing Vim Plugins
http://stevelosh.com/blog/2011/09/writing-vim-plugins/ - how to understand this vim script?
http://stackoverflow.com/questions/12625091/how-to-understand-this-vim-script - Novinky ve VIM 7: Skriptovací jazyk
http://www.root.cz/vim-sedm-druha-cast/ - DirDiff.vim : A plugin to diff and merge two directories recursively.
http://www.vim.org/scripts/script.php?script_id=102 - vim-dirdiff na GitHubu
https://github.com/will133/vim-dirdiff - fakeclip : pseudo clipboard register for non-GUI version of Vim
http://www.vim.org/scripts/script.php?script_id=2098 - vim-fakeclip na GitHubu
https://github.com/kana/vim-fakeclip - vim-fakeclip: Dokumentace
http://kana.github.io/config/vim/fakeclip.html - Vim Multiple Cursors na GitHubu
https://github.com/terryma/vim-multiple-cursors - SLIME (Wikipedia)
http://en.wikipedia.org/wiki/SLIME - vim-slime na GitHubu
https://github.com/jpalardy/vim-slime - 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