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ázekpří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\ %
cosi strašlivého, co najdete příkazem :help errorformat-LaTeX
set shellpipe=>&
set errorformat=
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“ :)