Obsah
1. Užitečné skripty a pluginy pro textový editor Vim (2.část)
4. Další příkazy nabízené pluginem fugitive
8. Klávesové zkratky pluginu NERD Tree
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/script.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/script.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:
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
- Vim Essential Plugin: NERD Tree
http://code.tutsplus.com/tutorials/vim-essential-plugin-nerdtree–net-19692 - The NERD tree : A tree explorer plugin for navigating the filesystem
http://vim.sourceforge.net/scripts/script.php?script_id=1658 - NERD Tree Guide
http://usevim.com/2012/07/18/nerdtree/ - vcscommand.vim : CVS/SVN/SVK/git/hg/bzr integration plugin
http://www.vim.org/scripts/script.php?script_id=90 - vcscommand na GitHubu
https://github.com/vim-scripts/vcscommand.vim - Popis skriptu Vim Pathogen
http://www.vim.org/scripts/script.php?script_id=2332 - Poslední verze skriptu Vim Pathogen
https://tpo.pe/pathogen.vim - Nejlepší pluginy pro Vim
http://vimawesome.com/ - Nejlepší pluginy pro Vim
http://www.vim.org/scripts/script_search_results.php?order_by=rating - Vim-airline na GitHubu
https://github.com/bling/vim-airline - Vim-airline na www.vim.org
http://www.vim.org/scripts/download_script.php?src_id=22726 - Vim-fugitive na GitHubu
https://github.com/tpope/vim-fugitive - Vim-fugitive na www.vim.org
http://www.vim.org/scripts/script.php?script_id=2975 - Textový editor Vim jako IDE (seriál)
http://www.root.cz/clanky/textovy-editor-vim-jako-ide/ - Building Vim
http://vim.wikia.com/wiki/Building_Vim - Getting the Vim source with Mercurial
http://vim.wikia.com/wiki/Getting_the_Vim_source_with_Mercurial - Vim Perl Interface
http://vim.dindinx.net/vim7/html/if_perl.txt.php - Vim Perl Support
http://www.softpanorama.org/Editors/Vimorama/vim_perl_support.shtml - VIM as Python IDE
http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/ - Stack Overflow: VIM: Perl interface: passing a variable to Perl and reading a vim variable from Perl
http://stackoverflow.com/questions/4999902/vim-perl-interface-passing-a-variable-to-perl-and-reading-a-vim-variable-from - Stack Overflow: Getting started with vim scripting with Perl
http://stackoverflow.com/questions/2208618/getting-started-with-vim-scripting-with-perl - Python with a modular IDE (Vim)
http://www.sontek.net/python-with-a-modular-ide-vim - 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/ - vim (man page)
http://www.linux-tutorial.info/modules.php?name=ManPage&sec=1&manpage=vim - 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/ - 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