Užitečné skripty a pluginy pro textový editor Vim (2.část)

24. 3. 2015
Doba čtení: 14 minut

Sdílet

Ve druhé části článku o užitečných skriptech a pluginech pro editor Vim si popíšeme rozšiřující modul Fugitive, který je použitelný zejména pro uživatele pracující s Gitem. Dále si popíšeme podobně zaměřený plugin Vcscommand umožňující práci i s dalšími systémy pro správu verzí. Nezapomeneme ani na oblíbený NERDTree.

Obsah

1. Užitečné skripty a pluginy pro textový editor Vim (2.část)

2. Plugin fugitive

3. Použití pluginu fugitive

4. Další příkazy nabízené pluginem fugitive

5. Plugin Vcscommand

6. Použití pluginu Vcscommand

7. Plugin NERD Tree

8. Klávesové zkratky pluginu NERD Tree

9. Odkazy na Internetu

1. Užitečné skripty a pluginy pro textový editor Vim (2.část)

V první části článku o užitečných skriptech a rozšiřujících modulech určených pro textový editor Vim jsme si popsali především skript nazvaný Vim Pathogen, který je možné použít pro jednoduchou správu všech dalších rozšiřujících modulů (pluginů). Víme již, že díky použití Pathogenu lze každý plugin pouze jednoduše zkopírovat do zvláštního podadresáře umístěného v adresáři ~/.vim/bundle/ – o korektní inicializaci pluginů se již Pathogen postará automaticky. Automatizace pluginů může ve skutečnosti jít ještě o krok dále, protože jednotlivé pluginy není nutné ručně stahovat a posléze kopírovat do adresáře ~/.vim/bundle/. Naprostá většina pluginů je totiž přístupná z Git repositáře, takže ve skutečnosti postačuje si takový plugin jednou naklonovat a posléze jednou za čas v adresáři s pluginem (například ~/.vim/bundle/vim-airline) spustit příkaz git pull, který daný plugin jednoduše zaktualizuje, se zachováním případných uživatelových změn provedených ve skriptu.

V dalších kapitolách budeme předpokládat, že skript Vim Pathogen byl nainstalován podle instrukcí uvedených v první části tohoto článku. Adresářová struktura v uživatelově domovském adresáři používaná Vimem by měla vypadat následovně:

.vim
├── autoload
│   └── pathogen.vim
└── spell
    ├── cs.iso-8859-2.spl
    └── cs.utf-8.spl

Aby se skript Vim Pathogen korektně aktivoval po každém spuštění Vimu, je nutné provést ještě malou úpravu konfiguračního souboru .vimrc umístěného v domácím adresáři. Do tohoto souboru se musí dopsat volání funkce:

execute pathogen#infect()

Obrázek 1: Jednou z možností zjištění, zda je skript Vim Pathogen skutečně načten, je použití příkazu :echo g:loaded_pathogen, který musí vypsat obsah globální proměnné nazvané loaded_pathogen. Pokud tato proměnná neexistuje, nebyl Vim Pathogen korektně inicializován.

2. Plugin fugitive

Prvním dnes popisovaným rozšiřujícím modulem určeným pro textový editor Vim je plugin nazvaný Fugitive. Tento rozšiřující modul slouží pro usnadnění práce s Gitem, resp. přesněji řečeno k práci se soubory uloženými v naklonovaných Git repositářích. Plugin Fugitive je dostupný na adrese http://www.vim.org/scripts/scrip­t.php?script_id=2975, jeho vlastní Git repositář pak naleznete na adrese https://github.com/tpope/vim-fugitive.

Obrázek 2: Součástí pluginu Fugitive je samozřejmě i nápověda, postačuje zadat příkaz :help fugitive.

Po instalaci tohoto pluginu by měla struktura adresáře ~/.vim vypadat přibližně následovně (samozřejmě je možné, že již budete mít nainstalovány nějaké další pluginy, například ty popsané v první části tohoto článku):

.
├── autoload
├── bundle
│   └── vim-fugitive
│       ├── doc
│       └── plugin
└── spell

Po instalaci pluginu Fugitive a po spuštění nové instance Vimu je pro každý buffer, který je součástí naklonovaného Git repositáře, k dispozici několik nových příkazů popsaných v navazujících dvou kapitolách. Důležité přitom je, že tyto příkazy jsou skutečně aktivní pouze pro buffery odpovídající souborům uloženým v Git repositáři.

3. Použití pluginu fugitive

Otestování funkčnosti rozšiřujícího modulu Fugitive lze provést jednoduše. Nejprve je nutné přejít do adresáře, v němž se nachází soubory naklonované z Git repositáře; může se klidně jednat o adresář s naklonovaným pluginem Fugitive. Následně se spustí Vim či Gvim a otevře se buffer obsahující nějaký soubor, který je již součástí repositáře:

vim soubor_z_gitu

Nyní by uživatel textového editoru Vim měl mít k dispozici velké množství nových příkazů, které všechny začínají na písmeno G (jedná se skutečně o velké G). Jak je však možné si tyto příkazy vypsat? Postačuje nepatrně změnit nastavení Vimu následujícím způsobem:

set wildmenu
set wildmode=list:longest,full

Posléze se všechny příkazy začínající na písmeno G zobrazí takto:

:G<Tab>

Obrázek 3: V závislosti na nastavení Vimu je možné si jednoduše vypsat všechny příkazy začínající na písmeno G s využitím :G[Tab].

Základní čtyři příkazy poskytované pluginem Fugitive jsou uvedeny v následující tabulce:

# Příkaz Význam
1 :Gpull zavolá příkaz git pull
2 :Gpush zavolá příkaz git push, případné chyby se vypisují do speciálního okna nazvaného quick window (stejně jako chyby při překladu atd.)
3 :Gcommit zavolá příkaz git commit (pokud došlo ke změnám) popř. git status (pokud nedošlo k žádným změnám). Při commitu se otevře nové okno pro zadání zprávy.
4 :Gmerge zavolá příkaz git merge, chyby se vypisují do speciálního okna nazvaného quick window (stejně jako chyby při překladu atd.)

Předností využití těchto příkazů oproti jejich ekvivalentům zadávaným z příkazové řádky je fakt, že se veškeré zprávy budou vypisovat přímo do bufferů/oken textového editoru Vim, při commitu se navíc zadání zprávy (commit message) provede v novém okně – to vše bez nutnosti opustění prostředí Vimu. Pokud dojde k chybě, což se samozřejmě může stát, zejména v případě příkazu :Gmerge, jsou tyto chyby zobrazeny v okně quick window a navíc uloženy v paměti Vimu takovým způsobem, že je lze zpracovat tzv.quickfix příkazy, například:

:cc zobrazení chyby
:cn zobrazení další chyby
:cp zobrazení předchozí chyby

Obrázek 4: Takto vypadá výsledek příkazu :Glog.

4. Další příkazy nabízené pluginem fugitive

Přídavný modul Fugitive ve skutečnosti uživatelům nabízí i poměrně velké množství dalších příkazů, které v menší či větší míře využívají faktu, že jsou spuštěny přímo v prostředí Vimu a nikoli na příkazové řádce. Pojďme si některé tyto příkazy alespoň ve stručnosti popsat:

# Příkaz Význam
1 :Glog do takzvaného quickfix listu uloží informace o všech revizích aktuálně editovaného souboru. Mezi revizemi se lze přepínat například s využitím příkazů :cn a :cp, vypsat změny přes :clist
2 :Gllog podobný příkaz jako :Glog, ale používá seznam lokací, zde se používají příkazy :lprev a :lnext pro procházení revizemi
3 :Gstatus zobrazí aktuální stav Git repositáře, odpovídá git status
4 :Gblame aktuální okno se vertikálně rozdělí a v levém (novém) okně se pro každý řádek zobrazí autor poslední změny
5 :Gfetch odpovídá příkazu git fetch, opět se zapamatováním chybových zpráv
6 :Gdiff aktuální okno se rozdělí a zobrazí se změny v bufferu (používá se přitom režim vimdiff, takže dochází k synchronizaci při skrolování rozděleného okna atd.)
7 :Gsdiff stejné jako předchozí příkaz, ale okno je vždy rozděleno horizontálně
8 :Gvdiff stejné jako předchozí příkaz, ale okno je vždy rozděleno vertikálně (užitečnější, zejména na moderních širokoúhlých monitorech)
9 :Gread umožňuje do aktuálního bufferu načíst libovolnou revizi souboru

Pozor: některé výše popsané příkazy nefungují korektně, pokud máte ve .vimrc nastaveno :set shellpipe=2>.

Obrázek 5: Pomocí příkazu :Gcommit lze provést commit, a to bez nutnosti opuštění Vimu.

Velmi užitečný je v mnoha případech příkaz :Gread, který částečně odpovídá chování externího příkazu git checkout, ovšem provedeného jen pro aktuálně editovaný soubor/buffer (ve skutečnosti jsou možnosti :Gread mnohem větší, více je uvedeno v nápovědě). Tento příkaz se volá následovně:

:Gread revize

Po provedení tohoto příkazu se obsah bufferu změní takovým způsobem, že odpovídá zadané revizi. Revizi lze zadat mnoha způsoby, například:

Revize Význam
^ předchozí commit
~1 dtto
~2 verze před dvěma commity
~3 verze před třemi commity

Obrázek 6: Užitečný je taktéž příkaz :Gblame.

5. Plugin Vcscommand

Přídavný modul Fugitive popsaný v předešlých třech kapitolách je pro uživatele Gitu velmi užitečný a stává se i poměrně populárním. Ve skutečnosti se ovšem u některých projektů používají odlišné systémy pro správu verzí, ať již se jedná o CVS, Subversion či Mercurial (stranou přitom nyní ponechme důvody, proč tomu tak je :-). Pro uživatele těchto systémů pro správu verzí (ovšem včetně Gitu) existuje další plugin nazvaný vcscommand. Přídavný modul vcscommand je umístěn v Git repositáři dostupném na adrese https://github.com/vim-scripts/vcscommand.vim.git.

Obrázek 7: Přídavný modul vcscommand je samozřejmě vybaven i nápovědou dostupnou po zadání příkazu :help vcscommand.

Nejprve si ukažme, jak lze vcscommand nainstalovat přímo z výše uvedeného repositáře, a to pomocí pouhých dvou příkazů (které nám navíc zajistí možnost kdykoli provést aktualizaci tohoto pluginu):

cd ~/.vim/bundle
git clone https://github.com/vim-scripts/vcscommand.vim.git
 
Cloning into 'vcscommand.vim'...
remote: Counting objects: 478, done.
remote: Total 478 (delta 0), reused 0 (delta 0), pack-reused 478
Receiving objects: 100% (478/478), 163.80 KiB | 0 bytes/s, done.
Resolving deltas: 100% (216/216), done.
Checking connectivity... done.

Výsledná struktura adresáře ~/.vim/ by měla vypadat následovně:

.
├── autoload
├── bundle
│   ├── vcscommand.vim
│   │   ├── doc
│   │   ├── plugin
│   │   └── syntax
│   └── vim-fugitive
│       ├── doc
│       └── plugin
└── spell

Obrázek 8: Užitečný příkaz :VCSBlame.

6. Použití pluginu Vcscommand

V přídavném modulu vcscommand je deklarováno několik nových příkazů, které je možné použít pro prakticky všechny systémy pro správu verzí (VCS – Version Control System). To sice může být poněkud matoucí, protože různé VCS používají na příkazové řádce odlišné příkazy, na druhou stranu to však znamená, že při přechodu na jiný typ VCS se uživatelé Vimu a pluginu vcscommand mohou adaptovat na nový systém poměrně rychle (minimálně to platí při přechodu mezi CSV a Subversion, popřípadě při přechodu mezi Mercurialem a GITem).

Obrázek 9: Dalším užitečným příkazem je :VCSLog.

V následující tabulce jsou vypsány základní (společné) nové příkazy:

# Příkaz Význam
1 :VCSAdd přidání aktuálně editovaného souboru do systému pro správu verzí
2 :VCSCommit přidání změn provedených v editovaném souboru do systému pro správu verzí
3 :VCSDelete odstranění souboru ze systému pro správu verzí
4 :VCSRemove (alias) odstranění souboru ze systému pro správu verzí
5 :VCSDiff zobrazení změn provedených v aktuálně editovaném souboru oproti verzi uložené ve VCS
6 :VCSLog zobrazení historie změn do nového bufferu (se zvýrazněním syntaxe atd.)
7 :VCSReview zobrazení specifikované verze souboru
8 :VCSStatus zobrazení stavu aktuálně editovaného souboru

Obrázek 10: Zobrazení změn provedených v souboru pomocí příkazu :VCSDiff.

Kromě toho je deklarováno ještě několik příkazů specifických pro stařičké CVS:

# Příkaz Význam
1 :CVSEdit odpovídá příkazu cvs edit použitého pro aktuálně editovaný soubor
2 :CVSEditors odpovídá příkazu cvs edit použitého pro aktuálně editovaný soubor
3 :CVSUnedit odpovídá příkazu cvs unedit
4 :CVSWatch odpovídá příkazu cvs watch s parametrem on/off/add/remove
5 :CVSWatchAdd odpovídá příkazu cvs watch add
6 :CVSWatchOn odpovídá příkazu cvs watch on
7 :CVSWatchOff odpovídá příkazu cvs watch off
8 :CVSWatchRemove odpovídá příkazu cvs watch remove
9 :CVSWatchers odpovídá příkazu cvs watchers použitého pro aktuálně editovaný soubor

Obrázek 11: Uložení změn příkazem :VCSCommit.

7. Plugin NERD Tree

Třetím a současně i posledním dnes popisovaným přídavným modulem textového editoru Vim je známý a mezi vimisty i velmi populární modul se jménem NERD Tree. Základní informace o tomto modulu je možné nalézt na adrese http://www.vim.org/scripts/scrip­t.php?script_id=1658. Instalace může proběhnout následujícím způsobem:

cd ~/.vim/bundle
git clone https://github.com/scrooloose/nerdtree.git

Výsledná struktura adresáře ~/.vim/ by po instalaci měla vypadat například následovně (předpokládejme, že jsou nainstalovány všechny tři dnes popisované přídavné moduly):

.
├── autoload
├── bundle
│   ├── nerdtree
│   │   ├── doc
│   │   ├── nerdtree_plugin
│   │   ├── plugin
│   │   └── syntax
│   ├── vcscommand.vim
│   │   ├── doc
│   │   ├── plugin
│   │   └── syntax
│   └── vim-fugitive
│       ├── doc
│       └── plugin
└── spell

Obrázek 12: Nápověda k pluginu NERD Tree.

V modulu NERD Tree je implementován poměrně propracovaný správce souborů založený na zobrazení stromu obsahujícího adresáře a soubory, podobně jako je tomu i u většiny integrovaných vývojových prostředí. Strom se přitom zobrazuje v samostatném podokně a pro jeho vyvolání se používá příkaz :NERD Tree. Samozřejmě je možné si tento příkaz namapovat na prakticky libovolnou klávesovou kombinaci, například pomocí následujícího příkazu:

:map <F12> :NERDTree<CR>

NERD Tree dokáže zvýraznit různé typy uzlů – především rozlišuje mezi adresáři a běžnými soubory, ovšem zvýraznit dokáže taktéž spustitelné soubory popř. soubory určené pouze pro čtení.

Obrázek 13: Uživatelské prostředí přídavného modulu NERD Tree.

8. Klávesové zkratky pluginu NERD Tree

Po spuštění příkazu :NERDTree by mělo dojít k rozdělení (split) aktuálního okna takovým způsobem, že se uživatelské rozhraní modulu NERD Tree objeví v levé části. Jakmile je kurzor do tohoto okna (bufferu) umístěn, lze používat následující základní jednoklávesové příkazy:

Klávesa Význam
j,k přesun kurzoru na další či předchozí soubor/adresář
o otevření či skrytí obsahu adresáře, na němž se nachází kurzor
t otevření vybraného souboru v novém tabu
i horizontální rozdělení okna a otevření vybraného souboru v novém bufferu
s vertikální rozdělení okna a otevření vybraného souboru v novém bufferu (s jako split)

Obrázek 14: V levé části jsou zobrazeny klávesové zkratky používané přídavným modulem NERD Tree.

Ve skutečnosti je však deklarováno i mnoho dalších klávesových zkratek, například zkratky ovlivňující způsob zobrazení okna NERD Tree:

Klávesa Význam
? zapnutí či vypnutí nápovědy zobrazené přímo v okně NERD Tree
m zobrazení menu NERD Tree (viz další text)
R znovunačtení stromu, překreslení okna NERD Tree (lze využít ve chvíli, kdy je nějaký soubor změněn mimo Vim)
I zobrazení či vypnutí zobrazení skrytých souborů

Zajímavá je klávesová zkratka m vyvolávající jednoduché kontextové menu platné pro právě vybraný soubor či adresář, přesněji řečeno pro soubor či adresář, na němž se nachází kurzor:

bitcoin_skoleni

Klávesa Význam
a vytvoření nového souboru či adresáře
m přesun souboru či adresáře
d vymazání souboru či adresáře
k kopie souboru či adresáře

Po výběru některého příkazu z kontextového menu je nutné zadat buď název nového souboru popř. adresáře nebo cestu, kam se mají data přesunout či zkopírovat.

Obrázek 15: NERD Tree použitý jako jednoduchý správce projektů.

9. Odkazy na Internetu

  1. Vim Essential Plugin: NERD Tree
    http://code.tutsplus.com/tutorials/vim-essential-plugin-nerdtree–net-19692
  2. The NERD tree : A tree explorer plugin for navigating the filesystem
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=1658
  3. NERD Tree Guide
    http://usevim.com/2012/07/18/ner­dtree/
  4. vcscommand.vim : CVS/SVN/SVK/git/hg/bzr integration plugin
    http://www.vim.org/scripts/scrip­t.php?script_id=90
  5. vcscommand na GitHubu
    https://github.com/vim-scripts/vcscommand.vim
  6. Popis skriptu Vim Pathogen
    http://www.vim.org/scripts/scrip­t.php?script_id=2332
  7. Poslední verze skriptu Vim Pathogen
    https://tpo.pe/pathogen.vim
  8. Nejlepší pluginy pro Vim
    http://vimawesome.com/
  9. Nejlepší pluginy pro Vim
    http://www.vim.org/scripts/scrip­t_search_results.php?order_by=ra­ting
  10. Vim-airline na GitHubu
    https://github.com/bling/vim-airline
  11. Vim-airline na www.vim.org
    http://www.vim.org/scripts/dow­nload_script.php?src_id=22726
  12. Vim-fugitive na GitHubu
    https://github.com/tpope/vim-fugitive
  13. Vim-fugitive na www.vim.org
    http://www.vim.org/scripts/scrip­t.php?script_id=2975
  14. Textový editor Vim jako IDE (seriál)
    http://www.root.cz/clanky/textovy-editor-vim-jako-ide/
  15. Building Vim
    http://vim.wikia.com/wiki/Bu­ilding_Vim
  16. Getting the Vim source with Mercurial
    http://vim.wikia.com/wiki/Get­ting_the_Vim_source_with_Mer­curial
  17. Vim Perl Interface
    http://vim.dindinx.net/vim7/html/if_per­l.txt.php
  18. Vim Perl Support
    http://www.softpanorama.or­g/Editors/Vimorama/vim_per­l_support.shtml
  19. VIM as Python IDE
    http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/
  20. Stack Overflow: VIM: Perl interface: passing 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
  21. Stack Overflow: Getting started with vim scripting with Perl
    http://stackoverflow.com/qu­estions/2208618/getting-started-with-vim-scripting-with-perl
  22. Python with a modular IDE (Vim)
    http://www.sontek.net/python-with-a-modular-ide-vim
  23. Getting to VIM's Python interface
    http://zerokspot.com/weblog/2009/02/21/get­ting-to-know-vims-python-interface/
  24. Pretty-formatting XML
    http://vim.wikia.com/wiki/Pretty-formatting_XML
  25. Delete a pair of XML/HTML tags
    http://vim.wikia.com/wiki/De­lete_a_pair_of_XML/HTML_tags
  26. Vim as XML Editor
    http://www.pinkjuice.com/how­to/vimxml/
  27. xmledit: A filetype plugin to help edit XML, HTML, and SGML documents
    http://www.vim.org/scripts/scrip­t.php?script_id=301
  28. Poslední vývojová verze makra xmledit
    http://github.com/sukima/xmledit/
  29. vim.wikia: Display date-and-time on status line
    http://vim.wikia.com/wiki/Display_date-and-time_on_status_line
  30. vim.wikia: Writing a valid statusline
    http://vim.wikia.com/wiki/Wri­ting_a_valid_statusline
  31. vim.wikia: Statusline tab level ruler
    http://vim.wikia.com/wiki/Sta­tusline_tab_level_ruler
  32. vim.wikia: Switching between different statuslines
    http://vim.wikia.com/wiki/Swit­ching_between_different_sta­tuslines
  33. X Selections, Cut Buffers, and Kill Rings
    http://www.jwz.org/doc/x-cut-and-paste.html
  34. Accessing the system clipboard
    http://vim.wikia.com/wiki/Ac­cessing_the_system_clipbo­ard
  35. xcutsel(1) – Linux man page
    http://linux.die.net/man/1/xcutsel
  36. snipMate : TextMate-style snippets for Vim
    http://www.vim.org/scripts/scrip­t.php?script_id=2540
  37. msanders / snipmate.vim
    https://github.com/msander­s/snipmate.vim
  38. snipMate.vim Introductory Screencast
    http://vimeo.com/3535418
  39. Clewn home page
    http://clewn.sourceforge.net/
  40. How to connect vim with gdb – using clewn
    http://chunhao.net/blog/how-to-connect-vim-with-gdb-using-clewn
  41. yavdb : Yet Another (Generic) Vim Debugger Integration
    http://www.vim.org/scripts/scrip­t.php?script_id=1954
  42. Vim home page
    http://www.vim.org/
  43. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  44. 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/
  45. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  46. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  47. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  48. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  49. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  50. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  51. 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
  52. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318

Autor článku

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