Ušetřete

Hlavní navigace

Textový editor Vim jako IDE (16. část – kooperace mezi Vimem a skriptovacími jazyky)

V dnešní části seriálu o využití textového editoru Vim (nejenom) ve funkci vývojového prostředí si řekneme, jak je možné přímo z Vimu volat skripty naprogramované v některém z podporovaných skriptovacích jazyků. Mezi tyto jazyky patří zejména populární trojice Perl, Python a Ruby, ale taktéž TCL či Scheme.

reklama

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

6. Obsah objektu vim.current

7. Demonstrační příklady

8. Nastavení Vimu při editaci zdrojových textů v Pythonu

9. Odkazy na Internetu

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é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, PythonRuby, které jsou doplněny o TCLScheme (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 VimemPythonem. 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,whi­le,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

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

Pavel Tišnovský

Pavel Tišnovský

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro Customer Content Services.

Ohodnoťte jako ve škole:
Průměrná známka 1,2

Školení: Obsahová strategie a content marketing

  •  
    Proč je obsahový marketing výrazným trendem.
  • Jak navrhnout užitečnou obsahovou strategii.
  • Jak zlepšit workflow a výsledky copywritingu.

Detailní informace o školení content strategy »

       
2 názory Vstoupit do diskuse
poslední názor přidán 21. 10. 2011 9:49

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem