Hlavní navigace

Jak si přizpůsobit Vim - bonus zdarma

3. 7. 2001
Doba čtení: 6 minut

Sdílet

Když jsem tak hloubal v dokumentaci Vim a připravoval předchozí díly seriálu, tu a tam jsem narazil na zajímavou novinku nebo jsem si vzpomněl na něco, o čem jsem se zapomněl zmínit. Proto jsem se rozhodl napsat ještě tuhle pátou část čtyřdílného seriálu. Bude poněkud méně souvislá, protože hodlám poskakovat sem a tam mezi zajímavými drobnostmi, na které se minule nedostalo.

Konverze souborů

Jak správně uvádějí představitelé Microsoftu, autoři komerčních programů jsou inovativní. Proto jedním ze základních úkolů při návrhu nového operačního systému je, jaké inovativní kódování znaků zvolit a jak inovativně ukončovat řádky v textových souborech.

Kódováním češtiny se zabývat nebudu, protože Vim pro tuto oblast nenabízí žádné speciální služby. Lze samozřejmě zapřáhnout cstocs, například prostřednictvím menu, jak jsem viděl v konfiguraci neznámého autora z konce dvacátého století:

nmenu Čeština.Kódování.Windows\ CP\ 1250->ISO\ 8859-2 :1,$!cstocs 1250 il2<CR>

Já jsem kódování ponechal raději mimo Vim. Vyrobil jsem si skupinku jednoduchých skriptů s krátkými názvy ve stylu w2l (Windows->Linux). Pak mohu konvertovat skupinově - například  w2l *.html.

Naopak při konverzi textových souborů mezi různými systémy dokáže Vim podat pomocnou ruku. Vychází z nastavení volby fileformat, jejímiž hodnotami mohou být unix, dos nebo mac v závislosti na způsobu ukončování řádků.

Vim si sám zjistí, jaký formát daný soubor používá, a podle toho nastaví odpovídající hodnotu. Pro její rychlou kontrolu poslouží příkaz

:set

Pokud jej použijete bez parametrů, zobrazí všechny volby, jejichž aktuální hodnoty se liší od implicitních. Čili pokud se fileformat ve výstupu nevyskytuje, je soubor v přirozeném formátu systému, na kterém pracujete. Jakmile se objeví například fileformat=dos, je třeba konvertovat. Stačí použít

:set fileformat=unix
:w

a je hotovo. Někdy se v DOSovských souborech objeví nadbytečné znaky ^M. V takovém případě přidejte ještě  :%s:^M::.

Doplňování jmen souborů

Jistě jste si všimli, že pokud během psaní jména souboru na příkazovém řádku Vim stisknete tabulátor (klávesu lze změnit volbou wildchar), editor doplní zbývající část jména. Není-li zbytek jednoznačný, varovně pípne a použije první z možných konců. Opakovaným stiskem tabulátoru můžete přecházet mezi jednotlivými variantami.

Milou vychytávkou je :set wildmenu. Nastavíte-li je, zobrazí se při nejednoznačném doplnění menu možných souborů. Objeví se nad příkazovým řádkem. Stačí šipkami doleva/doprava dojet na zvolený soubor a pokračovat v psaní příkazu. Klávesami nahoru a dolů se dokonce můžete pohybovat po adresářové struktuře, takže si můžete dojít pro soubor, kam bude potřeba.

Pomocí wildignore lze předepsat, které soubory mají být při doplňování ignorovány. Například

:set wildignore=*~,*.o,*.log,*.aux,*.dvi

Viminfo

Díky souboru viminfo si Vim dokáže zapamatovat řadu informací z předchozích editací. Patří mezi ně značky v souborech, historie příkazového řádku či hledání, obsahy registrů a podobně. Jeho chování se řídí volbou  viminfo.

Hodnota této volby je celkem komplikovaná. Tvoří ji čárkami oddělovaný seznam jednotlivých parametrů, kde parametr je vždy zahájen určitým znakem, za nímž následuje přiřazovaná hodnota. Za nejvýznamnější považuji:

Tabulka č. 127
'číslo počet posledních souborů, pro které si má pamatovat značky (povinná položka)
rcesta identifikuje výměnná média, pro soubory z nich pocházející si nebude nic ukládat
nsoubor název souboru, do kterého si ukládá informace (musí být poslední)

Za rozumné považuji nastavení

set viminfo='50,r/mnt,n~/.vim/viminfo

podle kterého si Vim pamatuje značky z posledních 50 souborů, neukládá si je pro soubory pocházející z /mnt a soubor s informacemi je ~/.vim/viminfo. Nastavení musí být v některém z konfiguračních souborů, aby se informace ze souboru načetly při startu editoru.

Jak snadněji opouštět

Jistě znáte tu situaci. Zadáte příkaz (například :q či :n a Vim odepře poslušnost. Vymyslí si k tomu nějakou nejapnou výmluvu, jako třeba že jste v souboru provedli nějaké změny a neuložili je nebo že nemůžete ukončit editor, když jste neprošli všechny soubory, které se mají editovat. Zároveň vám poradí, že když si na něj dupnete a připojíte k příkazu vykřičník, přestane protestovat a poslechne.

Pokud vám toto chování nevyhovuje, můžete zkusit :set confirm. Pak se Vim při pokusu o provedení problematické akce zdvořile zeptá. Například zda chcete uložit změny či zda má skutečně skončit, když jste původně chtěli editovat ještě 5 dalších souborů.

Skládání čili folding

V samém závěru se zmíním o jedné z nejvýznamnějších novinek, kterou přináší verze 6. Jedná se o tak zvané skládání, kdy se část textu skryje a místo ní Vim zobrazuje jen informaci „tady je 17 řádků“.

Název „skládání“ vychází z papírové analogie. Představte si, že máte řekněme zdrojový text programu vytisknutý na papíře. U některých podprogramů si papír složíte tak, že tělo podporgramu zmizí v záhybu a viditelná zůstane jen jeho hlavička. V dokumentaci to sugestivně znázorňují takto:

____________________________
|                            |
| hlavička podporgramu       |
|____________________________|
 \                            \
  \____________________________\
  /    složené řádky (tělo)    /
 /____________________________/
|                            |
| ...                        |
|____________________________|

Složený text pochopitelně nadále zůstává součástí editovaného souboru, jen momentálně není zobrazen. Cílem skládání je zvýšit přehlednost. Abyste si mohli zvolit, do jaké míry podrobnosti hodnáte soubor zkoumat.

Jednotlivé sklady si pochopitelně můžete definovat ručně příkazem zf cosi, kde cosi vymezuje objekt, který se má stát skladem. Může se jednat o pohybový příkaz nebo o definici objektu ( :help text-objects). Například zfap definuje sklad přes celý aktuální odstavec.

Když je sklad zavřený, Vim jej nahradí jediným řádkem. Uvádí v něm počet složených řádků a text prvního z něj, abyste si mohli udělat alespoň rámcovou představu, o co jde. Například na následujícím obrázku je složen podprogram PisCast (klikněte si pro větší verzi).

[obrázek]

Sklad lze otevřít, když najedete kurzorem na jeho řádek a posunete se na něm doleva či doprava. Lze též používat zo (open, otevřít) a zc (close, zavřít). Sklady pochopitelně mohou být vnořovány a typicky také vnořeny bývají.

Ovšem to vše je hnusná manuální práce a já jsem slíbil, že se v tomto seriálu budu věnovat především nastavování. Dřinu strojům!

První možností mechanizace je ponechat vytváření skladů na editoru. K tomu slouží volba foldmethod . Implicitní hodnotou je manual, kdy sklady definujete ručně.

Nastavíte-li :set foldmethod=indent, Vim odstraní všechny stávající definice skladů a vytvoří nové podle odsazení textu. Každá po sobě jdoucí skupina řádků se stejným (a větším) odsazením vytvoří jeden sklad. Tato metoda je míněna především pro editaci programů, kde bývá zvykem úrovní odsazení vyznačovat vnořené bloky kódu. Z toho také vyplývá, že odsazení pro vytvoření skladů se počítá v násobcích hodnoty  shiftwidth.

Další možností pro foldmethod je syntax, kdy hranice skladů jsou definovány pravidly pro syntaktické vzory. Bohužel zatím skoro žádné syntaktické soubory neobsahují příslušná pravidla. Zajímavým hybridem mezi mauálním a automatickým přístupem je metoda marker. Když ji zapnete, sklady budou vytvořeny podle značek vámi vložených do textu. Pro zahájení skladu použijte {{{ a pro ukončení }}} (lze změnit volbou foldmarker). Poslední metodou je expr, kdy se pravidla pro vytvoření skladů stanoví prostřednictvím speciálních výrazů.

Také zobrazování skladů lze s úspěchem automatizovat. Například nastavením :set foldlevel=N způsobíte, že se zavřou všechny sklady s úrovní vnoření N a větší (a otevřou sklady s úrovní vnoření menší než N, což dokumentace neříká, ale Vim dělá). S hodnotou této proměnné manipulují i příkazy zm, zM (zmenšují ji, čili zavírají sklady) a zr, zR (zvětšují, tedy otevírají).

Například :set foldlevel=1 otevře sklady na nejvyšší úrovni a zavře všechny, které jsou do nich vnořeny. Můžete tak řídit základní míru podrobnosti, se kterou bude text zobrazen.

O zavírání a otevírání se také dovede postarat Vim sám. Nastavte si

:set foldopen=all
:set foldclose=all

a text vám pod rukama ožije. Každý sklad se okamžitě otevře, když na něj přijedete kurzorem. Jakmile jej opustíte, zase se automaticky zavře. Já osobně moc nemiluji, když se mi text neustále mění pod rukama, ale někomu se to možná bude líbit.

Chcete-li získat přehled o tom, kde a jak jsou rozloženy jednotlivé sklady, nařiďte třeba :set foldcolumn=5 . Tato volba vytvoří vlevo vedle textu sloupec zadané šířky (v daném případě 5 znaků), ve kterém zobrazuje hranice existujících skladů. Ukázku vidíte na obrázku výše.

root_podpora

Chcete-li si prohlédnout plné znění textu, ale nechcete si rozházet svou aktuální konfiguraci skladů, použijte :set nofoldenable. Dočasně tak zakážete editoru skládání. Když je pak znovu povolíte ( :set foldenable), vrátí se do původních kolejí. Abyste to měli rychlejší, volbu lze přepnout také příkazem  zi.

Závěr

Seriál končí, ale závěrem je tu ještě jeden malý bonus – nová verze konfiguračních souborů pro Vim s vylepšeními, o které jste si v debatách pod článkem psali vy sami. Tak ať vám slouží :)

Byl pro vás článek přínosný?

Autor článku

Pavel Satrapa působí na Ústavu nových technologií a aplikované informatiky na Technické univerzitě v Liberci, píše knihy a motá se kolem tuzemské akademické sítě CESNET.