Textový editor Vim jako IDE (9.část: pluginy Netrw a snipMate)

23. 8. 2011
Doba čtení: 13 minut

Sdílet

V deváté části seriálu o editoru Vim (nejenom) ve funkci vývojového prostředí si popíšeme dvojici přídavných modulů. Jedná se o modul Netrw, který umožňuje editaci souborů umístěných na vzdálených počítačích a taktéž o modul snipMate určený pro vkládání částí kódu (code snippets) do editovaného textu.

Obsah

1. Přídavný modul Netrw aneb editace souborů na vzdálených počítačích

2. Využití utility scp při práci se vzdálenými soubory

3. Další ukázky využití utility scp

4. Konfigurace přídavného modulu Netrw

5. Modul Netrw a konfigurační pomůcka NetrwSettings

6. Přídavný modul snipMate: inspirováno slavným TextMate

7. Instalace modulu snipMate, podporované programovací a značkovací jazyky

8. Příklady použití modulu snipMate

9. Odkazy na Internetu

1. Přídavný modul Netrw aneb editace souborů na vzdálených počítačích

Již v úvodních částech seriálu o textovém editoru Vim jsme se zmínili o několika přídavných modulech, které mohou urychlit a zpříjemnit práci v tomto textovém editoru. Dnes budeme v popisu různých pluginů pokračovat. Jedním z velmi užitečných přídavných modulů textového editoru Vim je modul nazvaný Netrw. Tento modul, mimochodem naprogramovaný z větší části přímo ve Vim Scriptu, je dodávaný společně s Vimem, přesněji řečeno s jeho běhovými knihovnami a skripty. To znamená, že ho s velkou pravděpodobností již máte nainstalovaný i na svém počítači, popř. ho je možné doinstalovat v balíčku nazvaném většinou vim-enhanced. Modul Netrw umožňuje editaci souborů, které se nachází na jiném počítači, než na kterém je spuštěný Vim, přičemž přenos obsahu dokumentu při jeho načítání i ukládání může probíhat s využitím různých síťových protokolů a síťových utilit, například rcp (remote copy), scp (secure copy), FTP (file transfer protocol), sftp (SSH File Transfer Protocol), popř. HTTP (Hypertext Transfer Protocol ).

Obrázek 1: Skript Netrw lze využít i jako jednoduchý správce souborů. Zkuste si ve Vimu zadat příkaz :Explore, popř. si tento příkaz namapovat na vhodnou klávesovou zkratu, například F3.

V mnoha případech, zejména při přístupu k textovým souborům umístěným na vzdáleném počítači přes pomalejší nebo lagující síť, může být využití tohoto modulu z časového hlediska mnohem výhodnější, než přihlášení na vzdálený počítač přes ssh a editace souboru přímo na tomto počítači – už jen z toho důvodu, že nedochází k neustálému přenosu paketů při provedení každé editační operace či při každém zápisu nového znaku. Swapovací soubor si Vim vytváří lokálně, takže i při přerušení spojení v naprosté většině případů o data nepřijdete. V dalších odstavcích a kapitolách se zaměřím především na popis využití scp (secure copy) pro přenos obsahu souboru při jeho načítání a ukládání, i když princip práce s texty přenášenými pomocí dalších utilit a síťových protokolů je pro uživatele Vimu z větší části shodný (až na to, že v některých případech není zapotřebí zadávat heslo a ověřovat fingerprint vzdáleného serveru).

Obrázek 2: Jiný režim zobrazení seznamu souborů podporovaný modulem Netrw.

2. Využití utility scp při práci se vzdálenými soubory

V případě, že je přídavný modul Netrw správně nainstalován, je možné přímo při startu textového editoru Vim zadat přihlašovací údaje a cestu k souboru uloženému na vzdáleném počítači. Formát je následující:

vim scp://uživatel@jméno_vzdáleného_počítače/cesta

popřípadě:

vim scp://uživatel@jméno_vzdáleného_počítače:#číslo_portu/cesta

V cestě k souboru se přitom může nacházet i znak ~ nahrazující, jak je to ostatně na unixových systémech obvyklé, domácí adresář uživatele na vzdáleném počítači. Pokud je například zapotřebí změnit obsah souboru nazvaného .bashrc a uloženého v domácím adresáři uživatele se jménem tester na počítači foo.bar.org, je možné tento soubor otevřít při spouštění textového editoru Vim následujícím způsobem:

vim scp://tester@foo.bar.org/~/.bashrc

Obrázek 3: Příkaz :Hexplore rozdělí okno horizontálně a otevře v novém bufferu správce souborů, jinak je jeho funkce shodná s příkazem :Explore.

Ještě jednou se vraťme k příkazu uvedenému výše. Povšimněte si, že za jménem počítače je použito lomítko (označené pro větší přehlednost šipkou) a nikoli dvojtečka:

vim scp://tester@foo.bar.org/~/.bashrc
____________________________^_________

To může být pro uživatele často používající nástroj scp poněkud matoucí, protože u tohoto nástroje se používá poněkud odlišný způsob zápisu využívající pro oddělení jména počítače a cesty k souboru dvojtečku:

scp tester@foo.bar.org:~/.bashrc ./
______________________^____________

Obecný tvar pro scp je:

scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
        [-l limit] [-o ssh_option] [-P port] [-S program]
        [[user@]host1:]file1 ... [[user@]host2:]file2

To, že je za jménem počítače vždy uvedené lomítko, které odděluje název počítače od cesty k souboru, mj. znamená, že zápis absolutní cesty začínající v kořenovém adresáři musí ve skutečnosti obsahovat dvě lomítka zapsaná za sebou. Opět si uveďme nějaký příklad z praxe:

vim scp://tester@foo.bar.org//etc/passwd
____________________________^^__________

Obrázek 4: Příkaz :Vexplore rozdělí okno horizontálně a otevře v novém bufferu správce souborů, jinak je jeho funkce shodná s příkazy :Explore a :Vexplore.

3. Další ukázky využití utility scp

Předpokladem správné funkce vzdálené editace textů samozřejmě je, aby soubor /etc/passwd byl pro uživatele tester alespoň čitelný (u+r), popř. i zapisovatelný (u+w). V okamžiku, kdy jsou mezi oběma stroji vyměněny veřejné klíče, není vyžadováno heslo. V opačném případě se při otevírání vzdáleného souboru i při každém zápisu do tohoto souboru textový editor Vim na heslo zeptá.

V mnoha případech však nemusí být pohodlné zapisovat celou cestu k editovanému souboru, dokonce si uživatelé ani nemusí pamatovat přesný název souboru určeného pro editaci. V tomto případě je možné zadat jen cestu k adresáři umístěném na vzdáleném serveru, přičemž je nutné nezapomenout na zápis posledního lomítka za názvem adresáře:

vim scp://tester@foo.bar.org/~/
vim scp://tester@foo.bar.org//etc/

Vim by v tomto okamžiku měl zobrazit seznam souborů a adresářů, z nichž je možné vybrat konkrétní soubor pro editaci. V tomto seznamu se lze samozřejmě pohybovat výběrovým kurzorem, vstupovat do podadresářů i nadřazených adresářů, provádět vyhledávání souboru či adresáře pomocí klávesy / (search) a navíc lze klávesou i měnit způsob zobrazení seznamu souborů a adresářů.

Obrázek 5: Zobrazení seznamu souborů uložených na vzdáleném počítači.

Načítání a ukládání „vzdálených“ souborů lze taktéž provádět již ze spuštěného textového editoru Vim, jak je to ostatně patrné i z následujících příkladů zadávaných v příkazovém režimu.

Načtení souboru a začátek jeho editace v aktuálním bufferu:

:e scp://tester@foo.bar.org/~/.vimrc

Uložení souboru na jiné místo:

:w scp://tester@foo.bar.org/home/bender/.vimrc

Uložení souboru na jiný server:

:w scp://tester@jiny.server.cz/~/.vimrc

Načtení obsahu vzdáleného souboru do právě editovaného bufferu (obsah souboru se vloží za aktuální pozici kurzoru):

:r scp://tester@foo.bar.org//etc/fstab

atd. atd.

Obrázek 6: Selhání pokusu o připojení na vzdálený počítač (služba SSH není povolena, nebo je aktivní firewall).

4. Konfigurace přídavného modulu Netrw

Přídavný modul Netrw je sice naprogramován přímo ve Vim Scriptu, pro svoji funkci ovšem vyžaduje spolupráci s externími aplikacemi, které jsou použity pro přečtení obsahu souboru ze vzdáleného počítače a samozřejmě též pro zápis souboru na vzdálený počítač. To, jaké externí aplikace se použijí a jaké parametry se jim budou předávat, je uloženo v několika globálních proměnných, jejichž název a význam je zobrazen v následující tabulce:

Protokol Globální proměnná Počáteční hodnota Poznámka
dav: g:netrw_dav_cmd „cadaver“ pokud je cadaver spustitelný
dav: g:netrw_dav_cmd „curl -o“ pokud je k dispozici nástroj curl
fetch: g:netrw_fetch_cmd „fetch -o“ pokud je k dispozici nástroj fetch
ftp: g:netrw_ftp_cmd „ftp“
http: g:netrw_http_cmd „elinks“ pokud je k dispozici browser elinks
http: g:netrw_http_cmd „links“ pokud je k dispozici browser links
http: g:netrw_http_cmd „curl“ pokud je k dispozici nástroj curl
http: g:netrw_http_cmd „wget“ pokud je k dispozici nástroj wget
http: g:netrw_http_cmd „fetch“ pokud je k dispozici nástroj fetch
rcp: g:netrw_rcp_cmd „rcp“
rsync: g:netrw_rsync_cmd „rsync -a“
scp: g:netrw_scp_cmd „scp -q“
sftp: g:netrw_sftp_cmd „sftp“

Obrázek 7: Dotaz na uživatelské heslo při přístupu k souboru umístěném na vzdáleném počítači.

5. Modul Netrw a konfigurační pomůcka NetrwSettings

Znalost proměnných vypsaných v tabulce zobrazené v předchozí kapitole je možné využít jak při změně aplikace použité u některého z protokolů (například při preferenci použití browseru Lynx namísto nástroje wget), nebo též pro předávání dalších parametrů aplikacím. Například při použití scp je možné zakázat testování fingerprintu vzdáleného počítače pomocí následujících voleb:

-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

To lze zařídit jednoduchým přiřazením těchto voleb do proměnné g:newrw_scp_cmd, přičemž je nutné využít operátor .=, aby se původní hodnota uložená v této konfigurační proměnné nepřepsala:

let g:netrw_scp_cmd .= " -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"

Obrázek 8: Zobrazení konfiguračních parametrů modulu Netrw pomocí pomůcky NetrwSettings.

Na závěr si ještě uvedeme jednu zajímavost o modulu Netrw. K tomuto modulu totiž existuje i konfigurační pomůcka nazvaná NetrwSettings. Tuto pomůcku je možné zavolat přímo z příkazového režimu následujícím způsobem:

:NetrwSettings

Po zadání výše uvedeného příkazu se zobrazí nový buffer, v němž jsou vypsány všechny konfigurační volby modulu Netrw, přičemž u každého konfiguračního parametru je možné (samozřejmě za předpokladu, že se na daném řádku nachází textový kurzor) stlačit klávesu F1 nebo ?, pomocí níž se zobrazí podrobnější popis vybraného konfiguračního parametru.

6. Přídavný modul snipMate: inspirováno slavným TextMate

V mnoha programátorských textových editorech i integrovaných vývojových prostředích mají uživatelé k dispozici nástroj umožňující vkládání předpřipravených jazykových konstrukcí (code snippets) do editovaných zdrojových kódů, a to buď pomocí klávesových zkratek nebo volbou požadované konstrukce ze seznamu či z menu. Může se jednat například o kostry počítaných programových smyček, do nichž se pouze doplní název řídicí proměnné společně s dolním a horním limitem smyčky, kostry deklarace tříd a metod atd. Podobné předpřipravené konstrukce lze samozřejmě používat i při editaci souborů využívajících různé značkovací jazyky, ať již se jedná o HTML či XML, nebo o (La)TeX. Textový editor Vim ve své základní variantě podobný nástroj sice neobsahuje, ovšem díky skriptovacímu jazyku Vim Script není velkým problémem si podobnou funkcionalitu doprogramovat, což jsme si ostatně ukázali již v předchozí části tohoto seriálu na příkladech funkcí CreateForLoop()CreateProperty().

Obrázek 9: Ukázka syntaxe konfiguračních šablon používaných modulem TextMate. Tato konkrétní šablona obsahuje kostry příkazů používaných v programovacích jazycích C a C++.

Ovšem ruční vytváření podobných funkcí pro všechny možné jazykové konstrukce by bylo poměrně pracné a současně také poněkud nepřehledné, protože tvar každé konstrukce byl (alespoň v našich demonstračních příkladech) zapsán přímo v tělech obou zmíněných funkcí. Vzhledem k tomu, že práce s code snippets je vyžadována prakticky všemi uživateli textového editoru Vim, ať už přímo vývojáři, tak i uživateli vytvářejícími HTML stránky nebo pracujícími s různými soubory XML, bylo jen otázkou času, kdy se objeví vhodný univerzální modul umožňující s code snippets snadno manipulovat. Ve skutečnosti je těchto modulů k dispozici celá řada; pro účely tohoto článku jsem vybral jeden z nejpropracovanějších modulů nazvaný snipMate, který je dostupný na adrese http://www.vim.org/scripts/scrip­t.php?script_id=2540. Název tohoto modulu je inspirovaný editorem TextMate, který je poměrně rozšířený mezi komunitou vývojářů pracujících s Mac OS.

Obrázek 10: Ukázka šablony s kostrami příkazů používaných ve Vim Scriptu.

7. Instalace modulu snipMate, podporované programovací a značkovací jazyky

Práce s modulem snipMate je ve skutečnosti velmi jednoduchá. Po stažení archivu se skriptem i dalšími pomocnými soubory lze tento archiv rozbalit do adresáře ~/.vim, popř. je možné jeho obsah překopírovat do adresáře obsahujícího běhové soubory samotného Vimu, což je většinou adresář /usr/share/vim/vimXX, kde XX je číslo verze Vimu bez oddělovací tečky, například 72 pro verzi 7.2. Po úspěšné instalaci je modul snipMate připraven k automatickému načtení v případě, že se edituje některý ze známých typů souborů. Automatické načtení modulu je provedeno díky tomu, že se inicializační skript celého snipMate nachází v podadresáři autoload. Jaké typy souborů jsou v nainstalované verzi snipMate podporovány lze zjistit jednoduše pomocí příkazu:

:Explore ~/.vim/snippets

Obrázek 11: Vytvoření nové funkce v programovacím jazyku Java pomocí šablony.

V současné verzi jsou podporovány následující programovací a značkovací jazyky:

# Soubor s definicí koster příkazů
1 autoit
2 c
3 cpp
4 html
5 java
6 javascript
7 mako
8 objc
9 perl
10 php
11 python
12 ruby
13 sh
14 snippet
15 tcl
16 tex
17 vim
18 zsh

Obrázek 12: Pomocí klávesy Tab lze postupně doplnit název funkce, její návratovou hodnotu, parametry i seznam vyhazovaných výjimek.

8. Příklady použití modulu snipMate

Práce s modulem snipMate je velmi jednoduchá. Postačuje si zjistit (popř. i změnit) zkratky používané tímto modulem pro daný programovací jazyk. Například pro jazyky C, C++ či Java existuje zkratka for určená pro poloautomatické vytvoření programové smyčky. Při psaní kódu tedy stačí napsat trojici znaků „for“ a ihned poté stlačit klávesu Tab. Ihned poté dojde k vložení kostry smyčky do editovaného textu, to však není vše, protože opětovným stlačováním klávesy Tab je možné se přesouvat na variabilní (tj. editovatelné) části smyčky, zejména na jméno řídicí proměnné, limity cyklu a samozřejmě i na prozatím prázdné tělo smyčky. Zajímavé přitom je, že při editaci jména řídicí proměnné se toto jméno současně mění na všech třech místech, tj. jak v inicializačním příkazu (přiřazení počáteční hodnoty do proměnné), tak i v podmínce pro ukončení smyčky a v iteračním příkazu. Celý postup vytvoření smyčky je ve skutečnosti velmi jednoduchý, jak je to ostatně patrné z následující sekvence screenshotů:

Obrázek 13: Vytvoření počítané smyčky for v programovacím jazyce C pomocí modulu snipMate: zápis textu „for“.

Obrázek 14: Po stlačení klávesy Tab se smyčka vytvoří a kurzor se přesune na první variabilní (editovatelnou) položku.

ict ve školství 24

Obrázek 15: Po dalším stlačení klávesy Tab lze přejmenovat řídicí proměnnou smyčky.

Obrázek 16: Po čtvrtém stlačení klávesy Tab se kurzor přemístí do těla smyčky.

9. Odkazy na Internetu

  1. snipMate : TextMate-style snippets for Vim
    http://www.vim.org/scripts/scrip­t.php?script_id=2540
  2. msanders / snipmate.vim
    https://github.com/msander­s/snipmate.vim
  3. snipMate.vim Introductory Screencast
    http://vimeo.com/3535418
  4. Clewn home page
    http://clewn.sourceforge.net/
  5. How to connect vim with gdb – using clewn
    http://chunhao.net/blog/how-to-connect-vim-with-gdb-using-clewn
  6. yavdb : Yet Another (Generic) Vim Debugger Integration
    http://www.vim.org/scripts/scrip­t.php?script_id=1954
  7. Vim home page
    http://www.vim.org/
  8. Exuberant ctags
    http://ctags.sourceforge.net/
  9. xxd (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=xxd
  10. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  11. ctags (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=ctags
  12. cscope (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=csco­pe
  13. 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/
  14. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  15. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  16. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  17. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  18. Novinky ve VIM 7: Úvodní část – speller
    http://www.root.cz/vim-sedm-prvni-cast/
  19. Novinky ve VIM 7: Skriptovací jazyk
    http://www.root.cz/vim-sedm-druha-cast/
  20. vim2elvis: Přednosti a nedostaky Elvise v porovnání s Vimem
    http://www.root.cz/clanky/vim2elvis-1/
  21. vim2elvis: Shodné znaky mezi Elvisem a Vimem, nastaveníeditoru
    http://www.root.cz/clanky/vim2elvis-2/
  22. Nej… VIM pluginy (1)
    http://www.root.cz/clanky/nej-vim-pluginy/
  23. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  24. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  25. 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
  26. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318
  27. Scroll Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Scroll_lock
  28. Caps Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Caps_Lock
  29. Avoid the escape key
    http://vim.wikia.com/wiki/A­void_the_escape_key
  30. Map caps lock to escape in XWindows
    http://vim.wikia.com/wiki/VimTip166

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.