Textový editor Vim jako IDE (17. část – kooperace mezi Vimem a jazykem Perl)

Pavel Tišnovský 27. 10. 2011

V sedmnácté části seriálu o různých způsobech využití textového editoru Vim dokončíme téma, jímž jsme se začali zabývat již minule – jedná se o kooperaci mezi Vimem a různými skriptovacími jazyky. Minule jsme si popsali rozhraní mezi Vimem a Pythonem, dnes se zaměříme na rozhraní pro programovací jazyk Perl.

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

8. Demonstrační příklady

9. Odkazy na Internetu

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 VimemPythonem 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, TCLScheme (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 PythonuPerlu (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ů RubyTcl):

: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()Perlu volání print()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 VimemPerlem 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 VimemPerlem.

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:

widgety

: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

  1. Vim Perl Interface
    http://vim.dindinx.net/vim7/html/if_per­l.txt.php
  2. Vim Perl Support
    http://www.softpanorama.or­g/Editors/Vimorama/vim_per­l_support.shtml
  3. VIM as Python IDE
    http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/
  4. Stack Overflow: VIM: Perl interfaceStack Overflow:ssing 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
  5. Stack Overflow: Getting started with vim scripting with Perl
    http://stackoverflow.com/qu­estions/2208618/getting-started-with-vim-scripting-with-perl
  6. Perl: home page
    http://www.perl.org/
  7. Python: home page
    http://www.python.org/
  8. Ruby: home page
    http://www.ruby-lang.org/en/
  9. Tcl/Tk
    http://www.dmoz.org/Compu­ters/Programming/Languages/Tcl-Tk/
  10. Python with a modular IDE (Vim)
    http://www.sontek.net/python-with-a-modular-ide-vim
  11. PEP 8 – Style Guide for Python Code
    http://www.python.org/dev/peps/pep-0008/
  12. pydoc.vim: Python documentation view- and search-tool (uses pydoc)
    http://www.vim.org/scripts/scrip­t.php?script_id=910
  13. Getting to VIM's Python interface
    http://zerokspot.com/weblog/2009/02/21/get­ting-to-know-vims-python-interface/
  14. Pretty-formatting XML
    http://vim.wikia.com/wiki/Pretty-formatting_XML
  15. Delete a pair of XML/HTML tags
    http://vim.wikia.com/wiki/De­lete_a_pair_of_XML/HTML_tags
  16. Vim as XML Editor
    http://www.pinkjuice.com/how­to/vimxml/
  17. xmledit: A filetype plugin to help edit XML, HTML, and SGML documents
    http://www.vim.org/scripts/scrip­t.php?script_id=301
  18. Poslední vývojová verze makra xmledit
    http://github.com/sukima/xmledit/
  19. vim.wikia: Display date-and-time on status line
    http://vim.wikia.com/wiki/Display_date-and-time_on_status_line
  20. vim.wikia: Writing a valid statusline
    http://vim.wikia.com/wiki/Wri­ting_a_valid_statusline
  21. vim.wikia: Statusline tab level ruler
    http://vim.wikia.com/wiki/Sta­tusline_tab_level_ruler
  22. vim.wikia: Switching between different statuslines
    http://vim.wikia.com/wiki/Swit­ching_between_different_sta­tuslines
  23. X Selections, Cut Buffers, and Kill Rings
    http://www.jwz.org/doc/x-cut-and-paste.html
  24. Accessing the system clipboard
    http://vim.wikia.com/wiki/Ac­cessing_the_system_clipbo­ard
  25. xcutsel(1) – Linux man page
    http://linux.die.net/man/1/xcutsel
  26. snipMate : TextMate-style snippets for Vim
    http://www.vim.org/scripts/scrip­t.php?script_id=2540
  27. msanders / snipmate.vim
    https://github.com/msander­s/snipmate.vim
  28. snipMate.vim Introductory Screencast
    http://vimeo.com/3535418
  29. Clewn home page
    http://clewn.sourceforge.net/
  30. How to connect vim with gdb – using clewn
    http://chunhao.net/blog/how-to-connect-vim-with-gdb-using-clewn
  31. yavdb : Yet Another (Generic) Vim Debugger Integration
    http://www.vim.org/scripts/scrip­t.php?script_id=1954
  32. Vim home page
    http://www.vim.org/
  33. Exuberant ctags
    http://ctags.sourceforge.net/
  34. xxd (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=xxd
  35. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  36. ctags (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=ctags
  37. cscope (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=csco­pe
  38. 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/
  39. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  40. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  41. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  42. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  43. Novinky ve VIM 7: Úvodní část – speller
    http://www.root.cz/vim-sedm-prvni-cast/
  44. Novinky ve VIM 7: Skriptovací jazyk
    http://www.root.cz/vim-sedm-druha-cast/
  45. vim2elvis: Přednosti a nedostaky Elvise v porovnání s Vimem
    http://www.root.cz/clanky/vim2elvis-1/
  46. vim2elvis: Shodné znaky mezi Elvisem a Vimem, nastaveníeditoru
    http://www.root.cz/clanky/vim2elvis-2/
  47. Nej… VIM pluginy (1)
    http://www.root.cz/clanky/nej-vim-pluginy/
  48. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  49. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  50. 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
  51. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318
  52. Scroll Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Scroll_lock
  53. Caps Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Caps_Lock
  54. Avoid the escape key
    http://vim.wikia.com/wiki/A­void_the_escape_key
  55. Map caps lock to escape in XWindows
    http://vim.wikia.com/wiki/VimTip166
Našli jste v článku chybu?
Lupa.cz: Další Češi si nechali vložit do těla čip

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

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

Test LG 55UH750V aneb Cena/výkon

Vitalia.cz: 5 důvodů, proč jet na výlov rybníka

5 důvodů, proč jet na výlov rybníka

Podnikatel.cz: Udělali jsme velkou chybu, napsal Čupr

Udělali jsme velkou chybu, napsal Čupr

DigiZone.cz: Nova opět stahuje „milionáře“

Nova opět stahuje „milionáře“

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

dTest odhalil ten nejlepší kečup

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

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

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

DigiZone.cz: Mordparta: trochu podchlazený 87. revír

Mordparta: trochu podchlazený 87. revír

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

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

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

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

Vitalia.cz: Jaký je rozdíl mezi brambůrky a chipsy?

Jaký je rozdíl mezi brambůrky a chipsy?

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

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

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

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

Vitalia.cz: Jak Ondra o astma přišel

Jak Ondra o astma přišel

Lupa.cz: Jak levné procesory změnily svět?

Jak levné procesory změnily svět?

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

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

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

Takhle se prodávají mražené potraviny

DigiZone.cz: Parlamentní listy: kde končí PR...

Parlamentní listy: kde končí PR...

Lupa.cz: Jak se prodává firma za miliardu?

Jak se prodává firma za miliardu?