Obsah
1. Rozhraní mezi textovým editorem Vim a skriptovacími jazyky
2. Kontrola existence rozhraní pro skriptovací jazyky
3. Rozhraní pro podporu psaní skriptů v Perlu
4. Operace prováděné nad vybranými textovými řádky – příkaz :perldo
5. Změna obsahu bufferu pomocí příkazu :perldo a speciální proměnné $_
6. Funkce nabízené rozhraním mezi Vimem a Perlem
7. Manipulace s okny a buffery
1. Rozhraní mezi textovým editorem Vim a skriptovacími jazyky
V předchozí části seriálu o různých způsobech využití textového editoru Vim jsme si řekli základní informace o tom, jakým způsobem může tento editor komunikovat se skripty napsanými v Pythonu. Díky existenci programového rozhraní mezi Vimem a Pythonem je umožněno, aby měli pythoní skripty přístup ke všem oknům a bufferům Vimu, mohou měnit pozici kurzoru, mazat či přidávat nové textové řádky do editovaných bufferů atd. Jedná se o velmi výkonný mechanismus, který je v mnoha ohledech mocnější, než pouhé spouštění pythoních skriptů zpracovávajících standardní vstup na standardní výstup, což je mimochodem technika, kterou podporoval, i když v poněkud omezené míře, už původní editor vi. Ovšem Vim není omezen pouze na komunikaci s interpretem programovacího jazyka Python, ale může být použit společně s několika dalšími skriptovacími jazyky. Jedná se o Perl, Ruby, TCL a Scheme (Racket). V následujícím textu se s rozhraními určenými pro tyto jazyky seznámíme podrobněji.
Připomeňme si, že pro zajištění úspěšné kooperace mezi Vimem a vybraným skriptovacím jazykem musí být textový editor Vim přeložen a slinkován takovým způsobem, aby se v jeho binárním (spustitelném) souboru nacházelo i programové rozhraní pro tento jazyk (taktéž samozřejmě musí být dostupný i příslušný interpret či překladač vybraného jazyka). Na mnoha distribucích Linuxu se však stává, že i zdánlivě „plnokrevný“ binární Vim nainstalovaný například z balíčku nazvaného vim-enhanced, neobsahuje rozhraní pro všechny zmiňované skriptovací jazyky: většinou se setkáte pouze s podporou Pythonu a Perlu (což může někomu připadat jako nemístná diskriminace :-). Pokud dané rozhraní není v binárním balíčku dostupné a jiný balíček pro vaši distribuci neexistuje, nezbude nic jiného, než si Vim přeložit, což ovšem většinou stejně není na škodu, protože se již při překladu mohou odstranit některé (pro mnohé uživatele zbytečné) vlastnosti, například podpora pro asijské jazyky, psaní zprava doleva, podpora pro kódování EBCDIC atd. To je však téma, kterým se budeme zabývat někdy příště.
2. Kontrola existence rozhraní pro skriptovací jazyky
Před spuštěním demonstračních příkladů uvedených v následujících kapitolách se prosím přesvědčte, zda rozhraní pro daný skriptovací jazyk skutečně existuje, například pomocí příkazu :ver (podtržení jednotlivých konfiguračních voleb bylo do výpisu samozřejmě doplněno):
Vim ve Fedoře 10 (jde o starý systém uvedený pouze pro ilustraci obsahu binárních balíčků Vimu):
:ver VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Mar 27 2009 08:42:32) Included patches: 1-148 Modified by <bugzilla@redhat.com> Compiled by <bugzilla@redhat.com> Huge version without GUI. Features included (+) or not (-): +arabic +autocmd -balloon_eval -browse ++builtin_terms +byte_offset +cindent -clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments +cryptv +cscope +cursorshape +dialog_con +diff +digraphs -dnd -ebcdic +emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path +float +folding -footer +fork() +gettext -hangul_input +iconv +insert_expand +jumplist +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap +menu +mksession +modify_fname +mouse -mouseshape +mouse_dec +mouse_gpm -mouse_jsbterm +mouse_netterm -mouse_sysmouse +mouse_xterm +multi_byte +multi_lang -mzscheme -netbeans_intg -osfiletype +path_extra +perl +postscript ^^^^^^^^^ ^^^^^ +printer +profile +python +quickfix +reltime +rightleft -ruby +scrollbind ^^^^^^^ ^^^^^ +signs +smartindent -sniff +statusline -sun_workshop +syntax +tag_binary +tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title ^^^^ -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp -xterm_clipboard -xterm_save system vimrc file: "/etc/vimrc" user vimrc file: "$HOME/.vimrc" user exrc file: "$HOME/.exrc" fall-back for $VIM: "/usr/share/vim" Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -O2 -g -pipe -Wall -Wp,-D_FO RTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -ma rch=i386 -mtune=generic -fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSE T_BITS=64 -D_FORTIFY_SOURCE=2 -D_FORTIFY_SOURCE=1 -D_REENTRANT -D_GNU_SOURCE -DDEBUGGING -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/ usr/include/gdbm -I/usr/lib/perl5/5.10.0/i386-linux-thread-multi/CORE -I/usr/i nclude/python2.5 -pthread Linking: gcc -Wl,-E -Wl,-rpath,/usr/lib/perl5/5.10.0/i386-linux-thread-multi/C ORE -L/usr/local/lib -o vim -lselinux -lncurses -lacl -lgpm -Wl,-E -W l,-rpath,/usr/lib/perl5/5.10.0/i386-linux-thread-multi/CORE -L/usr/local/lib - L/usr/lib/perl5/5.10.0/i386-linux-thread-multi/CORE -lperl -lresolv -lutil -lc - L/usr/lib/python2.5/config -lpython2.5 -lutil -lm -Xlinker -export-dynamic
Vim v Ubuntu 10.04 (povšimněte si rozdílu u podpory skriptovacích jazyků Ruby a Tcl):
:ver VIM - Vi IMproved 7.2 (2008 Aug 9, compiled Apr 16 2010 12:36:35) Použité záplaty: 1-330 přeložil buildd@ maximální verzewith GTK2 GUI. Vlastnosti zahrnuté (+) a nezahrnuté (-): +arabic +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent +clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments +cryptv +cscope +cursorshape +dialog_con_gui +diff +digraphs +dnd -ebcdic +emacs_tags +eval +ex_extra +extra_search +farsi +file_in_path +find_in_path +float +folding -footer +fork() +gettext -hangul_input +iconv +insert_expand +jumplist +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap +menu +mksession +modify_fname +mouse +mouseshape +mouse_dec +mouse_gpm -mouse_jsbterm +mouse_netterm -mouse_sysmouse +mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype +path_extra +perl +postscript ^^^^^^^^^ ^^^^^ +printer +profile +python +quickfix +reltime +rightleft +ruby +scrollbind ^^^^^^^ ^^^^^ +signs +smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary +tag_old_static -tag_any_white +tcl +terminfo +termresponse ^^^^ +textobjects +title +toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace +wildignore +wildmenu +windows +writebackup +X11 -xfontset +xim +xsmp_interact +xterm_clipboard -xterm_save systémový vimrc soubor: "$VIM/vimrc" uživatelský vimrc soubor: "$HOME/.vimrc" uživatelský exrc soubor: "$HOME/.exrc" systémový gvimrc soubor: "$VIM/gvimrc" uživatelský gvimrc soubor: "$HOME/.gvimrc" systémový soubor s menu: "$VIMRUNTIME/menu.vim" implicitní hodnota $VIM:"/usr/share/vim" Překlad: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -D_REENTRANT -pthrea d -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/us r/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc lude/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/li bpng12 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -Wall -g -O2 - D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fstack-protector -I/usr/local/include -D_LA RGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/lib/perl/5.10/CORE -I/usr/include /python2.6 -pthread -I/usr/include/tcl8.4 -D_REENTRANT=1 -D_THREAD_SAFE=1 -D_ LARGEFILE64_SOURCE=1 -I/usr/lib/ruby/1.8/i486-linux Linkuji: gcc -L. -Wl,-Bsymbolic-functions -rdynamic -Wl,-export-dynamic -Wl,- E -Wl,--as-needed -o vim -pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpan goft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lcairo -lgio-2.0 -lpango-1.0 -lfree type -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -l Xt -lncurses -lselinux -lacl -lgpm -Wl,-E -fstack-protector -L/usr/local/lib -L/usr/lib/perl/5.10/CORE -lperl -L/usr/lib/python2.6/config -lpython2.6 -lutil -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions -L/usr/lib -ltcl8.4 -l ieee -lruby1.8 -lrt -lm
3. Rozhraní pro podporu psaní skriptů v Perlu
Nejprve se budeme zabývat popisem programového rozhraní používaného při kooperaci mezi textovým editorem Vim a interpretrem známého skriptovacího programovacího jazyka Perl. Toto rozhraní je sice na první (zběžný) pohled shodné s rozhraním Pythonu, ve skutečnosti však můžeme najít i dosti podstatné odlišnosti, které jsou způsobené jak rozdílnou syntaxí a sémantikou obou skriptovacích jazyků, tak i rozdílnými názvy objektů reprezentujících interní datové struktury Vimu (obě rozhraní byla evidentně vyvíjena nezávisle na sobě). Zopakujme si nejdříve, že programový test na to, zda je vůbec možné nějaký skript v Perlu spustit, vypadá následovně:
:if has("Perl") : echo "Spouštím skript v Perlu..." : .... : .... : .... :else : echo "Chyba, podpora pro Perl není implementována" :endif
Pokud je podpora pro Perl součástí textového editoru Vim, lze použít pro spuštění perlovského skriptu příkaz :perl zkracovaný též na :pe:
:perl VIM::Msg(6*7); 42
:pe VIM::Msg(6*7); 42
Poznámka: při práci s perlovskými skripty spouštěnými přes rozhraní přímo z Vimu odpovídá volání VIM::Msg() v Perlu volání print() v Pythonu. Jde o jeden z rozdílů mezi oběma programovými rozhraními, na které je nutné si dát pozor, protože v případě Perlu nebude příkaz:
:perl print(6*7);
fungovat korektně, na rozdíl od použití stejného příkazu v klasickém skriptu spouštěném přímo z interpretru pracujícího v příkazové řádce.
Mnohem častěji se však při práci s perlovými skripty používá upravená varianta příkazu :perl se specifikací ukončujícího vzoru, která se podobá here dokumentům:
:perl << vzor příkaz příkaz vzor
Uveďme si jednoduchý příklad:
:perl << EOF for ($i = 0; $i < 10; $i++) { VIM::Msg($i); } EOF
V případě, že ukončující vzor (viz výše použitý EOF) není uveden, předpokládá se, že je roven tečce, která musí být na konci skriptu uvedena na samostatném řádku (podobně jako při používání programu mail):
:perl << for ($i = 0; $i < 10; $i++) { VIM::Msg($i); } .
Můžeme si vyzkoušet i složitější výpočet:
:perl <lt; sub factorial { my $result = 1; $result *= $_ for 1..shift; $result } VIM::Msg(factorial(42)); .
Poznámka: zkuste si předchozí příklad (celý!) uložit do souboru test.vim a následně použít příkaz:
:source test.vim
4. Operace prováděné nad vybranými textovými řádky – příkaz :perldo
V případě rozhraní pro programovací jazyk Perl sice není k dispozici příkaz pro spuštění skriptu uloženého v samostatném souboru (což je možné relativně snadno obejít prostředky samotného Perlu), ovšem uživatelé mají k dispozici mnohem zajímavější příkaz, který se jmenuje :perldo a lze ho zkrátit na :perld:
:perldo příkaz_v_Perlu
Před tímto příkazem může být uveden rozsah řádků, podobně jako u běžných vimovských příkazů typu :w apod. V případě, že rozsah není uveden, uvažuje se, že je vybrán celý buffer, tj. implicitně se použije rozsah % nebo 1,$. Za :perldo se uvádí libovolný perlovský příkaz, který je automaticky a postupně (iterativně) spuštěn pro všechny řádky v aktivním bufferu. Jinými slovy to znamená, že pokud není explicitně uveden rozsah platnosti, je perlovský příkaz v implicitní programové smyčce aplikován na každý textový řádek, jenž se nachází v aktivním bufferu, počínaje prvním řádkem. Obsah tohoto řádku je vždy umístěn do proměnné $_, kterou je možné v perlovském příkazu číst (jak jistě víte, může být tato speciální proměnná použita v některých příkazech implicitně, bez jejího zápisu do programu). Ukažme si pro začátek něco jednoduchého – výpis všech řádků obsažených v aktivním bufferu (středník za příkazem není povinný):
:perldo VIM::Msg($_)
Poněkud praktičtější demonstrační příklad postupně vypíše délky všech textových řádků, které se nachází v aktivním bufferu:
:perldo VIM::Msg(length $_)
5. Změna obsahu bufferu pomocí příkazu :perldo a speciální proměnné $_
Důležitější a mnohem užitečnější však je, že obsah proměnné $_ je možné i měnit, což znamená, že perlovský příkaz může modifikovat aktivní buffer. Opět si tuto funkcionalitu ukažme na velmi jednoduchých příkladech.
Změna všech písmen v bufferu na verzálky:
:perldo $_=uc $_
Výše uvedený příklad lze ovšem zkrátit, protože pro uc je možné použít implicitní proměnnou:
:perldo $_=uc
Převod všech písmen na mínusky:
:perldo $_=lc $_
Převod na verzálky pro prvních deset řádků:
:1,10perldo $_=uc $_
Otočení textu od řádku 10 až do konce souboru:
:10,$perldo $_=reverse $_
Zašifrování obsahu bufferu pomocí známé šifry ROT13 (druhé spuštění tohoto příkazu provede zpětné rozšifrování):
:perldo $_=~tr/A-Za-z/N-ZA-Mn-za-m/
Poznámka: i když je možné pomocí :perldo měnit obsah všech řádků v aktivním bufferu, nelze s jeho využitím textové řádky do bufferu přidávat ani je mazat. Pro takovou činnost je nutné použít techniky popsané v dalším textu.P
6. Funkce nabízené rozhraním mezi Vimem a Perlem
Jak jsme si již řekli v závěru předchozí kapitoly, je i přes značnou jednoduchost použití příkazu :perldo nemožné s jeho využitím měnit počet řádků v aktivním bufferu, tj. řádky nelze mazat, přidávat ani měnit jejich pořadí. Nicméně rozhraní mezi Vimem a Perlem nabízí programátorům přes modul VIM několik funkcí, pomocí nichž je možné obsah bufferů modifikovat přímo, popř. provádět i další zajímavé operace, například pohybovat textovým kurzorem, spouštět z Perlu libovolný příkaz Vimu atd. V následující tabulce jsou tyto funkce vypsány spolu s informací o návratové hodnotě. Jak je v Perlu zvykem, mohou být výsledky některých funkcí zpracovány v kontextu polí nebo ve skalárním kontextu (pak se vrací velikost pole, v našem případě počet otevřených bufferů nebo počet otevřených oken):
# | Funkce | Návratová hodnota | Význam |
---|---|---|---|
1 | VIM::Msg() | × | tuto funkci již známe; slouží k výpisu řetězce na obrazovku Vimu |
2 | VIM::Buffers() | pole/skalár | vrací seznam otevřených bufferů nebo počet těchto bufferů |
3 | VIM::Windows() | pole/skalár | vrací seznam otevřených oken nebo počet těchto oken |
4 | VIM::DoCommand() | různé | může spustit libovolný příkaz Vimu, jako by byl napsán v příkazovém režimu (pozor – nikoli v normálním režimu!) |
5 | VIM::Eval() | dvojice kód:hodnota | vyhodnotí výraz Vimu a vrátí dvojici obsahující příznak úspěšnosti (1) a výsledek výrazu |
6 | VIM::SetOption() | × | umožňuje nastavit konfigurační parametr Vimu |
7. Manipulace s okny a buffery
Seznam všech otevřených oken je možné v Perlu získat pomocí funkce VIM::Windows(). Poměrně často se však můžeme setkat s požadavkem na práci pouze s aktivním oknem. V tomto případě je lepší využít proměnnou $curwin, která je automaticky inicializována před spuštěním perlovského skriptu. Nezávisle na tom, jakým způsobem je hodnota představující okno získána, lze použít následující metody:
# | Funkce/proměnná | Význam |
---|---|---|
1 | Window->SetHeigt(height) | změna výšky okna uváděná ve znacích |
2 | Window->Cursor() | vrací pozici textového kurzoru v okně (jako dvojici) |
3 | Window->Cursor(row, col) | nastavení pozice textového kurzoru v okně |
4 | Window->Buffer() | vrací objekt představující buffer editovaný v okně |
Při psaní skriptů, které mají mít nějaké praktické uplatnění, se velmi často manipuluje s bufferem či buffery, typicky s aktivním bufferem. Objekt představující aktivní buffer lze získat buď poněkud krkolomnou cestou:
$curwin->Buffer()
nebo mnohem snadněji s využitím proměnné $curbuf, jejíž hodnota je nastavována při inicializaci skriptu, podobně jako je tomu u výše zmíněné proměnné $curwin. V následující tabulce jsou vypsány všechny metody použitelné při práci s buffery:
# | Funkce/proměnná | Význam |
---|---|---|
1 | Buffer->Name() | jméno editovaného souboru |
2 | Buffer->Number() | číslo bufferu |
3 | Buffer->Count() | celkový počet textových řádků v bufferu |
4 | Buffer->Get(lnum) | vrací jednu textovou řádku jako řetězec (čísluje se od jedničky!) |
5 | Buffer->Get(lnum1, lnum2,…) | lze specifikovat i více řádků, které se mají přečíst |
6 | Buffer->Delete(lnum) | smazání řádku (čísluje se od jedničky!) |
7 | Buffer->Delete(od, do) | smazání sekvence řádků |
8 | Buffer->Append(lnum, line) | za specifikovaný řádek se přidá nový text |
9 | Buffer->Set(lnum, line) | změna textu na řádku |
8. Demonstrační příklady
Na závěr si uvedeme několik skriptů, které ukazují, jak lze využít kooperaci mezi Vimem a Perlem.
Vypsání počtu otevřených bufferů:
:perl VIM::Msg(VIM::Buffers)
Vypsání počtu otevřených oken:
:perl VIM::Msg(VIM::Windows)
Nastavení konfiguračního parametru expandtab:
:perl VIM::SetOption("expandtab")
Nastavení konfiguračního parametru textwidth na nulovou hodnotu:
:perl VIM::SetOption("textwidth=0")
Uložení souboru, zde se ve skutečnosti zavolá příkaz :w:
:perl VIM::DoCommand("w")
Smazání řádku, ve skutečnosti se vykoná příkaz dd:
:perl VIM::DoCommand("normal dd")
Nastavení kurzoru na pozici [1,1]:
:perl $curwin->Cursor(1,1)
Výpis jména editovaného souboru (krkolomná cesta):
:perl VIM::Msg($curwin->Buffer()->Name())
Výpis jména editovaného souboru (kratší cesta):
:perl VIM::Msg($curbuf->Name())
Přidání nového řádku na začátek souboru:
:perl VIM::Msg($curwin->Buffer()->Append(0,"hello"))
Výpis prvního řádku:
:perl VIM::Msg($curwin->Buffer()->Get(1))
Na začátek každého řádku se přidá dvojice číslic: číslo řádku a počet znaků na řádku:
:perl << $lines=$curwin->Buffer()->Count; for ($i=0; $i<$lines; $i++) { $line=$curwin->Buffer()->Get($i); $length=length $line; $curwin->Buffer->Set($i, $i . " : " . $length . " : " . $line); } .
9. Odkazy na Internetu
- 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 interfaceStack Overflow:ssing 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 - Perl: home page
http://www.perl.org/ - Python: home page
http://www.python.org/ - Ruby: home page
http://www.ruby-lang.org/en/ - Tcl/Tk
http://www.dmoz.org/Computers/Programming/Languages/Tcl-Tk/ - Python with a modular IDE (Vim)
http://www.sontek.net/python-with-a-modular-ide-vim - PEP 8 – Style Guide for Python Code
http://www.python.org/dev/peps/pep-0008/ - pydoc.vim: Python documentation view- and search-tool (uses pydoc)
http://www.vim.org/scripts/script.php?script_id=910 - 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/ - Exuberant ctags
http://ctags.sourceforge.net/ - xxd (man page)
http://www.linux-tutorial.info/modules.php?name=ManPage&sec=1&manpage=xxd - vim (man page)
http://www.linux-tutorial.info/modules.php?name=ManPage&sec=1&manpage=vim - ctags (man page)
http://www.linux-tutorial.info/modules.php?name=ManPage&sec=1&manpage=ctags - cscope (man page)
http://www.linux-tutorial.info/modules.php?name=ManPage&sec=1&manpage=cscope - 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/ - Novinky ve VIM 7: Úvodní část – speller
http://www.root.cz/vim-sedm-prvni-cast/ - Novinky ve VIM 7: Skriptovací jazyk
http://www.root.cz/vim-sedm-druha-cast/ - vim2elvis: Přednosti a nedostaky Elvise v porovnání s Vimem
http://www.root.cz/clanky/vim2elvis-1/ - vim2elvis: Shodné znaky mezi Elvisem a Vimem, nastaveníeditoru
http://www.root.cz/clanky/vim2elvis-2/ - Nej… VIM pluginy (1)
http://www.root.cz/clanky/nej-vim-pluginy/ - 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 - Scroll Lock (Necyklopedie)
http://necyklopedie.wikia.com/wiki/Scroll_lock - Caps Lock (Necyklopedie)
http://necyklopedie.wikia.com/wiki/Caps_Lock - Avoid the escape key
http://vim.wikia.com/wiki/Avoid_the_escape_key - Map caps lock to escape in XWindows
http://vim.wikia.com/wiki/VimTip166