Textový editor Vim jako IDE

Použití textového editoru Vim ve funkci IDE

V této knize se zaměříme především na ty funkce editoru Vim, které mohou dobře posloužit vývojářům a navíc si ještě popíšeme některé externí nástroje, které lze současně v Vimem použít. Popis jednotlivých funkcí bude poměrně stručný, protože další informace lze najít přímo v nápovědě Vimu či v manuálových stránkách k externím nástrojům (cílem knihy je především upozornit na to, že Vim dané funkce skutečně obsahuje).

Obrázek 1: Úvodní obrazovka textového editoru Vim (přesněji řečeno verze Vimu přeloženého s podporou GTK2 a spuštěného s volbou vim -g).

Dále popsané nástroje využijí především vývojáři vytvářející aplikace v programovacích jazycích C a C++, i když většina dále popsaných funkcí není omezena pouze na tyto programovací jazyky. Práce vývojáře samozřejmě nespočívá pouze v psaní nového zdrojového kódu (ta většinou zabere pouze zlomek času programátora), ale především v úpravách stávajícího kódu, orientaci v obvykle rozsáhlejším projektu s mnoha zdrojovými kódy, porovnávání různých verzí zdrojových textů, překladu programů, opravy chyb při překladu a v neposlední řadě i v ladění aplikace v případě, že se překlad konečně podařil :-) V některých případech taktéž musí vývojáři pracovat s binárními soubory, i když dnes se již nejedná o tak častou činnost, jako tomu bylo v minulosti. Prakticky všechny výše popsané operace lze provádět přímo ve Vimu, přičemž některé z těchto operací – především se jedná o navigaci v projektu, editaci binárních souborů a taktéž o ladění programů – vyžadují spolupráci s externími nástroji, s nimiž Vim dokáže efektivně komunikovat.

Obrázek 2: Zobrazení seznamu všech chyb generovaných při překladu projektu pomocí nakonfigurovaného překladače (například gcc) či pomocného nástroje pro překlad (make). Povšimněte si, že si Vim pamatuje nejenom číslo řádku, na kterém překladač nahlásil chybu, ale i jméno příslušného zdrojového souboru. Způsob použití tohoto nástroje si popíšeme příště.

Poznámka: s ovladatelností a naučitelností Vimu to ve skutečnosti není tak špatné :-)

Změna fontu a řádkování při použití Vimu s GUI

Před popisem vlastních „programátorských“ nástrojů si řekneme, jakým způsobem je možné nastavit font vhodný pro editaci zdrojových kódů. Pokud je Vim spouštěn z terminálu bez použití volby -g, spustí se přímo v okně terminálu, tj. je použit font zvolený pro daný terminál. Ovšem pokud je Vim spuštěn příkazem gvim, popř. vim -g, otevře se editační plocha v samostatném okně, což s sebou přináší i další výhody (například konfigurovatelnou myš, možnost mapování kláves, které by v terminálu nebylo možné použít atd.). Pro gvim lze font nastavit přímo v konfiguračním souboru .vimrc nebo .gvimrc následujícím způsobem:

:set guifont=DejaVu\ Sans\ Mono\ 12

Povšimněte si způsobu zápisu mezer. gvim taktéž umožňuje zvolit si font i jeho velikost pomocí interaktivního dialogu; postačuje v příkazovém režimu napsat následující příkaz:

:set guifont=*

Poznámka: pokud vyžadujete menší nebo naopak větší mezeru mezi jednotlivými řádky, lze použít volbu:

:set linespace=počet_pixelů

Implicitní hodnota je nula, nastavit lze jak kladné číslo (zvětšení mezery), tak i číslo záporné (zmenšení mezery, pozor na slití řádků dohromady!).

Obrázek 3: Nastavení fontu v případě, že je textový editor Vim přeložen s podporou grafického uživatelského rozhraní (editor tedy neběží v terminálu, ale v samostatném okně, které může v případě potřeby obsahovat i menu, záložky a posuvné lišty – scrollbary).

Zobrazení čísel řádků, zvýraznění řídicích znaků, zalamování řádků

Při editaci různých zdrojových textů nebo konfiguračních souborů se vyskytnou situace, v nichž je nutné zjistit resp. zobrazit čísla programových řádků. V některých případech může dostačovat zobrazení čísla řádku, na kterém se v daném okamžiku nachází textový kurzor. Číslo řádku a současně i číslo sloupce, na němž je umístěn kurzor, se většinou zobrazuje na takzvaném pravítku (ruler) v pravé dolní části okna dokumentu. Nejdříve je zobrazeno číslo textového řádku, po něm číslo sloupce následované relativní pozicí v souboru zadané v procentech (popř. se namísto procent zobrazují zprávy Top, Bot či All). Pokud pravítko není zobrazeno, může to znamenat, že se editor nachází v takzvaném režimu kompatibility s původním starodávným editorem vi. Režim kompatibility lze snadno vypnout, ať již přímo v příkazovém režimu, tak i v konfiguračních souborech .vimrc/.gvimrc, které Vim standardně hledá v domácím adresáři (na Windows se jedná o soubory _vimrc a _gvimrc):

:set nocompatible

V případě, že ani po zadání tohoto příkazu není pravítko zobrazeno a příkaz :set compatible? vrací text nocompatible, můžete využít příkazy:

:set ruler
:set statusline=

První příkaz zapne použití pravítka, druhý příkaz (pro jistotu) nastaví implicitní tvar informací zobrazených na pravítku (viz též :help statusline). Občas nastanou situace, kdy by bylo vhodné si zobrazit čísla všech řádků (jedná se o čísla fyzických řádků, ne zalomených obrazovkových řádků). I v tomto případě nabízí Vim snadné řešení:

:set number

popř. pro ty línější z nás:

:se nu

Obrázek 4: Zobrazení čísel řádků ve zdrojovém souboru pomocí volby :set number

V závislosti na typu editovaného souboru je možné přepínat mezi různými režimy zalamování řádků:

:set wrap        " pouze vizuální zalamování (do souborů se nevkládá CR)
:set nowrap      " vypnutí vizuálního zalamování
:set linebreak   " vizuální zalamování na hranicích slov (vhodné pro texty, méně pro zdrojové kódy)
:set nolinebreak " vypnutí vizuálního zalamování na hranicích slov
:set tw=xxx      " automatické zalamování na xxx sloupci (vkládá se CR)

Další v některých případech užitečnou volbou je zobrazení běžně neviditelných řídicích znaků, především znaku pro konec řádku a znaku tabulátoru. Pro zobrazení těchto znaků lze využít následující příkaz:

:set list

který znaky tabulátoru zobrazí jako ^I a konec řádku jako $. Tento režim zobrazení se někdy využívá při editaci souborů Makefile, v nichž je z historických důvodů rozlišován tabulátor od mezer. Režim lze taktéž využít při hledání přebytečných mezer na konci řádků, které vznikají například při kopii textu mezi terminálem či webovou stránkou a textovým editorem. Malá nápověda – přebytečné mezery na koncích řádků je možné odstranit například touto substitucí (zadávanou opět v příkazovém režimu):

%s/ \+$//g

Volba :set list sice koliduje s volbou :set linebreak, ovšem v naprosté většině případů se tato druhá volba při editaci zdrojových kódů stejně nepoužívá.

Obrázek 5: Zobrazení řídicích znaků ve zdrojovém souboru pomocí volby :set list.

Zvýraznění tabulátorů, záměna tabulátorů za mezery a naopak

O základním způsobu zvýraznění znaku tabulátoru jsme se již stručně zmínili v předchozí kapitole, ovšem řešení nabízené volbou :set list nemusí vždy vyhovovat v každé situaci, především z toho důvodu, že se celý text na obrazovce po zadání této volby vizuálně přeformátuje (zvláště nepříjemné je to v situaci, kdy uživatelé kombinují odsazení pomocí mezer s odsazením s využitím tabulátorů). Ovšem i v tomto případě Vim nabízí alternativní řešení, které spočívá ve využití interního engine používaného při obarvovaní textu na základě syntaktické (spíše však pouze jednodušší lexikální) analýzy textů. V konfiguračním souboru .(g)vimrc nebo v příkazovém režimu postačuje vytvořit nová pojmenovaná pravidla a posléze těmto pravidlům přiřadit libovolnou barvu pozadí (barvu popředí netřeba nastavovat, protože tabulátor se zobrazuje jako několik mezer).

Obrázek 6: Tabulátory se v tomto zdrojovém souboru zobrazují jako mezery, volba tabstop má hodnotu 4.

Následující čtveřice příkazů zkopírovaná z mého konfiguračního souboru .vimrc nastaví světlezelenou barvu pozadí pro jeden znak tabulátoru a světle červenou barvu pozadí pro dva za sebou zapsané tabulátory. Barva pozadí je nastavena jak pro běžný terminál, tak i pro případ, že je textový editor Vim spuštěn pomocí příkazů gvim nebo vim -g, tedy tak, aby využíval vlastní okno s GUI:

syn match Tab "\t"
syn match Tab2 "\t\t"
hi def Tab  ctermbg=lightgreen guibg=#e0ffe0
hi def Tab2 ctermbg=lightred guibg=#ffe0e0

Samozřejmě je možné si zvýraznit pouze libovolně dlouhou sekvenci tabulátorů jednou barvou, tj. odstranit pravidlo Tab2, popř. si stejným způsobem vytvořit pravidla pro delší sekvence – vše záleží na požadavcích programátora.

Obrázek 7: Tabulátory se v tomto zdrojovém souboru zobrazují jako mezery, volba tabstop má hodnotu 8.

S tabulačními zarážkami vkládanými do zdrojových textů mohou nastat různé problémy, především na projektech, v nichž jsou textové soubory sdíleny mezi více vývojáři používajícími různé textové editory a IDE (přesněji řečeno různá nastavení těchto nástrojů). Pokud se pracuje se zdrojovým textem vytvořeným v editoru s nastavenou jinou „délkou“ tabulační zarážky, je možné Vim jednoduše překonfigurovat následující volbou, v níž se za xxx doplní příslušný sloupec, na němž má být tabulační zarážka umístěna (většinou se používá hodnota 4 nebo 8):

:set tabstop=xxx

Mnozí vývojáři by se nejraději všech znaků tabulátoru ve zdrojových textech zbavili nadobro (viz též nekonečné flamewar na toto téma vycházející pravděpodobně z Wadlerova zákona), což lze ve Vimu snadno provést. Nejprve je vhodné nastavit vhodnou hodnotu tabstop (viz odstavec výše) a poté provést sekvenci příkazů:

:set expandtab
:retab

Poznámka: tyto příkazy nepoužívejte na soubory Makefile, neb lučebník by se mohl dožít nemilého překvapení.

Poznámka 2: zpětný převod mezer na tabulátory lze taktéž provést, ovšem u příkazu retab se musí na jeho konec zapsat vykřičník:

:set tabstop=4
:set noexpandtab
:retab!

Obrázek 8: Zvýraznění tabulátorů pomocí změny barvy pozadí.

Navigace ve zdrojovém kódu

Konečně se dostáváme k zajímavějším technikám, které textový editor Vim vývojářům nabízí. Pro lepší orientaci v rozsáhlejším projektu lze využít takzvané soubory značek (tags), které jsou generované externím nástrojem ctags (http://ctags.sourceforge.net/), jenž dokáže rozpoznat celou řadu programovacích jazyků, samozřejmě včetně klasického céčka a C++. Pokud se tento nástroj spustí v adresáři se zdrojovými kódy příkazem:

ctags

popř. pro projekt obsahující zdrojové soubory umístěné v podadresářích příkazem:

ctags -R

vygeneruje se v aktuálním adresáři (což by měl být hlavní adresář se zdrojovými kódy) textový soubor nazvaný tags se speciálním formátem, který obsahuje jména identifikátorů ve zdrojovém programu a výraz, jenž lze použít pro nalezení deklarace tohoto identifikátoru (konkrétní podoba tohoto souboru nás většinou nemusí zajímat, protože se jedná o soubor automaticky zpracovávaný Vimem, popř. i dalšími nástroji). Identifikátorem jsou zde myšleny například jména funkcí, jména struktur či datových typů, makra atd. Pokud vývojář ve zdrojovém textu uvidí například volání neznámé funkce, může použít jeden z následujících příkazů pro přeskok na deklaraci této funkce:

#

Příkaz

Poznámka

1

:tag jméno funkce

lze zadat i regulárním výrazem

2

g+Levé tlačítko myši

nefunkční v terminálu

3

Ctrl+Levé tlačítko myši

nefunkční v terminálu

4

Ctrl+]

ve vizuálním režimu podobné :tag

Obrázek 9: Nastavení kurzoru nad název funkce.

Na první pohled by se mohlo zdát, že po použití jednoho z výše uvedených příkazů se programátor nenávratně ztratí v haldě zdrojových kódů a už nenajde cestu zpět. Ve skutečnosti se však při skoku na deklaraci uloží původní pozice kurzoru do interního zásobníku, takže je návrat velmi snadný – poslouží klávesová zkratka CTRL+T. Pro výpis celého zásobníku se používá příkaz:

:tags

Aktuální položka v tomto zásobníku je označena znakem >

Obrázek 10: Po stisku klávesové zkratky Ctrl+[ se přejde na definici funkce.

Poznámka: zcela stejný způsob navigace mezi množstvím strukturovaných textových souborů používá i vestavěný systém nápovědy ve Vimu spuštěný příkazem :help, popř. :help jméno_příkazu. Důvod je jednoduchý – v adresáři s nápovědou (například se může jednat o adresář /usr/share/vim/vim72/doc) je mj. uložen i soubor tags, který spolu s vlastním formátem souborů s nápovědou zaručuje skoky na její jednotlivá témata.

Práce s manuálovými stránkami

Při programování v céčku či C++ se samozřejmě často volají i funkce ze standardních knihoven, popř. z dalších knihoven nainstalovaných v systému. Čistě teoreticky je možné vytvořit si soubor tags i pro tyto knihovny nebo pro jejich hlavičkové soubory pomocí volby:

ctags -R /usr/lib/include

což však přináší poměrně velké problémy, protože vygenerovaný soubor tags je obrovský (jeho velikost hravě překračuje jeden gigabajt) a práce s ním je pomalá a mnohdy zcela nemožná. Ve skutečnosti však většinou není nutné, aby programátor viděl přímo implementace (těla) všech funkcí ze standardních knihoven, proto je možné využít jiný nástroj Vimu – jedná se o možnost zobrazení manuálové stránky pro identifikátor, který se nachází pod textovým kurzorem – kurzor postačuje přemístit na identifikátor a v normálním režimu stlačit klávesovou kombinaci Shift+K (tj. velké písmeno K). K funkcím ze standardní knihovny jsou manuálové stránky dostupné, postačuje je pouze nainstalovat z balíčku pojmenovaného man-pages, man-pages-dev, manpages-dev apod. Ve Fedoře nebo RHELu je možné tento balíček nainstalovat následujícím příkazem:

sudo yum install man-pages

Na Ubuntu by měl pracovat tento příkaz:

sudo apt-get install manpages-dev

Obrázek 11: Výpis tagů (značek) uložených na zásobníku.

Pokud je textový editor Vim spuštěn v terminálu, je při zobrazení manuálové stránky zavolán příkaz man, takže se při prohlížení mohou použít všechny klávesové zkratky této aplikace; ovšem v gvimu (vim -g) se při zobrazení manuálové stránky pouze volají externí filtry, které stránku naformátují a v okně editoru se zobrazí standardní výstup těchto filtrů. Z tohoto důvodu je dostupných pouze několik klávesových zkratek použitelných při prohlížení dokumentace.

Funkci příkazu Shift+K lze snadno upravit nastavením parametru keywordprg, například následujícím způsobem:

:set keywordprg=info

Obrázek 12: Vyvolání manuálové stránky přímo z Vimu pomocí klávesy K.

Porovnání zdrojových kódů, synchronizace mezi dvěma soubory

V poměrně velkém množství případů se programátoři dostanou do situace, kdy potřebují porovnat a popřípadě i synchronizovat dvě různé verze téhož souboru. Může se například jednat o zdrojový kód, konfigurační soubory, SQL skripty, soubory s dokumentací atd. Pro tyto účely lze použít externí utilitu diff a pracovat s daty vygenerovanými touto aplikací, ovšem pro synchronizaci dvou souborů (řízenou vývojářem) je mnohdy výhodnější použít přímo interní nástroj zabudovaný do Vimu. Pokud se tento textový editor spustí s parametrem -d, očekávají se za tímto parametrem jména dvou souborů pro porovnání, popř. jméno souboru a jméno adresáře, v němž se nachází soubor stejného jména:

vim -d test_old.c test_new.c
vim -d test.c ../test-sources/

V obou případech textový editor Vim oba soubory skutečně načte do dvojice bufferů, ovšem režim zobrazení se změní takovým způsobem, že se pomocí různých barev zvýrazní ty části souborů, které jsou odlišné. Navíc je možné delší části, jež jsou v obou souborech stejné, „zabalit“ (klávesová zkratka zc).

Obrázek 13: Porovnávání dvou souborů při vertikálním rozdělení oken. Toto rozdělení je vhodné použít v případě, že se jedná o zdrojové soubory s krátkými řádky, popř. pokud máte širokoúhlý monitor.

Barevné zvýraznění změn je sice pěkná a užitečná vlastnost, ovšem to není zdaleka vše, co Vim v „režimu diff“ programátorům nabízí. V tomto režimu jsou totiž k dispozici některé nové příkazy určené pro řízenou synchronizaci mezi soubory. Mezi tyto příkazy patří především:

Příkaz

Význam

[c

skok na začátek předchozího bloku se změnami

]c

skok na začátek následujícího bloku se změnami

dp

pokud se kurzor nachází na řádcích, které se v obou souborech odlišují, je změna z aktuálního souboru přenesena do souboru druhého

do

opak předchozího příkazu – získání změny z druhého souboru a přenesení této změny do souboru aktuálního (tj. do souboru, v němž se nachází textový kurzor)

:diffupdate

tento příkaz provede nové vyhodnocení rozdílů mezi oběma soubory, vhodné v případech, kdy se oba buffery rozsynchronizují

Příkazy dp a do lze použít i ve chvíli, kdy je vybraný blok textu. V tomto případě se změna aplikuje pouze na vybrané řádky, nikoli na celý blok změn.

Obrázek 14: Porovnávání dvou souborů při horizontálním rozdělení oken, které je vhodné využít v případě, že porovnávané zdrojové kódy (nebo jiné texty) obsahují dlouhé řádky.

Vim pracující jako hexa editor?

Poslední pomůckou, kterou si dnes ukážeme, je způsob editace binárních souborů. Textový editor Vim sice není přímo určen pro editaci binárních dat, ovšem v kombinaci s externím nástrojem xxd ho lze využít jako hexa editor, protože xxd pracuje jako filtr převádějící binární data na jejich hexadecimální, osmičkovou či binární podobu a dokáže provést i zpětný převod. Pokud se při zavolání xxd použije volba -g 1, bude na standardní výstup vytištěn transformovaný obsah souboru rozdělený na jednotlivé bajty. Každý vytištěný řádek je rozdělený na tři části: adresu prvního bajtu na řádku, šestnácti hexadecimálních čísel reprezentujících jednotlivé bajty a sadu šestnácti znaků z původního souboru (počet bajtů/znaků lze měnit, šestnáct je však historicky nejpoužívanější hodnota); viz též následující výpis „hexa“ podoby bajtkódu jednoduché testovací Javovské třídy:

0000000: ca fe ba be 00 00 00 32 00 0f 0a 00 03 00 0c 07  .......2........
0000010: 00 0d 07 00 0e 01 00 06 3c 69 6e 69 74 3e 01 00  ........<init>..
0000020: 03 28 29 56 01 00 04 43 6f 64 65 01 00 0f 4c 69  .()V...Code...Li
0000030: 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65 01 00 04  neNumberTable...
0000040: 6d 61 69 6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c  main...([Ljava/l
0000050: 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a  ang/String;)V...
0000060: 53 6f 75 72 63 65 46 69 6c 65 01 00 09 54 65 73  SourceFile...Tes
0000070: 74 2e 6a 61 76 61 0c 00 04 00 05 01 00 04 54 65  t.java........Te
0000080: 73 74 01 00 10 6a 61 76 61 2f 6c 61 6e 67 2f 4f  st...java/lang/O
0000090: 62 6a 65 63 74 00 21 00 02 00 03 00 00 00 00 00  bject.!.........
00000a0: 02 00 01 00 04 00 05 00 01 00 06 00 00 00 1d 00  ................
00000b0: 01 00 01 00 00 00 05 2a b7 00 01 b1 00 00 00 01  .......*........
00000c0: 00 07 00 00 00 06 00 01 00 00 00 01 00 09 00 08  ................
00000d0: 00 09 00 01 00 06 00 00 00 19 00 00 00 01 00 00  ................
00000e0: 00 01 b1 00 00 00 01 00 07 00 00 00 06 00 01 00  ................
00000f0: 00 00 03 00 01 00 0a 00 00 00 02 00 0b           .............

Obrázek 15: Textový editor Vim při zobrazení binárního souboru po jeho filtraci přes externí nástroj xxd. Pokud je Vim správně nakonfigurován, dokáže při ukládání souboru provést automatickou zpětnou filtraci z hexa formátu do binárního tvaru. Mimochodem – dokáže někdo uhodnout, jaký binární soubor je editovaný?

Ruční použití filtru xxd s přesměrováním standardního výstupu je však zbytečně složité a vzhledem k tomu, že si my uživatelé Vimu rádi věci ulehčíme (jinak by stačil Notepad :-), je možné využít automatické příkazy volané při načítání, popř. při ukládání souborů. Následující sekvence příkazů zapsaná do konfiguračního souboru .vimrc zajistí, že se při načítání souborů *.class tyto soubory automaticky převedou do hexa podoby a při ukládání se opět transformují do původní podoby binární:

" vim -b : edit binary using xxd-format!
augroup Binary_Java_Class
au!
au BufReadPre   *.class let &bin=1
au BufReadPost  *.class if &bin | %!xxd -g1
au BufReadPost  *.class set ft=xxd | endif
au BufWritePre  *.class if &bin | %!xxd -g1 -r
au BufWritePre  *.class endif
au BufWritePost *.class if &bin | %!xxd -g1
au BufWritePost *.class set nomod | endif
augroup END

Vim propojený s překladači

Použití textového editoru Vim ve funkci IDE

Ve druhé kapitole se zaměříme na způsob překladu programů s následným procházením seznamem chyb vygenerovaných překladačem a/nebo programem pro řízení překladu (make, ant). Dále si ukážeme způsob využití velmi užitečného externího nástroje cscope i některých přídavných modulů (pluginů), jež mohou práci programátorů zpříjemnit a současně i urychlit. Jedná se o modul NERD Tree (operace se soubory a adresáři, vhodné zejména při práci na větším projektu s množstvím různých souborů), dále o modul Taglist (vylepšená práce se značkami), modul c.vim (spousta užitečných maker pro céčkaře a programátory v C++) a konečně o přídavný modul JavaBrowser (nástroj vhodný naopak pro Javisty). Tyto moduly jsou psány v interním skriptovacím jazyce textového editoru Vim, který se postupně vyvíjel od jazyka umožňujícího prostý zápis sekvence příkazů až po jeho dnešní podobu, kdy se jedná o prakticky plnohodnotný programovací jazyk „Algolské“ větve, tj. o jazyk s proměnnými, funkcemi, podmínkami i programovými smyčkami.

Obrázek 1: Textový editor Vim se spuštěným přídavným modulem NERD Tree popsaným v páté kapitole.

Jako malou rozcvičku si nejprve ukážeme, jak je možné zapisovat některé ASCII znaky využívané v různých programovacích jazycích na klávesnici s českým rozložením kláves, aniž by se bylo nutné přepínat na anglické rozložení, popř. aniž by bylo nutné používat přepínač AltGr. Jak sami uvidíte, není toto řešení vhodné pro zápis celých programů (tam se již skutečně vyplatí přepnutí na anglické rozložení kláves), ovšem například při psaní dokumentace, v níž se občas vyskytuje nějaký „exotičtější“ ASCII znak se může hodit (příkladem může být například dokument psaný v TeXu či LaTeXu s vloženými příkazy pro sazbu matematických vzorců a tabulek). Řešení spočívá v několika vimovských příkazech, které mapují dvojici znaků s akcenty na ASCII znak, který se na stejné klávese nachází v případě anglického rozložení klávesnice. Vzhledem k tomu, že se v některých českých slovech používá dvojice „šš“, je pro alternativní funkci nutné tento znak napsat třikrát za sebou, což je však stále ještě rychlejší, než přepnutí rozložení klávesnice nebo použití AltGr:

noremap ěě @
noremap ššš #
noremap čč $
noremap řř %
noremap žž ^
noremap ýý &
noremap áá *
noremap íí (
noremap éé )
noremap úú {
noremap ůů ;
inoremap ěě @
inoremap ššš #
inoremap čč $
inoremap řř %
inoremap žž ^
inoremap ýý &
inoremap áá *
inoremap íí (
inoremap éé )
inoremap úú {
inoremap ůů ;
inoremap §§ '

Obrázek 2: Využití malého a užitečného triku – editace souboru obsahujícího nové klávesové zkratky (mapování) s následným použitím příkazu :so % nebo :source %, který načte a spustí obsah aktuálního souboru. Znak procenta totiž vždy obsahuje jméno aktuálně editovaného souboru, čehož lze využít i v dalších funkcích; jen pro příklad :map <F9;> :!gcc -c %<cr>

Poznámka: osobně používám v normálním režimu mapování dvojice znaků „ůů“ na znak dvojtečky a nikoli středníku, protože dvojtečkou se – jak jistě všichni uživatelé tohoto textového editoru vědí – provádí přepnutí z normálního režimu do režimu příkazového.

Jak lze ve Vimu lépe využít klávesu Caps Lock?

Funkce, která bude vysvětlena v této kapitole se sice týká přímo operačního systému (či přesněji řečeno jeho uživatelského rozhraní), ovšem do jisté míry souvisí s Vimem, protože dokáže přemapovat funkci klávesy Esc, aniž by bylo nutné si kupovat specializovanou hackerskou klávesnici, která tuto klávesu fyzicky umisťuje blíže k základnímu postavení prstů při psaní. Některým uživatelům nevyhovuje, že se v textovém editoru Vim pro přepínání z vkládacího režimu (insert mode) nebo přepisovacího režimu (overwrite mode) do režimu normálního používá klávesa Esc, která je umístěna ve velké vzdálenosti od základní polohy prstů při psaní. Kód klávesy Esc lze sice nahradit klávesovou kombinací Ctrl+[, ovšem to je kvůli neergonomickému umístění klávesy Control (Ctrl) na standardních klávesnicích PC/AT mnohdy ještě horší řešení (klávesnice používané u jiných typů počítačů mají či měly klávesu Esc umístěnou nalevo od klávesy A).

Obrázek 3: Zobrazení všech aktuálně nastavených mapování pomocí prostého příkazu :map zapsaného bez dalších parametrů.

Klávesu Esc je samozřejmě možné namapovat na libovolnou kombinaci kláves, ale nabízí se lepší řešení – použití v podstatě nevyužívané klávesy/přepínače Caps Lock, kterou mnozí uživatelé považují za zcela zbytečnou, podobně jako Scroll Lock :-) Jediná potíž je v tom, že kód této klávesy je zachycován systémem, takže není možné použít příkaz map ve Vimu. Nejjednodušší řešení tohoto problému – alespoň pro uživatele používajícího X Window – spočívá ve spuštění příkazu:

xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'

Obrázek 4: Funkci klávesy Caps Lock je možné v prostředí Gnome změnit v dialogovém okně konfiguračního programu gnome-keyboard-properties pod volbou Layout options.

Tento příkaz je možné spustit přímo z inicializačního skriptu pro X nebo okenního manažeru (já jsem si ho například umístil do ~/fluxbox/startup). Další způsoby přemapování klávesy Esc na klávesu Caps Lock, které jsou vhodné pro Linuxovou konzoli, popř. pro MS Windows, lze najít na stránce http://vim.wikia.com/wiki/VimTip166. Pokud vyžadujete, aby se klávesa Esc a/nebo Caps Lock chovala jako přepínač mezi vkládacím režimem a režimem normálním, je řešení velmi jednoduché – použije se příkaz pro mapování:

:map <Esc> i

Poznámka (varování): na duplicitní funkci klávesy Caps Lock si lze kupodivu zvyknout velmi rychle, horší je to však při přechodu na počítač, který toto mapování nemá nastavené :-)

Obrázek 5: Volba pro přepnutí klávesy Caps Lock na funkci klávesy Esc je v tomto dialogu zobrazena na spodním řádku výběru.

Překlad programů a procházení chybovými hlášeními překladače

Textový editor Vim obsahuje již od svých prvních verzí podporu pro volání externích překladačů s následnou analýzou chybových hlášení, které tyto překladače vypisují na standardní či chybový výstup. Vim tato hlášení analyzuje a následně si do své interní struktury uloží (zjednodušeně řečeno) seznam trojic: jméno souboru s chybou, číslo řádku s chybou a chybové hlášení. Uživatel-programátor může po spuštění překladu následně použít několik příkazů umožňujících přeskakovat kurzorem na jednotlivé řádky s chybou se současným zobrazeních chybové zprávy. Mezi tyto příkazy patří zejména:

Příkaz

Význam

:make

spuštění překladu

:clist

výpis všech chybových hlášení

:cfirst

přechod na první chybu

:clast

přechod na poslední chybu

:cp

přechod na předchozí chybu

:cn

přechod na následující chybu

Obrázek 6: Příklad použití příkazu :clist pro výpis všech chybových hlášení překladače.

Pro příkaz :make je důležité nastavení parametru makeprg. Ten může obsahovat jak samotný název překladače či utility použité pro překlad (make, ant), tak i například již zmíněný znak % znamenající název aktuálně editovaného souboru (pozor na uvozování mezer či znaku roury!):

:set makeprg=javac\ %

Analýza chybových hlášení je prováděna na základě hodnoty konfiguračního parametru errorformat, který dokáže zpracovat (parsovat) jak běžná čísla řádků a sloupců s chybou, tak i například formát používaný překladačem javac, který pod znak s chybou umístí znak ^ (šipka nahoru).

Obrázek 7: Použití příkazu :cn pro skok na řádek s následující chybou a současně pro výpis chybového hlášení.

Volání překladače a procházení chybovými hlášeními generovanými překladačem je velmi častá činnost. Z tohoto důvodu je vhodné, aby všechny potřebné příkazy byly namapovány například na funkční klávesy, které Vim standardně nevyužívá. Pokud si následující sekvenci příkazů vložíte do svého konfiguračního souboru .vimrc, bude volání překladače i další činnosti prakticky stejně jednoduché, jako je tomu u většiny integrovaných vývojových prostředí. Další funkční klávesy, především ty z prostředního funkčního bloku F5, F6, F7, F8, si necháme volné například pro urychlení ladění programů. Na sekvenci příkazů zobrazených pod tímto odstavcem si povšimněte, že při stlačení klávesy F9 dojde nejprve k uložení právě editovaného souboru a posléze k překladu projektu – většinou je totiž překlad bez uložení obsahu editovaného souboru spouštěn spíše omylem (na což dokáže většina integrovaných vývojových prostředí upozornit):

" uložení aktuálně editovaného souboru
map <F2> :w<cr>

" skok na předchozí chybové hlášení
map <F3> :cp<cr>

" skok na následující chybové hlášení
map <F4> :cn<cr>

" uložení aktuálně editovaného souboru a spuštění překladu
map <F9> :w<cr>:make<cr>

" výpis všech chybových hlášení překladače
map <F10> :cl<cr><cr>

Obrázek 8: Nastavení externího příkazu zavolaného po zápisu :make.

Využití externího nástroje cscope

V první kapitole jsme se zmínili i o způsobu použití takzvaných seznamů značek (tags) při orientaci v souborech, z nichž se skládá projekt. Ovšem i přes svoje nesporné kladné stránky jsou seznamy značek poměrně jednoúčelovou záležitostí, protože vlastně obsahují pouze místa výskytu různých identifikátorů v projektu bez dalších informací (zda se například jedná o funkci, kdy je tato funkce volaná atd.). Vzhledem k tomu, že orientace ve větších projektech je pro programátora poměrně důležitá, vznikla v minulosti pro programovací jazyk C velmi užitečná utilita nazvaná cscope. Jedná se o utilitu, která po svém zavolání vytvoří soubor s databází obsahující poměrně podrobné informace o celém projektu a následně uživateli nabídne různé možnosti vyhledávání různých identifikátorů v projektu. Ovšem celoobrazovkové rozhraní programu cscope není příliš vhodné pro kooperaci s Vimem, proto Vim využívá jeho řádkové rozhraní, které si v následujícím textu stručně popíšeme.

Obrázek 9: Nastavení parseru pro chybové hlášení většinou není nutné ručně provádět, protože Vim již ve své instalaci množství těchto nastavení obsahuje (popř. se jimi lze inspirovat).

Nejprve je zapotřebí v adresáři s projektem poprvé spustit utilitu cscope, která si vytvoří svou databázi, podobně jako minule popsaná utilita ctags. Vše lze samozřejmě provést přímo z Vimu:

:! cscope -Rbq

Následně je nutné svázat databázi vygenerovanou programem cscope s Vimem (ve skutečnosti se na pozadí spustí nová instance této utility, s níž Vim komunikuje):

:cscope add cscope.out

popř. též zkráceně:

:cs add cscope.out

Obrázek 10: Napojení Vimu na databázi vytvořenou utilitou cscope.

Pokud se předchozí příkaz provedl bez chyby, lze již přímo z Vimu použít například následující příkazy:

" výpis propojení mezi Vimem a utilitou cscope
:cs show

" nalezení souboru specifikovaného ve třetím parametru
:cs f f stdio.h

" nalezení textu uvnitř řetězců (nikde jinde)
:cs f t xyzzy

" nalezení definice funkce test (skok na začátek definice)
:cs f g test

" zjištění, které funkce se volají z funkce main
:cs f d main

" zjištění, odkud se volá funkce fclose
:cs f c fclose

Důležité je, že výsledek dotazu se chová jako nový seznam značek (tagů), takže s tímto seznamem lze provádět operace popsané minule.

Obrázek 11: Nalezení všech funkcí, které se volají z funkce png_write().

Přídavný modul „NERD Tree“

Ve druhé kapitole si popíšeme některé zajímavé rozšiřující moduly (pluginy psané ve většině případů přímo ve Vimscriptu), které je možné do textového editoru Vim velmi jednoduše doinstalovat – tato instalace se v naprosté většině případů provádí prostým rozbalením archivu s pluginem do adresáře /usr/share/vim/vimcurrent, popř. do adresáře /usr/local/share/vim. Instalaci lze provést i přímo v domácím adresáři uživatele, takový rozšiřující modul však samozřejmě nebude přístupný ostatním uživatelům počítače (adresáře, kde se hledají skripty lze vypsat příkazem :set runtimepath?). Dále uvedený popis všech rozšiřujících modulů bude poměrně stručný, protože nejdůležitější je (alespoň podle skromného názoru autora) především povědomí o tom, že rozšiřující modul s těmito vlastnostmi skutečně existuje a na které stránce je možné najít archiv s jeho instalací a samozřejmě taktéž dokumentací.

Obrázek 12: Nalezení všech míst v programu, kde je volána funkce fclose().

První dnes zmíněný přídavný modul se jmenuje NERD Tree a informaci o něm lze nalézt na adrese http://www.vim.org/scripts/script.php?script_id=1658. V tomto modulu 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 zobrazuje v samostatném podokně a pro jeho vyvolání se používá příkaz :NERDTree. 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>

Další funkce nabízené tímto modulem lze zobrazit po stlačení klávesy „?“. Za povšimnutí stojí zejména příkaz „go“ sloužící pro prohlížení souborů bez toho, aby kurzor přeskočil do nově vytvořeného bufferu.

Obrázek 13: Textový editor Vim společně s přídavným modulem NERD Tree.

Poznámka: podobnou funkci nabízí i modul netrw, který je přímo součástí distribuce textového editoru Vim. Vstupním modem do tohoto modulu je funkce :Explore (někdy též :HExplore lišící se způsobem zobrazení podokna: vertikální či horizontální dělení). Tuto funkci si lze samozřejmě v případě potřeby taktéž namapovat na klávesovou zkratku:

:map <F11> :Explore<CR>

Přídavný modul „Taglist“

Druhým přídavným modulem, se kterým se dnes seznámíme, je modul nazvaný Taglist, jenž je dostupný na adrese http://www.vim.org/scripts/script.php?script_id=273. Jedná se o poměrně známý a často používaný modul, který zpřehledňuje práci se seznamem značek (tagů), což mj. znamená, že spolupracuje s externím nástrojem ctags, o němž jsme se již zmínili v předchozí kapitole. Práce s tímto modulem je ve skutečnosti velmi jednoduchá – po otevření zdrojového souboru stačí v příkazovém režimu napsat příkaz:

:Tlist

po jehož spuštění se otevře nové okno obsahující v případě céčkového zdrojového kódu seznam maker, proměnných a funkcí, v případě Javovského zdrojového kódu seznam tříd, atributů a metod atd. Tyto seznamy jsou samozřejmě aktivní, tj. je možné rychle přejít na definice všech prvků programu, což je většinou přehlednější, než používání klasických seznamů značek. Tento přídavný modul je samozřejmě možné kombinovat s dalšími přídavnými moduly a vytvořit si tak prostředí co nejvhodnější pro vývoj.

Obrázek 14: Zobrazení stromu s makry, proměnnými a funkcemi.

Druhým důležitým příkazem modulu Taglist je příkaz TlistAddFiles, který se používá v těch případech, kdy se má seznam značek vygenerovat a následně i zobrazit pro více souborů. Pro projekty obsahující zdrojové soubory pouze v jednom adresáři je situace velmi jednoduchá, protože lze použít například tuto sekvenci příkazů:

:TlistAddFiles *.c
:Tlist

V případě, že jsou zdrojové soubory umístěny ve složitější adresářové struktuře, přichází na řadu jiný příkaz:

:TlistAddFilesRecursive .
:Tlist

Obrázek 15: Zobrazení nápovědy k přídavnému modulu Taglist.

Přídavný modul „c.vim“

Třetím přídavným modulem, o němž se dnes zmíníme, je modul nazvaný c.vim, nebo též C/C+±IDE, který lze nalézt na adrese http://vim.sourceforge.net/scripts/script.php?script_id=213. Jedná se o poměrně rozsáhlý modul naprogramovaný Fritzem Menherem, který obsahuje mnoho funkcí sloužících pro urychlení práce programátorů píšících aplikace v programovacích jazycích C a C++. Mezi implementované funkce patří například vkládání různých typů komentářů z připravených šablon, vkládání koster strukturovaných příkazů (podmínek i programových smyček) či často používaných idiomů, práce s dnes velmi populárními snippety (vytváření a vkládání snippetů do programového kódu), podpora pro přímý překlad programu a jeho následného spuštění atd.

Obrázek 16: Do hlavního menu Vimu se po instalaci modulu c.vim přidal další list. Zde je zobrazeno podmenu s možností definice a vkládání snippetů.

Vzhledem k velkému množství funkcí nabízených tímto modulem se při jeho načítání vytváří i samostatné menu obsahující jak všechny příkazy, tak i k nim příslušné klávesové zkratky. Tyto zkratky začínají implicitně znakem zpětného lomítka, ovšem to lze změnit příkazem:

:let maplocalleader=znak

Pokud není menu při startu editoru v grafickém režimu (příkazy gvim či vim -g) zobrazeno, lze použít následující příkaz:

:set guioption+=m

Obrázek 17: Podmenu pro spuštění přeložené aplikace, zavolání linkeru a další podobné činnosti.

Všechny dostupné funkce i jejich klávesové zkratky jsou dostupné na adrese http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf. Stejný soubor je ostatně součástí instalace tohoto přídavného modulu.

Po načtení přídavného modulu c.vim je možné si jeho funkci jednoduše vyzkoušet. Postačuje zadat příkaz:

\i0

Textový editor Vim se následně zeptá na název proměnné a na případné (nepovinné) další parametry počítané programové smyčky for. Pokud například jako odpověď na dotaz zadáme:

xx 10 20 2

Vygeneruje se správně zarovnaný zdrojový kód:

for ( xx = 10; xx < 20; xx += 2 ) {
}

Ovšem při zadání pouhého názvu proměnné:

yy

Dostane vygenerovaná smyčka tvar:

for ( yy = 0; yy < n; yy += 1 ) {
}

Přídavný modul „JavaBrowser“

Zatímco modul popsaný v předchozí kapitole slouží především pro urychlení práce vývojářů tvořících aplikace v programovacích jazycích C či C++, je zde popisovaný modul nazvaný příhodně JavaBrowser určen – což není těžké uhodnout – pro programátory pracující zejména s Javou. Tento modul, který lze získat na adrese http://www.vim.org/scripts/script.php?script_id=588, slouží pro zobrazení stromu obsahujícího třídy a jejich metody i atributy, samozřejmě s rozlišením přístupových práv k metodám i atributům (taktéž se rozlišuje, zda se jedná o statickou metodu=funkci či atribut). Nad tímto stromem je možné provádět podobné operace, jaké jsou dostupné i v běžných integrovaných vývojových prostředích, viz též následující tabulku:

Příkaz

Operace

Enter

přeskok kurzoru na definici metody/atributu

o

dtto, ale otevře se nové okno

+

rozbalení podstromu

–

zabalení podstromu

*

rozbalení celého stromu

x

skrytí či zobrazení okna se zdrojovým kódem

Obrázek 18: Projekt v Javě otevřený ve Vimu se zobrazeným přídavným modulem JavaBrowser.

Funkci pro zobrazení okna se stromem si je možné namapovat na libovolnou klávesovou zkratku, například následující sekvencí příkazů zapsanou do konfiguračního souboru .vimrc:

augroup __java__
au!
au BufRead,BufNewFile *.java noremap <F10> :JavaBrowser<CR>
augroup END

Přídavné moduly je (většinou) možné vzájemně kombinovat, což například znamená, že lze mít v jednom okamžiku zobrazený modul NERD Tree společně s JavaBrowserem – záleží jen na preferencích uživatele a velikosti jeho monitoru :-)

Obrázek 19: Možnosti nastavení barevného schématu JavaBrowseru (o metodách zvýraznění syntaxe si řekneme podrobnější informace v některé z dalších kapitol).

Editace zdrojového kódu

Příkazy určené pro editaci zdrojových kódů

„vi is small, fast, and easy to use. Emacs is huge, slow and easy to use :)“

V předchozí kapitole jsme si kromě dalších informací stručně popsali některé přídavné moduly určené pro zjednodušení a současně i urychlení vývoje v různých programovacích jazycích (ostatně síla Vimu se ukáže právě ve chvíli, kdy se tento textový editor použije pro vývoj projektu, v němž se pracuje s větším množstvím programovacích jazyků a konfiguračních či datových souborů). Ovšem i bez využití přídavných modulů (pluginů) obsahuje samotný Vim poměrně velké množství příkazů využitelných při editaci zdrojových kódů. Některé z těchto příkazů existovaly již v původním editoru vi (dnes je na Linuxu dostupná jeho volná verze nazvaná nvi, která se snaží do co největší míry napodobit původní editor vi, včetně několika chyb, což ovšem jen vypovídá o síle tohoto editoru), ovšem většinu dále popsaných příkazů najdeme až v novějších verzích Vimu.

Obrázek 1: Zdrojový text otevřený v textovém editoru nvi, který se snaží svým chováním do co největší míry napodobit původní textový editor vi.

V následující tabulce jsou vypsány některé příkazy dostupné v normálním režimu, které lze využít při práci se zdrojovými kódy většiny programovacích jazyků:

Příkaz

Mnemotechnická pomůcka

Význam

dab

delete a block

vymazání textu mezi kulatými závorkami včetně závorek

dib

delete inner block

vymazání textu mezi kulatými závorkami bez závorek (ty zůstanou v textu zachovány)

daB

delete a Block

vymazání textu mezi složenými závorkami včetně závorek

diB

delete inner Block

vymazání textu mezi složenými závorkami bez závorek

dat

delete a tag

vymazání textu umístěného v párové značce, včetně otvírací i zavírací značky (platí zejména pro soubory HTML, XHTML a XML)

dit

delete inner tag

vymazání textu umístěného v párové značce, například v odstavci (platí zejména pro soubory HTML, XHTML a XML)

cab

change a block

změna textu mezi kulatými závorkami včetně závorek

cib

change inner block

změna textu mezi kulatými závorkami

caB

change a Block

změna textu mezi složenými závorkami včetně závorek

ciB

change inner Block

změna textu mezi složenými závorkami

%

×

přeskok mezi znaky definovanými volbou matchpairs

=

×

zarovnání textu vybraného libovolnou výběrovou operací

=aB

indent a Block

kombinace operátoru = a výběru bloku mezi {}

>

→

posun textu vybraného libovolnou výběrovou operací doprava o shiftwidth

<

←

posun textu vybraného libovolnou výběrovou operací doleva o shiftwidth

>>

→

posun jediného řádku doprava o hodnotu nastavenou pomocí volby set shiftwidth

<<

←

posun jediného řádku doleva o hodnotu nastavenou pomocí volby set shiftwidth

Obrázek 2: Odsazení části zdrojového textu doprava pomocí příkazu > v případě, že je volba shiftwidth nastavena na hodnotu 4.

Využití příkazu %

V tabulce vypsané v předchozí kapitole byl uveden i zdánlivě primitivní příkaz %, který je však ve skutečnosti velmi užitečný. Tento příkaz je součástí původního textového editoru vi, ovšem pro potřeby Vimu byl v několika ohledech vylepšen. V čem však vlastně spočívá užitečnost tohoto příkazu při editaci zdrojových kódů? Tento příkaz dokáže najít na aktuálně editovaném řádku takzvaný párový znak umístěný na místě kurzoru či napravo od kurzoru a posléze skočí na opačný párový znak. Tento druhý párový znak se může nacházet jak napravo, tak i nalevo od kurzoru, popř. na zcela jiném řádku v editovaném souboru. Chování příkazu % je ukázáno na screenshotu 3 až 5. Vzhledem k tomu, že se jedná o příkaz přesunu kurzoru, lze ho kombinovat s příkazy d, c, > atd.

Obrázek 3: Pozice textového kurzoru před zavoláním příkazu %.

Jako párové znaky jsou většinou nastaveny tři druhy závorek – kulaté závorky (), hranaté závorky [] a složené závorky {}. Ovšem pomocí volby matchpairs lze nastavit i další párové znaky, například ostré závorky <> (v současnosti jsou párové znaky omezeny skutečně na dvojici jednotlivých znaků, v případě potřeby však lze použít velmi užitečný plugin nazvaný matchit, který je součástí distribuce Vimu):

:set matchpairs=(:),[:],{:},<:>

Obrázek 4: Po zadání příkazu % je napravo od kurzoru nalezen první párový znak, kterým je v tomto případě levá složená závorka {. Posléze editor nalezne druhý párový znak (je na řádku 19) a přesune se na něj.

Z předchozího příkladu je patrné, jak se párové znaky zapisují – jsou od sebe odděleny dvojtečkou, přičemž jednotlivé dvojice jsou od sebe odděleny čárkou. Volba matchpairs má ještě jeden význam, a to v souvislosti s volbou showmatch. V případě, že je tato volba zapnuta příkazem:

:set showmatch

tak se při zápisu uzavíracího párového znaku textový kurzor na okamžik (stanovený pomocí matchtime) přemístí na otevírací párový znak, což například zjednodušuje zápis složitějších matematických výrazů, protože Vim se samozřejmě snaží o správné spojení párových znaků i v případě, že je jich ve výrazu zapsáno větší množství, a to v libovolné kombinaci, což je naznačeno níže (zpárované znaky jsou vizuálně spojeny):

#define MAX(a,b) ( (a)>(b) ? (a) : (b) )
|   | | | |    | |   | |   | | |
`---' | `-'    `-'   `-'   `-' |
`------------------------'

Obrázek 5: Opětovné zadání příkazu % způsobí návrat na otevírací složenou závorku {.

Odsazení bloků ve zdrojovém kódu

Dalším příkazem, který je určený především pro editaci zdrojových kódů, je příkaz =, jenž slouží pro zarovnání kódu podle nastavených pravidel. Tento příkaz musí být doplněný některým příkazem pro posun textového kurzoru, popř. příkazem, kterým se specifikuje rozsah platnosti. Například se může jednat o příkazy ab (a block), ib (inner block), aB či iB zmíněné na začátku kapitoly, poměrně často se však taktéž může hodit výběr textu ve výběrovém režimu (příkazy v, V a Ctrl+V) následovaný zadáním příkazu =. Chování příkazu = je ovlivněno především volbou equalprg. Pokud tato volba neobsahuje žádnou hodnotu, tj. po zavolání příkazu:

:set equalprg=

je použit interní algoritmus pro zarovnání či odsazení textu, v opačném případě se zadaná hodnota považuje za jméno externího příkazu, který je zavolán a vybraný text je tomuto příkazu předán přes standardní vstup.

Obrázek 6: Nezformátovaný céčkový zdrojový text.

Pro formátování běžného textu (pokud se tedy nespokojíme s možnostmi formátování s využitím příkazu gq, které jsou poměrně velké) lze použít například externí nástroj (filtr) nazvaný fmt:

:set equalprg=fmt

popř. stejný filtr, ale s předáním konfiguračních parametrů na příkazové řádce:

:set equalprg=fmt\ -t\ -w60

V případě, že konfigurační parametr equalprg neobsahuje žádnou hodnotu, je vybraná část textu formátována interním algoritmem. Těchto algoritmů existuje několik, přičemž výběr jednoho z nich se provádí pomocí voleb smartindent, popř. cindent a taktéž (i když dnes již méně často, než v minulosti) lisp. Pro formátování/odsazování céčkovských zdrojových kódů se většinou používá volba cindent, popř. se volá externí filtr indent.

Obrázek 7: Výsledek příkazu =aB v případě, že je nastavena volba cindent.

Nastavení parametrů shiftwidth a cinoptions

Konfigurace interního algoritmu odsazování vybraného s využitím volby cindent jsou určeny pomocí hodnoty konfiguračního parametru cinoptions, navíc se ještě odsazování řídí parametry shiftwidth a tabstop. Řídicí znaky ovlivňující formátování, které lze do konfiguračního parametru cinoptions dosadit, lze zobrazit přímo ve Vimu pomocí příkazu:

:help cinoptions-values

Některé často používané řídicí znaky jsou vypsány v následující tabulce (za N se dosazuje v některých případech celé číslo, v některých případech i číslo desetinné, v obou případech se jedná o relativní hodnotu vůči shiftwidth):

Řídicí znak

Význam

fN

úroveň posunutí otevírací levé závorky { pod jménem funkce

:N

úroveň odsazení větví case/default v konstrukci switch-case (někdo preferuje, aby se příkazy case umisťovaly přímo pod switch, někdo tyto příkazy raději odsazuje)

=N

odsazení příkazu/příkazů za klíčovým slovem case/default

bN

odsazení příkazu break v konstrukci switch-case

hN

podobné volbě =N, ale platné pro klíčová slova public atd. (C++)

Obrázek 8: Zdrojový kód zformátovaný pomocí příkazu g=G při nastavení konfiguračního parametru shiftwidth na hodnotu 2.

Počet mezer, o něž se interní programové bloky odsadí od levého okraje, se specifikuje konfiguračním parametrem shiftwidth. Rozdíl mezi nastavením:

:set shiftwidth=2

a nastavením:

:set shiftwidth=4

je patrný ze screenshotů číslo 8 a 9.

Obrázek 9: Zdrojový kód zformátovaný pomocí příkazu g=G při nastavení konfiguračního parametru shiftwidth na hodnotu 4.

Poznámka: pokud preferujete automatické přeformátování celého programového bloku ihned po zápisu uzavírací složené závorky }, je možné předefinovat funkci znaku „}“ v režimu vkládání následujícím příkazem:

:imap } }<Esc>=%``a

Tento příkaz zajistí, že se po zápisu znaku „}“ tento znak skutečně vloží do zdrojového kódu, nicméně ihned poté je zavolán příkaz = současně s pohybem kurzoru na začátek bloku (%) a posléze je pomocí příkazu `` (zpětné apostrofy, ne apostrofy přímé) obnovena pozice textového kurzoru v souboru.

Omni completion – nová vlastnost Vimu 7

Další vlastností textového editoru Vim, kterou se dnes budeme zabývat, je technologie nazvaná „omni completion“. Tato technologie, která se ve Vimu objevila až v jeho sedmé verzi, rozšiřuje možnosti automatického doplňování kódu o externí nástroje. Připomeňme si, že Vim nabízí ve vkládacím a přepisovacím režimu klávesovou zkratku Ctrl+P (previous) pro nalezení a doplnění slova nacházejícího se před kurzorem a taktéž zkratku Ctrl+N (next), která slouží ke stejnému účelu, ovšem hledá slovo pro doplnění v textu za kurzorem (pokud je k dispozici více možností, zobrazí se v kontextovém menu).

Obrázek 10: Doplňování kódu pomocí příkazů CTRL+P a CTRL+N.

Ovšem možnosti automatického doplňování kódu jsou daleko větší, textový editor Vim pro ně dokonce nabízí samostatný režim vyvolávaný z vkládacího či přepisovacího režimu klávesovou zkratkou Ctrl+X. Po stlačení této klávesové zkratky se v příkazové řádce objeví řádkové menu s příkazy platnými pro režim doplňování. Všechny dostupné příkazy jsou vypsány v tabulce níže:

#

Příkaz

Význam

1

Ctrl+X Ctrl+L

nalezení a doplnění celého (shodného) řádku, užitečné především v případě editace některých typů konfiguračních souborů

2

Ctrl+X Ctrl+N

doplnění slova, které se nalézá v aktuálně editovaném souboru

3

Ctrl+X Ctrl+K

podobné Ctrl+N, ovšem slova se hledají v souborech specifikovaných pomocí konfiguračního parametru dictionary (jedná se o běžný textový soubor se seznamem slov)

4

Ctrl+X Ctrl+T

podobné Ctrl+T, ovšem slova se hledají v souborech specifikovaných pomocí konfiguračního parametru thesaurus

5

Ctrl+X Ctrl+I

podobné Ctrl+N, ovšem prohledávají se i všechny vkládané (included) soubory

6

Ctrl+X Ctrl+]

vyhledávání v seznamu značek

7

Ctrl+X Ctrl+F

Vážení čtenáři, právě jste dočetli ukázku z knihy Textový editor VIM jako IDE.
Pokud se Vám líbila, celou knihu si můžete zakoupit v našem e-shopu.