Obsah
1. Kooperace mezi textovým editorem Vim a skriptovacími jazyky
2. Zjištění existence rozhraní pro vybraný skriptovací jazyk
3. Test existence rozhraní pro vybraný skriptovací jazyk přímo ve VimScriptu
4. Rozhraní pro programovací jazyk Python
5. Význam modulu vim dostupného ze skriptů psaných v Pythonu
8. Nastavení Vimu při editaci zdrojových textů v Pythonu
1. Kooperace mezi textovým editorem Vim a skriptovacími jazyky
V seriálu o využití textového editoru Vim (nejenom) ve funkci vývojového prostředí jsme se již seznámili se skriptovacím jazykem nazývaným VimScript. Interpret tohoto jazyka je součástí samotného textového editoru, což mj. znamená, že uživatelské skripty mohou využívat přístup jak ke všem globálním i lokálním konfiguračním parametrům Vimu, tak i k obsahu jednotlivých bufferů, které samozřejmě mohou být těmito skripty modifikovány. Pro úplnost si připomeňme, že základy VimScriptu byly popsány v šesté, sedmé a osmé části seriálu. I přes poměrně rozsáhlé možnosti, které VimScript uživatelům i programátorům poskytuje by však v některých případech mohlo být výhodnější použít některý obecný skriptovací jazyk. Může se jednat o ty případy, kdy je zapotřebí volat nějakou funkci dostupnou z externí knihovny, volat již hotový (třeba i složitý) skript, analyzovat právě editovaný program s využitím reflexe, nebo pouze to, že je programátor na daný jazyk prostě navyklý atd.
Jak již zajisté tušíte, textový editor Vim má i v této oblasti svým uživatelům co nabídnout, protože k němu mohou být (v čase kompilace) doplněna rozhraní pro některé populární (i méně populární :-) skriptovací jazyky, mezi něž patří především Perl, Python a Ruby, které jsou doplněny o TCL a Scheme (přesněji řečeno mzscheme a.k.a. Racket). Existence rozhraní pro tyto jazyky neznamená jen to, že je možné přímo z Vimu spustit nějaký skript či vybranou funkci, ale i to, že ze skriptů je možné volat příkazy Vimu (například nastavovat konfigurační parametry) a taktéž, což je možná i důležitější, přistupovat k obsahu jednotlivých bufferů. Každý buffer bývá reprezentován seznamem řetězců, přičemž každý řetězec odpovídá jednomu textovému řádku (některá rozhraní však mohou vypadat odlišně).
2. Zjištění existence rozhraní pro vybraný skriptovací jazyk
Před využitím skriptů napsaných v některém potenciálně podporovaném programovacím jazyce je nejprve vhodné zjistit, zda vámi používaná verze Vimu skutečně obsahuje příslušná rozhraní. Možností, jak zjistit existenci těchto rozhraní, existuje více. Interaktivně je možné požadovanou informaci zjistit s využitím příkazu:
:version
Po spuštění tohoto příkazu se na obrazovku vypíše seznam vlastností Vimu, přičemž u každé vlastnosti je pomocí znaků + a - naznačeno, zda je tato vlastnost podporována či nikoli. Ukažme si, jak vypadá výpis pro variantu Vimu s podporou některých skriptovacích jazyků (nikoli však všech jazyků, což je z výpisu taktéž patrné). Konkrétně se jedná o Vim nainstalovaný z balíčku vim-enhanced-7.2.148–1 pro Fedoru:
: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
O tom, že zdaleka ne všechny binární balíčky Vimu mají implementovanou podporu pro externí skriptovací jazyky, svědčí i následující výpis pořízený z binárního balíčku Vimu dostupného pro systémy Windows:
:version VIM - Vi IMproved 7.1 (2007 May 12, compiled May 12 2007 14:14:51) MS-Windows 32 bit console version Compiled by Bram@KIBAALE Big 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 +folding -footer +gettext/dyn -hangul_input +iconv/dyn +insert_expand +jumplist +keymap +langmap +libcall +linebreak +lispindent +listcmds +localmap +menu +mksession +modify_fname +mouse -mouseshape +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 -tgetent -termresponse +textobjects +title -toolbar ^^^^ +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo +vreplace +wildignore +wildmenu +windows +writebackup -xfontset -xim -xterm_save -xpm_w32 system vimrc file: "$VIM\vimrc" user vimrc file: "$HOME\_vimrc" 2nd user vimrc file: "$VIM\_vimrc" user exrc file: "$HOME\_exrc" 2nd user exrc file: "$VIM\_exrc" Compilation: cl -c /W3 /nologo -D_MT -MT -I. -Iproto -DHAVE_PATHDEF -DWIN32 - DFEAT_CSCOPE -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /Fo.\ObjC/ /Ox -DNDEBU G -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DFEAT_BIG /Zi /Fd.\ObjC/ Linking: link /RELEASE /nologo /subsystem:console /incremental:no /nodefaultlib: libc advapi32.lib shell32.lib gdi32.lib comdlg32.lib ole32.lib uuid.lib libcmt. lib user32.lib /PDB:vim.pdb -debug
3. Test existence rozhraní pro vybraný skriptovací jazyk přímo ve VimScriptu
V mnoha praktických případech je však nutné zjistit podporu rozhraní pro vybraný programovací jazyk přímo ve skriptu (zde je myšlen VimScript). Pro tento účel lze využít funkci has(„vlastnost“), která vrací numerickou hodnotu 0 nebo 1 v závislosti na tom, zda je vlastnost předaná funkci has() ve formě řetězce ve Vimu podporována či nikoli. Informace pro příkaz :version a hodnoty vrácené funkcí has() jsou zjišťovány ze stejné interní struktury Vimu, proto jsou konzistentní. Můžete si ostatně sami vyzkoušet, která rozhraní ke skriptovacím jazykům jsou ve vaší variantě Vimu aktuálně podporována.
Zjištění existence rozhraní pro programovací jazyk Python:
:echo has("Python") 1
Zjištění existence rozhraní pro programovací jazyk Perl:
:echo has("Perl") 1
Zjištění existence rozhraní pro programovací jazyk Ruby:
:echo has("Ruby") 0
Zjištění existence rozhraní pro programovací jazyk Tcl:
:echo has("Tcl") 0
Zjištění existence rozhraní pro programovací jazyk Scheme:
:echo has("mzscheme") 0
Vzhledem k tomu, že se ve VimScriptu používají pro reprezentaci pravdivostních hodnot namísto atomů true/false právě číselné hodnoty 0 a 1, je možné funkci has() vložit přímo do podmíněného příkazu:
:if has("Python") :python print 6*7 :endif
Popř. s chybovým hlášením:
:if has("Python") :python print 6*7 :else :echo "Rozhraní pro Python není podporováno" :endif
Dtto pro Perl:
:if has("Perl") :perldo $_=reverse($_); :endif
:if has("Perl") :perldo $_=reverse($_); :else :echo "Rozhraní pro Perl není podporováno" :endif
V následujících kapitolách si pro ilustraci možností rozhraní pro různé skriptovací jazyky ukážeme, jaké funkce nám nabízí rozhraní mezi Vimem a Pythonem. Další typy rozhraní si v případě zájmu popíšeme až příště.
4. Rozhraní pro programovací jazyk Python
Prvním rozhraním, se kterým se seznámíme, je rozhraní zajišťující obousměrnou komunikaci Vimu s interpretrem programovacího jazyka Python. Pokud je toto rozhraní součástí instalace Vimu (viz též předchozí dvě kapitoly), je možné přímo z Vimu volat buď jednotlivé příkazy nebo i celé skripty napsané v Pythonu. Nejjednodušší způsob spočívá v přímém zápisu jednoho pythonovského příkazu za vimovský příkaz :python:
:python print 6*7
popř. něco složitějšího:
:python for i in range(1,10): print i
Jak je však již z druhého příkladu patrné, není tento způsob vhodný pro zápis delších (víceřádkových) sekvencí kódu. V tomto případě je výhodnější využít druhého způsobu, který se podobá použití takzvaných here documents v shellu, Pythonu, Ruby, Perlu, PHP i v některých dalších skriptovacích jazycích:
:python << EOF for i in range(1,10): print i EOF
Namísto slova EOF je samozřejmě možné použít i jiný identifikátor, například:
:python << XYZZY for i in range(1,10): for j in range(1,10): print i*j XYZZY
Třetí možnost spuštění skriptu napsaného v Pythonu spočívá ve využití automatických příkazů vykonaných při výskytu nějaké výjimky:
:autocmd BufNewFile,BufRead *.txt python příkaz_v_pythonu
Pravděpodobně nejčastěji se však setkáme s voláním skriptů uložených v externím souboru. Pro tento případ se namísto příkazu :python používá příkaz :pyfile:
:pyfile muj_skript.py
Tuto funkcionalitu si můžeme vyzkoušet na jednoduchém skriptu, který nejprve na příkazovou řádku vypíše celkový počet textových řádků v aktuálně aktivním bufferu a posléze do tohoto bufferu přidá (na konec) nový řádek:
import vim buffer=vim.current.buffer print len(buffer) buffer.append("*** Novy radek ***")
V případě, že je tento skript uložen do souboru test.py, lze ho snadno spustit pomocí příkazu:
:pyfile test.py
5. Význam modulu vim dostupného ze skriptů psaných v Pythonu
Již na skriptu uvedeném v závěru předchozí kapitoly bylo patrné, v čem ve skutečnosti spočívá největší odlišnost mezi pouhým spuštěním externího skriptu pomocí interpretru jazyka Python:
:!python test.py
a spuštěním skriptu přes rozhraní poskytované textovým editorem Vim. Rozdíl spočívá v tom, že při použití rozhraní mají skripty přístup jak ke konfiguračním parametrům Vimu, tak i k editovaným bufferům, oknům, pozici kurzoru v aktivním bufferu atd. To samozřejmě dává programátorům k dispozici velmi mocný nástroj, díky němuž mohou s editovaným textem provádět různá kouzla; jediné, co je zapotřebí provést, je import modulu nazvaného (jak jinak) vim:
import vim vim.buffers.xxx vim.windows.xxx vim.current.xxx
V následující tabulce jsou vypsány některé důležité objekty, atributy a metody z modulu vim, k nimž je možné ve skriptech přistupovat, popř. které je možné i měnit (ne všechny objekty a atributy je však povoleno modifikovat):
# | Atribut | Význam |
---|---|---|
1 | vim.buffers | všechny otevřené buffery (přístup k jednotlivým bufferům se provádí pomocí indexování) |
2 | vim.windows | všechna otevřená okna (přístup k jednotlivým oknům se provádí pomocí indexování) |
3 | vim.current | objekt obsahující atributy typu: současný řádek, aktivní buffer, aktivní okno a aktivní rozsah, viz též další kapitolu |
4 | vim.command | metoda používaná pro spuštění Vimovského příkazu |
5 | vim.eval | podobné předchozí metodě, ale vrátí se výsledek Vimovského příkazu ve formě skaláru nebo seznamu |
6 | vim.error | výjimka vyhozená v případě výskytu nějaké chyby v rozhraní (nebo ve Vimu) |
Některé z atributů z předchozí tabulky si vyzkoušíme v následujících velmi jednoduchých skriptech:
# tisk počtu otevřených bufferů import vim print len(vim.buffers)
# tisk počtu otevřených oken import vim print len(vim.windows)
# zavolání příkazu Vimu import vim vim.command("set expandtab")
# vyhodnocení výrazu (zde získání konfiguračního parametru) import vim print vim.eval("&tabstop")
6. Obsah objektu vim.current
Z praktického hlediska je nejzajímavější objekt vim.current obsahující reference na aktuální buffer, aktuální okno a taktéž na aktuální výběr (například vizuálně vybraný blok):
# | Atribut | Lze atribut modifikovat? | Význam |
---|---|---|---|
1 | vim.current.line | ano | aktuálně editovaný textový řádek (samozřejmě v aktuálním bufferu) |
2 | vim.current.buffer | ne (pro čtení) | obsah aktuálně editovaného bufferu (jedná se o Pythonní seznam s poněkud omezenými možnostmi) |
3 | vim.current.window | ne (pro čtení) | objekt reprezentující vybrané okno |
4 | vim.current.window.cursor | ano | dvojice (tuple) obsahující pozici kurzoru v okně (lze ji samozřejmě i měnit, resp. přiřadit novou dvojici) |
5 | vim.current.range | ne (pro čtení) | výběr (rozsah vybraného textu) |
7. Demonstrační příklady
Podívejme se na několik testovacích skriptů:
# změna všech znaků na aktuálním řádku na verzálky import vim import string line = vim.current.line vim.current.line = string.upper(line)
# záměna všech mezer za tildy (velmi primitivní základ utility "vlnka" :-) import vim import string line = vim.current.line lines = line.split() vim.current.line = string.join(lines, "~")
# posun kurzoru o jeden řádek níže (nepraktické, ale jde jen o ilustraci možností) import vim cursor = vim.current.window.cursor vim.current.window.cursor=(cursor[0] + 1, cursor[1])
# vymazání řádků 10 až 20 z aktuálně editovaného bufferu import vim buffer = vim.current.buffer del(buffer[10:20])
# otočení všech řádků v aktuálně editovaném bufferu import vim buffer = vim.current.buffer lines = len(buffer) for line in range(lines/2): temp = buffer[line] buffer[line] = buffer[lines-line-1] buffer[lines-line-1] = temp
Na závěr si uvedeme poněkud užitečnější skript napsaný v Pythonu, který slouží pro očíslování všech řádků v editovaném bufferu, tj. pro vložení čísla řádku (zarovnaného na tři znaky) na začátek každého textového řádku.
import vim buffer = vim.current.window.buffer # nebo jen vim.current.buffer for line in range(len(buffer)): buffer[line] = "%3d" % (line) + " " + buffer[line]
Skript lze samozřejmě upravit i takovým způsobem, aby se řádky číslovaly od jedničky a nikoli od nuly:
import vim buffer = vim.current.window.buffer # nebo jen vim.current.buffer for line in range(len(buffer)): buffer[line] = "%3d" % (line + 1) + " " + buffer[line]
8. Nastavení Vimu při editaci zdrojových textů v Pythonu
Vývojáři používající programovací jazyk Python jistě vědí, že v tomto jazyku hraje velký význam odsazení jednotlivých řádků zdrojového textu, protože právě pomocí odsazení se vyznačují jednotlivé bloky. Vzhledem k tomu, že se (nejenom) pro odsazení používají buď mezery (znaky SP) či tabulátory (znaky TAB), je poměrně důležité vědět, jakým způsobem je možné textový editor Vim nakonfigurovat nejenom tak, aby se znaky TAB zobrazovaly podle potřeb (změna šířky tabulačních zarážek), ale aby se v případě náhrady znaků TAB za mezery mohly tabulátory „simulovat“.
Vzájemná interakce různých konfiguračních parametrů může v některých případech způsobovat problémy nebo neočekávané chování Vimu. Ukažme si tedy takové nastavení konfiguračních parametrů, které by měly vést k tomu, aby vytvářený zdrojový kód co nejlépe odpovídal doporučení PEP 8 – Style Guide for Python Code:
# | Plná varianta volby | Zkrácená varianta | Popis |
---|---|---|---|
1 | textwidth=79 | tw=79 | maximální šířka textu (stále ještě existuje několik důvodů, proč používat řádky o délce 80 znaků) |
2 | smartindent | si | povolení automatického odsazení nových řádků při stlačení klávesy Enter nebo po příkazu „o“ a „O“ |
3 | cinwords=??? | cinw=??? | klíčová slova, po kterých nastává odsazení textu, pro Python použijte cinwords=if,elif,else,for,while,try,except,finally,def,class |
2 | tabstop=8 | ts=8 | způsob zobrazení znaku TAB; zdroj neustálých hádek o tom, jak velká má být mezera mezi tabulačními zarážkami |
3 | shiftwidth=4 | sw=4 | počet znaků použitých při změně odsazení bloku pomocí klávesových zkratek < a > |
4 | smarttab | sma | na začátku řádku se po stlačení TAB vloží do dokumentu mezery, jejichž počet je určen pomocí shiftwidth |
5 | expandtab | et | při stlačení klávesy TAB ve vkládacím režimu se ve skutečnosti použijí mezery (preferovaný styl) |
6 | softwatstop=4 | sts=4 | simulace znaků TAB při mazání znaků na začátku řádků (například klávesa DELETE se chová tak, jakoby se mazal znak TAB namísto 4 mezer) |
9. Odkazy na Internetu
- VIM as Python IDE
http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/ - 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