Vítám vás u nového seriálu věnovaného báječnému editoru VIM. Jsem dlouholetým spokojeným uživatelem tohoto pořizovače textů, a jak léta plynou, můj .vimrc soubor a .vim adresář se utěšeně zvětšuje. Se slzou v oku vzpomněl jsem si jednoho dne na ty chvíle, kdy obojí bylo prázdné a já se poprvé pustil do boje s konfigurací VIMu. Nostalgické vzpomínky rozjitřily mé tuhé nitro a já si usmyslel, že se podělím se svými skromnými zkušenostmi s čtenáři Roota. Třeba zrovna teď jsou mezi nimi nováčci, kteří podobně jako já před léty začínají bojovat s tímto panem Editorem a kterým snad mé informace pomohou.
Než se pustíme do popisu rozličných novot a zdokonalení, vzpomenu ještě své další dílko, které vyšlo rovněž na stránkách tohoto listu. Pojednává o kostrách neboli skeletonech nových dokumentů. Zdrojový kód ve výše uvedeném článku však obsahuje drobnou chybičku zapříčiňující ošklivou chybovou hlášku při pokusu editovat „nekostrovaný“ dokument, kterou jsem nedávno (doufám) náležitě opravil.
Chování editoru
Začneme nastaveními, která ovlivňují chování editoru jako takového. Všechny volby (nejenom z tohoto odstavce) se zapisují do .vimrc souboru ve vašem domovském adresáři.
set nocompatible
Zapnutí režimu nekompatibilního s tradičním VI. VI povoluje jen omezené možnosti, režim nocompatible je daleko lepší. Protože se jedná o volbu, která nastavuje jako vedlejší efekt další parametry, měla by být provedena co nejdříve (nejlépe úplně na začátku .vimrc souboru).
filetype plugin indent on
Nastavení rozpoznávání typu editovaného souboru, filetype pluginů a odsazování podle typu souboru. VIM umí rozpoznávat, jakého typu je editovaný soubor. Rozezná, jestli se např. jedná o zdrojový kód programu v C, Javě, PHP nebo třeba o HTML stránku (typů rozlišovaných souborů jsou desítky). Podle rozpoznaného typu souboru můžete VIM rozdílně konfigurovat. Dělá se to pomocí tzv. filetype pluginů. Co jsou zač a jak se s nimi pracuje, budeme rozebírat někdy příště.
V grafickém režimu nebo na „schopných“ terminálech by se jistě slušelo zapnout zvýrazňování syntaxe a nalezeného řetězce:
if &t_Co > 2 || has("gui_running")
syntax on
set hlsearch
endif
Další užitečnou volbou je bezesporu:
set autowrite
Modifikované soubory se budou automaticky ukládat při přechodu do jiného bufferu, spuštění externího příkazu, při volání :make apod. Ukládat se automaticky nebudou při ukončení editoru či odstraňování bufferu (místo toho VIM zahlásí chybu nebo se zeptá, co má dělat). Chcete-li soubor automaticky ukládat vždy (nedoporučuji), použijte místo toho nastavení set autowriteall.
set backup
set backupdir=~/.vim/backup,.,~/
Těmito volbami říkáme, že chceme, aby VIM vytvářel zálohy souborů a aby tyto zálohy ukládal do ~/.vim/backup (adresář je třeba vytvořit), a pokud to nepůjde, tak do aktuálního adresáře nebo domovského adresáře. Záložní soubor se pozná podle znaku tildy (~) na konci svého názvu. Tj. např. pokus.txt bude mít záložní souborpokus.txt~ atd.
set directory=~/tmp,.,/tmp
Čárkami oddělený seznam adresářů, kam se mají ukládat dočasné soubory. Pokud nelze dočasný soubor uložit do prvního adresáře v seznamu, použije se druhý v pořadí atd. Osobně mě rozčiluje, když se dočasné soubory ukládají do adresáře, ve kterém pracuji. Pomocí této volby jsem si je tedy přesměroval do soukromého tmp adresáře.
set confirm
Místo, aby různé operace (:q, :e) selhaly, protože není uložen aktuální buffer, VIM se uživatele zeptá, jestli chce soubor uložit.
Když po své práci opouštíte editor VIM, ztrácí se tím mnoho informací. Přicházíte o obsahy registrů (schránek), historii příkazů a vyhledávacích řetězců, globální proměnné a značky. Základním nástrojem VIMu určeným k tomu, abychom o tyto údaje nepřicházeli, je použití .viminfosouboru. Když je VIM vhodně nakonfigurován, ukládá automaticky při každém ukončení různé stavové informace do .viminfo souboru ve vašem domovském adresáři, ze kterých při příštím spuštění čerpá. Vhodnou volbou je například toto:
set viminfo='50,\"500 set history=50
které zajistí, že se budou ukládat informace o posledních padesáti souborech, obsahy registrů se budou uchovávat do velikosti 500 řádků a historie příkazů a vyhledávacích výrazů bude omezena rovněž na 50. VIM by měl také umět automaticky skočit s kurzorem na místo, kde jsme minule skončili. (Více viz :help viminfo a :help ‚viminfo‘.)
set incsearch
VIM bude už v průběhu psaní vyhledávacího výrazu zobrazovat první odpovídající řetězec v textu. Jinými slovy, použijete-li příkaz /pro přechod do režimu vyhledávání regulárního výrazu v textu a začnete psát písmena ah ve snaze najít řetězec ahoj, VIM po stisku a okamžitě skočí na následující a v textu, po stisku h vyhledá místo s řetězcem ah a tak dále. Zrušíte-li vyhledávání stiskem Esc, vrátíte se zpět na původní pozici.
VIM umí podobně jako různé shelly automaticky doplňovat názvy příkazů nebo souborů. Obvykle stačí napsat jen začátek příkazu, stisknout smluvenou klávesu (v shellech obvykle Tab) a celé jméno příkazu se automaticky doplní. Zkuste do svého .vimrc přidat třeba následující trojici příkazů:
set wildchar=<Tab>
set wildmenu
set wildmode=longest:full,full
První volba nastavuje jako klávesu pro automatické doplňování tabulátor, druhá volba říká, že pokud je možných doplnění více, má vyskočit jednoduché menu se všemi možnostmi. Třetí příkaz pak určuje, jakým způsobem se má doplňování provádět, pokud je možností doplnění více: první stisk tabulátoru doplní co největší část a zapříčiní zobrazení zmiňovaného menu, ze kterého lze správné doplnění vybírat dalšími stisky klávesy Tab.
Pokud v normálním režimu stisknete třeba š, znamená to v drtivé většině, že jste chtěli vlastně napsat 3 (třeba v příkazu 3dd – výmaz tří řádků), jen jste si zapomněli přepnout klávesnici z české na anglickou. Podobně (a to mi pilo dlouho krev) se často omylem napíše " místo : pro vstup do příkazového módu či – místo / pro vyhledávání apod. Za všechno může zmiňovaná česká klávesnice. Obvykle pak musíte napsaný příkaz zrušit pomocí Esc, stisknout dva shifty pro přepnutí klávesnice a teprve pak napsat to, co jste vlastně chtěli. Šílené zdržení! Ve VIM naštěstí existuje volba, která na toto pamatuje:
set langmap=ě2,š3,č4,ř5,ž6,ý7,á8,í9,é0,\":,-/,_?
Pomocí ní specifikujete, co ve skutečnosti v normálním režimu znamená který znak. Tak např. ě znamená, že popravdě chceme napsat dvojku, é nulu, pomlčka lomítko, uvozovky dvojtečku atd.
Podobného ražení je i můj následující tip. Při programování velmi často kompilujete a z VIMu se to dělá třeba voláním :make. Mým velmi častým překlepem je, že místo make napíšu mkae nebo maek. Takové příkazy ve VIM (naštěstí) neexistují, ale i tak to představuje obrovské zdržení, protože se příkaz musí po předchozím neúspěchu ťukat znovu. Zadáte-li ovšem do .vimrc následující příkazy:
cabbrev mkae make
cabbrev maek make
vytvoří se pro příkaz :make „zkratky“ :mkae a:maek a máte po starostech. (Uvedený postup lze pochopitelně aplikovat na libovolné příkazy – fantazii se meze nekladou.)
Ještě větší efektivity práce dosáhnete patřičným namapováním nějaké funkční klávesy (nevýhodou je, že si musíte pamatovat další zkratku navíc :-):
map <F5> :make<CR>
imap <F5> <Esc>:make<CR>
V normálním i insert módu bude nyní klávesa F5 znamenat spuštění příkazu :make. (Se zapnutou volbou set autowrite pochopitelně také předchozí uložení souboru.)
Jestli jste si podobně jako já zvykli na VIMovské kurzorové klávesy h, j, k, l, že bez nich nemůžete být ani v insert módu, může vám přijít k duhu jejich mapování s podrženou klávesou Ctrl:
imap <C-h> <Left>
imap <C-j> <Down>
imap <C-k> <Up>
imap <C-l> <Right>
Zdá se mi stále rychlejší stisknout Ctrl a h než opouštět základní položení rukou jen kvůli sáhnutí na kurzorové klávesy. :-)
Mým posledním tipem, který se hodí používat zejména ve spojitosti s Mini Buffer Explorerem (psalo se o něm v jednom z článků o pluginech VIMu), je rychlé přecházení mezi buffery:
map <A-1> :b1<CR>
map <A-2> :b2<CR>
map <A-3> :b3<CR>
map <A-4> :b4<CR>
map <A-5> :b5<CR>
map <A-6> :b6<CR>
map <A-7> :b7<CR>
map <A-8> :b8<CR>
map <A-9> :b9<CR>
map <A-0> :b10<CR>
map <C-Tab> :bn<CR>
map <S-C-Tab> :bp<CR>
imap <A-1> <Esc>:b1<CR>
imap <A-2> <Esc>:b2<CR>
imap <A-3> <Esc>:b3<CR>
imap <A-4> <Esc>:b4<CR>
imap <A-5> <Esc>:b5<CR>
imap <A-6> <Esc>:b6<CR>
imap <A-7> <Esc>:b7<CR>
imap <A-8> <Esc>:b8<CR>
imap <A-9> <Esc>:b9<CR>
imap <A-0> <Esc>:b10<CR>
imap <C-Tab> <Esc>:bn<CR>
imap <S-C-Tab> <Esc>:bp<CR>
Trik spočívá v tom, že na klávesy Alt plus 1 až0 máte namapovány příkazy pro přechod do bufferů s odpovídajícími čísly. Pro přesun na následující/předcházející buffer v pořadí se mapuje navíc dvojice Ctrl+Tab/Shift+Ctrl+Tab. Díky přidaným mapováním imap zkratky fungují i v insert módu.
Pokračování příště…