Hlavní navigace

Jak si přizpůsobit Vim (4)

Pavel Satrapa 22. 6. 2001

Dnešní díl bude poněkud speciální. Týká se věcí, o kterých jsem v zásadě věděl, ale nepoužíval je. Nicméně pro potřeby článku jsem s nimi musel trochu experimentovat, takže je nakonec nejspíš používat začnu, alespoň částečně. Jedná se o uživatelská menu a spolupráci s externím překladačem.

Uživatelské menu

Vim vám umožňuje definovat si vlastní rozšíření pro menu či lištu nástrojů. Tahle vylepšení se týkají pouze grafického režimu, v textovém se nezobrazují ( :help console-menus vám poradí, jak si je zpřístupnit).

Upřímně řečeno jsem se do menu nikdy nějak zásadně nezamiloval. Pro běžnou práci mi připadá příliš neohrabané a pomalé. Na druhé straně myslím má smysl používat menu jako externí paměť – uložit si do něj konstrukce, které člověk používá poměrně zřídka (na ty frekventované je výhodnější mít makra) a nechce se mu držet v hlavě jejich přesnou syntaktickou podobu.

Příkazů pro vytváření menu je celá hromada. Jako obvykle se liší prvním písmenem, určujícím režim, pro který daná položka platí. Z pestré nabídky jsou asi nejzajímavější

:nmenu název význam
:imenu název význam
:vmenu název význam

Liší se v tom, že nmenu pracuje v normálním (příkazovém) režimu, zatímco imenu slouží pro režim vkládací. Zajímavé je vmenu pro režim vizuální. Můžete v něm využívat skoky na značky < a >, které Vim automaticky umístí na začátek a konec vybraného textu. Díky nim lze daný text obklopit konstrukcemi podle potřeby.

Existuje sice příkaz amenu , který funguje ve všech režimech (ve vkládacím předřazuje <Ctrl-O>, takže na pravé straně můžete vycházet z příkazového režimu), nicméně jeho praktická užitečnost je problematická. Dost často je totiž třeba, aby se příkazy v jednotlivých režimech lišily. Například v příkazovém režimu se člověk většinou chce na závěr vrátit zpět do příkazového, zatímco ve vkládacím je lépe zůstat u vkládání.

Proto mi jako výhodnější připadá nasadit skupinu příkazů, jejichž levá strana je totožná (definují stejnou položku menu) a pravá se mírně liší podle režimu, ve kterém budou použity. Například uživatelské menu, které vkládá do LaTeXovského zdrojového textu obvyklá loga, by mohlo vypadat takto:

nmenu LaTeX.Loga.TeX a{\TeX}<Esc>
imenu LaTeX.Loga.TeX {\TeX}
nmenu LaTeX.Loga.LaTeX a{\LaTeX}<Esc>
imenu LaTeX.Loga.LaTeX {\LaTeX}

Jistě jste pochopili, že levá strana popisuje cestu v menu, kde jednotlivé úrovně jsou navzájem odděleny tečkami. Pokud do ní potřebujete vložit speciální znak (mezeru, tečku apod.), předřaďte mu zpětné lomítko, jak je v Unixu zvykem. Za první mezerou začíná pravá strana, tedy význam dotyčné položky.

K nim přidám menu pro vizuální režim, které zajistí zvýraznění vybraného textu (na jeho začátek umístí \emph{ a na konec  }):

vmenu LaTeX.Zvýraznění <Esc>`>a}<Esc>`<i\emph{<Esc>%

Úpravy ve vizuálním režimu je třeba dělat od konce, protože při mazání či přidávání textu zůstávají značky vybraného textu stát. Úpravy na začátku vybraného bloku tedy změní pozici jeho konce a proto je třeba dělat je až na závěr.

Pokud před některý znak levé strany předřadíte ampersand (&), uděláte z něj horkou klávesu, kterou lze dotyčnou položku aktivovat. Má verze Vim se však vůči těmto klávesám chová podivně. Některé horké klávesy špatně zvýrazňuje, na některé nereaguje. Stručně vzato jsem z nich byl celkem zklamán.

Vložením <Tab> můžete nadpis menu rozdělit na dvě části, z nichž první bude při zobrazení zarovnána k levému okraji a druhá k pravému. Hodí se to pro různé vysvětlivky nebo když chcete k pravému okraji menu napsat ekvivalentní sekvenci příkazů.

Pravá strana dost přesně odpovídá pravé straně mapovacích příkazů (:map, :imap,…).

Menu se dost často vztahují k charakteru editovaného textu, takže považuji za rozumné načítat je prostřednictvím automatických příkazů v závislosti na příponě souboru. Například jsem vytvořil definici menu pro LaTeX, kterou jsem si uložil do svého oblíbeného adresáře ~/.vim/. Ve svém osobním .vimrc pak mám příkaz

autocmd BufRead,BufNewFile *.tex source ~/.vim/latex.menu

Kdykoli pak budete editovat soubor s příponou .tex, přibude vám v hlavním menu položka LaTeX.

Upozorňuji, že definici menu jsem – na rozdíl od maker z minulého dílu – vytvářel pro účely tohoto článku. Není tedy prověřena dlouhodobějším používáním a může se ukázat, že struktura menu není optimální či něco důležitého chybí. Berte ji spíše jako inspiraci a výchozí bod pro svůj vlastní vývoj.

O likvidaci menu se postará příkaz :unmenu. Opět se předřazeným písmenem vyznačuje režim, kterého se má týkat. Jako parametr udáváte položku menu, případně celé (pod) menu. Takže kompletní menu pro LaTex z předchozích příkladů odstraníte příkazy

:nunmenu LaTeX
:iunmenu LaTeX
:vunmenu LaTeX

Speciální význam má menu s názvem ToolBar, jehož položky tvoří lištu nástrojů v horní části okna editoru. Nepovažuji za příliš pravděpodobné, že byste se pouštěli do jeho úprav. Pokud ano, obrázky pro jednotlivé nástroje ukládejte do podadresáře bitmaps v hlavním adresáři Vim. Měly by mít velikost 20×20 pixelů a být ve formátu XPM (X11, Gtk) resp. BMP (MS Windows). Menu je jednoúrovňové a definuje se takto:

amenu ToolBar. obrázek příkaz

Dobrou inspirací pro vaši tvorbu může být definice standardního menu pro Vim, kterou najdete v souboru menu.vim ve standardním adresáři /usr/share/vim či podobném.

Makej

Vim je zhusta používán k vytváření zdrojových souborů pro další programy – překladače programovacích jazyků, TeX, různé interprety a podobně. Uživatel se často točí v kolečku editace-překlad-ověření-editace…

Vim nabízí nástroje, jak si tento koloběh urychlit. Obávám se však, že v této oblasti je jen velmi slabým odvarem Emacsu. Nicméně můžeme se utěšovat, že alespoň základní podpora tu je.

Já sám jsem ji nikdy nepoužíval. Řeším tyto situace prostě tak, že v jednom okně mám spuštěný gvim, ve kterém edituji zdrojový text, vedle něj mám okno s interpretem příkazů, kam si vždycky odskočím a nechám upravený text přeložit/spustit a podobně. Pokud se jedná o text, mám ještě ve třetím okně (na jiné pracovní ploše, aby nepřekáželo) spuštěný program GhostView se zapnutým watch file, který mi zobrazuje výslednou podobu. Žiji tak celkem spokojeně již několik let, ale možná jen netuším, o co vlastně přicházím.

Pokud si ze mne vezmete odstrašující příklad a rozhodnete se používat ladicí služby editoru, budou vás zajímat především volby makeprg a errorformat. První z nich určuje program, se kterým má Vim spolupracovat. Druhý sděluje editoru, jak analyzovat chybový výstup tohoto programu.

Máte-li vše nastaveno, použijte příkaz

:make

Vim spustí program daný proměnnou makeprg a jeho výstup uloží do chybového souboru (volba makeef), následně pak analyzuje chyby a ohlásí první z nich. Chybový soubor smaže, ale zapamatuje si údaje v něm obsažené. Můžete pak používat příkazy

Tabulka č. 124
příkaz zkráceně význam
:clist :cl zobrazí seznam chyb
:cnext :cn skok na další chybu
:cprevious, :cNext :cp, :cN skok na předchozí chybu

Například pro práci s LaTeXem jsem s úspěchem vyzkoušel následující nastavení:

set makeprg=cslatex\ --interaction\ nonstopmode\ %
set shellpipe=>&
set errorformat=
cosi strašlivého, co najdete příkazem :help errorformat-LaTeX

Používám tcsh, pro bash by volba shellpipe musela mít hodnotu 2>&1 >. Tato volba řídí způsob, kterým se výstup spuštěného programu zapisuje do výstupního souboru. Její implicitní hodnota v prostředí Unixu používá tee, takže výsledky zároveň vidíte. Bohužel při pomalejším zobrazování (kterým trpí můj notebook) to dost zdržuje, proto jsem nechal výstup proudit jen do chybového souboru.

Dlužno přiznat, že :make a :clist je o něco přehlednější, než číst chybová hlášení přímo při překladu TeXem.

Před provedením :make je třeba uložit aktuální stav editovaného textu. Lze to zajistit i automaticky – stačí nastavit :set autowrite. Tato volba způsobí automatické uložení změněného souboru v řadě případů, kdy jej opouštíte (ne však ve všech). Podle mne je poněkud kontroverzní a raději bych se přikláněl k tomu vytvořit si vlastní příkaz, kterým nahradíte make. Mým oblíbeným názvem pro tyto případy je  Go:

:command Go write | make

A to bude pro dnešní den vše. Pro všechny je tu ale potěšující zpráva: seriál oproti původním předpokladům nekončí a bude mít ještě jedno pokračování s pracovním názvem „Co se jinam nevešlo a na co se zapomnělo“ :)

Našli jste v článku chybu?

27. 6. 2001 15:27

Jindrich (neregistrovaný)

Dekuji mnohokrat, o programu jsem si myslel, ze pouze "cisti" kod (ten jsem overoval on-line). Tady je k dispozici pro ruzne OS: http://www.w3.org/People/Raggett/tidy/#download

26. 6. 2001 13:46

matous cervenka (neregistrovaný)

Taky jsem na to narazil, nicmene pod Windows se Gvim a Vim nelisi. Horsi je to ale s verzemi pro MS-Dos. Mozna by to chtelo nainstalovat novejsi verzi?

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

120na80.cz: Stoná vaše dítě často? Upravte mu jídelníček

Stoná vaše dítě často? Upravte mu jídelníček

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

DigiZone.cz: Flix TV má set-top box s HEVC

Flix TV má set-top box s HEVC

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?