Textový editor Vim jako IDE (12.část: konfigurace pravítka a stavového řádku)

22. 9. 2011
Doba čtení: 14 minut

Sdílet

V dnešní části seriálu o využití textového editoru Vim (nejenom) ve funkci vývojového prostředí si popíšeme, jakým způsobem je možné konfigurovat takzvané pravítko (ruler) a stavový řádek (status line). V této dvojici oblastí okna Vimu lze zobrazit různé typy údajů, včetně informací získaných s využitím uživatelských skriptů. Samozřejmě je též možné měnit barvu popředí a pozadí pro jednotlivé položky.

Obsah

1. Konfigurační parametry ovlivňující způsob zobrazení pravítka a stavového řádku

2. Povolení a zákaz zobrazení pravítka

3. Konfigurační parametry showmode a showcmd

4. Změna formátu údajů zobrazovaných na pravítku

5. Praktické příklady změny formátu pravítka

6. Využití funkcí při formátování informací na pravítku

7. Změna barev jednotlivých položek umístěných na pravítku

8. Konfigurace formátu údajů zobrazovaných na stavovém řádku

9. Odkazy na Internetu

1. Konfigurační parametry ovlivňující způsob zobrazení pravítka a stavového řádku

Textový editor Vim zobrazuje ve svém okně (popřípadě v okně terminálu, v němž je spuštěn) kromě vlastního editovaného textu i několik dalších informací, jejichž způsob zobrazení a formát je samozřejmě možné konfigurovat, a to v poměrně širokém rozsahu. Většina těchto informací je zobrazována v takzvaném pravítku (ruler) a ve stavovém řádku (statusline). Pravítko může být zobrazeno v nejspodnějším textovém řádku, do nějž se kromě vlastního pravítka zapisují i příkazy v normálním a příkazovém režimu, zatímco stavový řádek je většinou zobrazen pod každým podoknem obsahujícím jeden editovaný buffer (viz též vysvětlující obrázek). To kromě jiného znamená, že formát informací zobrazených na pravítku je nastavován globálně (je platný pro všechny editované buffery), zatímco u stavové řádky je možné zvolit buď globální nastavení, nebo nastavení lokální, tj. nastavení platné pouze pro jeden editovaný buffer.

Obrázek 1: Pravítko a stavový řádek, který je implicitně zobrazený v případě, že je okno editoru rozděleno na více podoken. U nejspodnějšího podokna je možné zvolit, zda se pro něj má stavový řádek zobrazit či nikoli (viz též sedmou kapitolu).

Pro změnu formátu pravítka a stavové řádky se používá několik konfiguračních parametrů vypsaných v níže umístěné tabulce:

# Název konfiguračního parametru Typ parametru Význam
1 ruler pravdivostní povolení či zákaz zobrazení pravítka
2 showcmd pravdivostní povolení či zákaz zobrazení příkazu během jeho zápisu na pravítku
3 showmode pravdivostní povolení či zákaz zobrazení aktuálně nastaveného režimu editoru na pravítku
4 rulerformat řetězec definice formátu zobrazení informací na pravítku
5 statusline řetězec definice formátu zobrazení informací na stavovém řádku
6 laststatus číslo 0, 1, 2 řízení způsobu zobrazení stavového řádku pro nejspodnější okno editoru

Jednotlivé volby uvedené v předchozí tabulce si podrobněji popíšeme v navazujících kapitolách.

Obrázek 2: Pravítko a popř. i stavový řádek však nejsou jedinými oblastmi, v nichž může textový editor Vim zobrazovat doplňující informace. Další oblastí je například plocha vlevo, do níž mohou být vypsána čísla řádků pomocí volby set number a taktéž horní textový řádek, v němž se mohou nacházet „ouška“ panelů (tabů) vytvořené například pomocí příkazu :tabnew.

2. Povolení a zákaz zobrazení pravítka

Nejprve se budeme zabývat konfiguračními parametry, pomocí nichž je možné zvolit, které informace (popř. zda vůbec nějaké) budou zobrazeny na pravítku. Zobrazení pravítka je možné povolit příkazem:

:set ruler

popř. zakázat příkazem:

:set noruler

Obrázek 3: Obsah okna textového editoru Vim v případě, že je zobrazení pravítka zakázáno pomocí volby
:set noruler 

V případě, že je zobrazení pravítka povoleno, budou všechny zvolené informace (viz další podrobnější popis uvedený v navazujících kapitolách) zobrazeny v pravé části posledního textového řádku na obrazovce. Implicitně jsou zde vypisovány informace o řádku a sloupci, na němž je umístěný textový kurzor. Údaje o sloupci se mohou v některých případech rozpadnout na dvě čísla, například tehdy, pokud jsou v textu použity znaky zakódované do většího počtu bajtů (včetně češtiny, například při použití kódování UTF-8 namísto jednobajtových kódových stránek). Údaje o sloupci se mohou lišit i tehdy, když je povoleno nastavení zalamování dlouhého textu na pozicích bílých znaků pomocí volby set linebreak (jedná se pouze o vizuální zalamování na obrazovce, nikoli o vkládání skutečných znaků konce řádku do textu).

Obrázek 4: Obsah okna textového editoru Vim v případě, že je zobrazení pravítka zakázáno pomocí volby
:set ruler 

Po této dvojici či trojici číslic se na pravítku může nacházet i informace o aktuální pozici kurzoru vyjádřená v procentech, popř. pomocí slov Top/Začátek, Bot/Konec, All/Vše. Česká lokalizace je v tomto případě zvolena možná poněkud nešťastně, protože šířka pravítka je nastavena na sedmnáct znaků, což znamená, že se například při editacích řádků s více než tisícem znaků nemusí informace o relativní pozici textového kurzoru zobrazit, protože na ni jednoduše nezbude dostatek místa (ovšem délku pravítka lze samozřejmě zvětšit, jak si řekneme dále).

Obrázek 5: Pokud je editovaný text tak krátký, že je možné ho celý zobrazit do okna editoru, je na konci pravítka zapsán text All nebo jeho lokalizovaná verze Vše.

Obrázek 6: U delšího textu se na konci pravítka zobrazuje relativní pozice kurzoru (přesněji řečeno celého okna) v rámci editovaného dokumentu.

Poznámka: pravítko je vždy zobrazeno v pravém dolním rohu, bez ohledu na to, jakým způsobem je zobrazen příkazový řádek. Plocha rezervovaná pro příkazový řádek totiž může ve skutečnosti zabírat i větší počet textových řádků, v závislosti na hodnotě konfiguračního parametru cmdheight. Ostatně si můžete sami vyzkoušet, jakým způsobem se změní obsah okna Vimu při zadání příkazu:

:set cmdheight=5

Obrázek 7: Obsah okna textového editoru při rozšíření oblasti pro příkazový řádek s využitím volby
:set cmdheight=5 

3. Konfigurační parametry showmode a showcmd

Dalším přepínačem ovlivňujícím způsob zobrazení posledního textového řádku, je přepínač showmode zapínaný příkazem:

:set showmode

a vypínaný pomocí příkazu:

:set noshowmode

Obrázek 8: Indikace v daný okamžik aktivního režimu textového editoru Vim.

V případě, že je tento přepínač zapnutý, je v levé části posledního řádku obrazovky zobrazován text –INSERT–, –REPLACE–, –VISUAL– či –VISUAL–BLOCK– v závislosti na tom, v jakém režimu se textový editor Vim právě nachází. Poněkud speciální případ nastane tehdy, když se ve vkládacím nebo přepisovacím režimu stlačí klávesová zkratka Ctrl+O pro přepnutí do příkazového režimu, ovšem pouze pro provedení jednoho příkazu. V tomto případě je režim indikován texty – (insert) – nebo – (replace) –.

Posledním konfiguračním parametrem z této skupiny je parametr nazvaný showcmd, jenž se zapíná příkazem:

:set showcmd

a vypíná pomocí příkazu:

:set noshowcmd

Pokud je tento parametr zapnutý, je přibližně ve dvou třetinách posledního textového řádku postupně vypisován příkaz zadávaný v normálním režimu. Může se například jednat o začátek příkazu da, po němž musí následovat objekt, jehož se mazání týká, tj. například w:word, s:sentence, p:paragraph atd. Dejte si pozor především na to, že i výběr registru pro operace typu yank/put/delete je považován za součást příkazu zadávaného v normálním režimu, tudíž se při použití volby noshowcmd nebude vypisovat ani příkaz "x (výběr registru x) ani příkaz @x (spuštění makra x)!.

Obrázek 9: Oblast, do níž se vypisuje právě zadáváný, ale ještě neprovedený příkaz.

Navíc je v případě zapnutí tohoto parametru vypisována velikost bloku vybíraného ve vizuálním režimu. Při výběru bloku na jednom řádku se vypisuje počet vybraných znaků, při větším výběru pak počet vybraných řádků. U vertikálního bloku je vypisován jak počet řádků, tak i počet sloupců (mezi oběma hodnotami je znak „x“).

Obrázek 10: V některých případech se současně zobrazuje jak v daný okamžik aktivní režim textového editoru Vim, tak i zadávaný příkaz.

4. Změna formátu údajů zobrazovaných na pravítku

Po možná poněkud nudném úvodu se pojďme podívat na zajímavější a užitečnější funkcionalitu textového editoru Vim. Popíšeme si, jakým způsobem je možné ovlivnit formát informací zobrazovaných na pravítku. Pro tento účel slouží konfigurační parametr rulerformat, který může obsahovat řetězec s popisem formátu jednotlivých položek, které se na pravítku mají objevit. Každá z položek má formát:

%-0{minwidth}.{maxwidth}{item}

přičemž nepovinné celočíselné údaje minwidthmaxwidth udávají velikost položky (počet znaků) při jejím zobrazení a item je jméno položky. Znakem - lze zvolit zarovnání vybrané položky doleva (implicitně se zarovnává doprava) a znakem 0 se vynucuje vložení nul před položku, která se vyhodnocuje na číslo. Jméno položky můžeme považovat za název speciální proměnné nastavované průběžně přímo Vimem na základě jména editovaného souboru, pozice textového kurzoru v souboru atd. atd. V následující tabulce jsou uvedeny pouze některé často používané položky:

# Jméno položky Význam
1 %f jméno souboru s relativní cestou
2 %F jméno souboru s plnou cestou
3 %t pouze jméno souboru
4 %y typ souboru
5 %m příznak, že soubor byl změněn (modified)
6 %r příznak, že soubor je určen jen pro čtení (read-only)
7 %l číslo řádku, na němž se nachází kurzor
8 %L celkový počet řádků v souboru
9 %c číslo sloupce, na němž se nachází kurzor
10 %v číslo virtuálního sloupce (viz poznámka o linebreak)
11 %o offset od začátku souboru (začíná se od jedničky)
12 %b hodnota znaku pod textovým kurzorem v dekadické soustavě
13 %B hodnota znaku pod textovým kurzorem v hexadecimální soustavě
14 %## mezi znaky ## je vloženo jméno skupiny definované příkazem highlight (viz další text)
15 %{} mezi znaky {} je vloženo volání uživatelské funkce (viz další text)
16 %( začátek skupiny značek/textu, kterým lze jako celku přiřadit šířku
17 %) konec skupiny značek/textu, kterým lze jako celku přiřadit šířku

5. Praktické příklady změny formátu pravítka

V předchozí kapitole jsme si pouze uvedli, jaké typy položek lze mít zobrazeny na pravítku. Nyní se podíváme, jak je možné tyto znalosti prakticky využít. Každý příklad bude pro ilustraci doplněn odpovídajícím screenshotem.

Zobrazení jména a typu souboru na pravítku (bude se jednat o jediné údaje zde zobrazené):

:set ruler
:set rulerformat=%t%y

Obrázek 11: Pravítko zobrazující jméno souboru a jeho typ.

Vložení mezery mezi jméno souboru a jeho typ (pozor: musí se použít escape sekvence):

:set ruler
:set rulerformat=%t\ %y

Obrázek 12: Pravítko zobrazující jméno souboru a jeho typ s oddělením obou údajů pomocí mezery.

Zobrazení čísla sloupce, čísla řádku a celkového počtu řádků za znakem lomeno:

:set ruler
:set rulerformat=%c\ %l/%L

Obrázek 13: Pravítko zobrazující číslo aktuálního sloupce, číslo aktuálního řádku a celkový počet řádků v editovaném souboru.

Zobrazení offsetu znaku a jeho kódu, jak v dekadické soustavě, tak i v soustavě hexadecimální:

:set ruler
:set rulerformat=%o\ [%b=0x%B]

Obrázek 14: Na pravítku je zobrazen offset od začátku souboru až k pozici kurzoru, v hranatých závorkách pak můžeme vidět ASCII kód znaku zapsaný dekadicky a hexadecimálně.

Zvětšení šířky pravítka na 40 znaků, výpis jména souboru s plnou cestou, příznaku modifikace a příznaku souboru jen pro čtení:

:set ruler
:set rulerformat=%40(%F%m%r%)

Obrázek 15: Pravítko je rozšířeno na 40 znaků a zobrazují se v něm základní informace o souboru: jeho jméno, indikátor modifikovaného souboru a indikátor souboru určeného pouze pro čtení.

Rozšíření pravítka o další informace uvedené ve složených závorkách, přidání vysvětlujících komentářů:

:set ruler
:set rulerformat=%40(%F%m%r\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]%)

Obrázek 16: Komplexní informace zobrazené na pravítku.

6. Využití funkcí při formátování informací na pravítku

Při formátování informací, které mají být zobrazeny na pravítku, je možné zavolat libovolnou funkci napsanou ve VimScriptu, přičemž vlastní volání funkce se umisťuje mezi znaky %{ a }. Pokud například potřebujeme na pravítku zobrazit hodiny (ve skutečnosti již asi budou zobrazeny někde na taskbaru), lze použít následující příkaz využívající zabudovanou funkci strftime:

:set ruler
:set rulerformat=%30(%{strftime('%a\ %b\ %e\ %I:%M\ %p')}

Obrázek 17: Pravítko, jehož obsah je vytvářený pomocí funkce strftime.

7. Změna barev jednotlivých položek umístěných na pravítku

Vzhledem k tomu, že se na pravítku může nacházet i poměrně velké množství různých prvků (maximálně osmdesát), může být vhodné si jednotlivé prvky barevně odlišit. Pro tento účel se využívá dvojice omezovačů %# a #, mezi něž se zapisuje libovolný styl definovaný pomocí příkazu highlight. Nejlepší pravděpodobně bude, když si tuto funkcionalitu ukážeme na příkladu. Mějme následující formát pravítka určený pro výpis jména souboru, čísla sloupce a řádku, počtu řádků, offsetu znaku a ASCII hodnotu znaku:

:set ruler
:set rulerformat=%40(%t:\ %c\ %l/%L\ \ %o\ [%b=0x%B]%)

Obrázek 18: Pravítko před obarvením jednotlivých položek.

Údaje na tomto pravítku lze obarvit tak, že se nejprve vytvoří vhodné styly:

:highlight RulerFileName guifg=#cc8080 ctermfg=red
:highlight RulerColumn   guifg=#cccc80 ctermfg=yellow
:highlight RulerLine     guifg=#80cc80 ctermfg=green
:highlight RulerOffset   guifg=#8080cc ctermfg=blue

Posléze je možné tyto styly snadno použít při „obarvování“ pravítka:

:set ruler
:set rulerformat=%40(%#RulerFileName#%t:\ %#RulerColumn#%c\ %#RulerLine#%l/%L\ \ %#RulerOffset#%o\ %#Normal#[%b=0x%B]%)

popř. s nastavením pevné délky některých položek:

:set ruler
:set rulerformat=%40(%#RulerFileName#%t:\ %#RulerColumn#%3c\ %#RulerLine#%l/%L\ \ %#RulerOffset#%o\ %#Normal#[%03b=0x%02B]%)

Obrázek 19: Pravítko po obarvení jednotlivých položek.

Výše vypsaný příkaz sice na první pohled vypadá poměrně složitě, nicméně výsledek je přehlednější.

8. Konfigurace formátu údajů zobrazovaných na stavovém řádku

V poslední kapitole si řekneme, jakým způsobem je možné nakonfigurovat stavový řádek, resp. stavové řádky. Již víme, že stavový řádek se používá v těch případech, kdy se okno editoru rozdělí na větší množství podoken, například příkazem :split popř. :vsplit. V tomto případě je každému podoknu (z nichž každé reprezentuje jeden editovaný buffer) přiřazena samostatná stavová řádka. U podokna posledního je možné s využitím volby :set laststatus způsob zobrazení stavové řádky změnit. Pokud je tato volba nastavena na hodnotu 0, tj. po zadání příkazu:

:set laststatus=0

nebude pro nejspodnější podokno stavová řádka zobrazena nikdy (použije se jen pravítko).

Obrázek 20: Při použití volby laststatus=0 není stavový řádek pro spodní okno nikdy použit.

V případě nastavení konfiguračního parametru laststatus na jedničku:

:set laststatus=1

se stavová řádka zobrazí pouze v tom případě, kdy je okno Vimu rozděleno minimálně na dvě podokna (což je implicitní nastavení).

Obrázek 21: Po použití volby laststatus=1 je stavový řádek pro poslední podokno zobrazen.

Poslední možností je nastavení této volby na hodnotu 2, což vede k zobrazení stavového řádku kdykoli, tj. i v případě, že okno Vimu není rozděleno na žádná podokna:

:set laststatus=2

Obrázek 22: Volbou laststatus=2 je dosaženo toho, že se stavový řádek zobrazí i v tom případě, kdy není hlavní okno Vimu rozdělené na podokna.

ict ve školství 24

Obsah stavového řádku se řídí konfiguračním parametrem statusline. Pokud je tento konfigurační parametr prázdný (je mu přiřazen prázdný řetězec), je v pravé části stavového řádku zobrazeno pravítko nakonfigurované způsobem popsaným v předchozích kapitolách. Ovšem formát stavového řádku je možné nakonfigurovat individuálně (dokonce pro každé podokno zvlášť příkazem setlocal namísto příkazu set), přičemž řetězec předaný do konfiguračního parametru statusline se skládá stejným způsobem, jako je tomu u řetězce pro konfigurační parametr rulerformat. Například:

:setlocal statusline=%55(%{strftime('%a\ %b\ %e\ %I:%M\ %p')}\ %5l,%-6(%c%V%)\ %P%)

Obrázek 23: Ukázka okna Vimu rozděleného na tři podokna, z nichž každé má zobrazen svůj stavový řádek.

9. Odkazy na Internetu

  1. vim.wikia: Display date-and-time on status line
    http://vim.wikia.com/wiki/Display_date-and-time_on_status_line
  2. vim.wikia: Writing a valid statusline
    http://vim.wikia.com/wiki/Wri­ting_a_valid_statusline
  3. vim.wikia: Statusline tab level ruler
    http://vim.wikia.com/wiki/Sta­tusline_tab_level_ruler
  4. vim.wikia: Switching between different statuslines
    http://vim.wikia.com/wiki/Swit­ching_between_different_sta­tuslines
  5. X Selections, Cut Buffers, and Kill Rings
    http://www.jwz.org/doc/x-cut-and-paste.html
  6. Accessing the system clipboard
    http://vim.wikia.com/wiki/Ac­cessing_the_system_clipbo­ard
  7. xcutsel(1) – Linux man page
    http://linux.die.net/man/1/xcutsel
  8. snipMate : TextMate-style snippets for Vim
    http://www.vim.org/scripts/scrip­t.php?script_id=2540
  9. msanders / snipmate.vim
    https://github.com/msander­s/snipmate.vim
  10. snipMate.vim Introductory Screencast
    http://vimeo.com/3535418
  11. Clewn home page
    http://clewn.sourceforge.net/
  12. How to connect vim with gdb – using clewn
    http://chunhao.net/blog/how-to-connect-vim-with-gdb-using-clewn
  13. yavdb : Yet Another (Generic) Vim Debugger Integration
    http://www.vim.org/scripts/scrip­t.php?script_id=1954
  14. Vim home page
    http://www.vim.org/
  15. Exuberant ctags
    http://ctags.sourceforge.net/
  16. xxd (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=xxd
  17. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  18. ctags (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=ctags
  19. cscope (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=csco­pe
  20. Tutorial: Make Vim as Your C/C++ IDE Using c.vim Plugin
    http://www.thegeekstuff.com/2009/01/tu­torial-make-vim-as-your-cc-ide-using-cvim-plugin/
  21. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  22. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  23. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  24. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  25. Novinky ve VIM 7: Úvodní část – speller
    http://www.root.cz/vim-sedm-prvni-cast/
  26. Novinky ve VIM 7: Skriptovací jazyk
    http://www.root.cz/vim-sedm-druha-cast/
  27. vim2elvis: Přednosti a nedostaky Elvise v porovnání s Vimem
    http://www.root.cz/clanky/vim2elvis-1/
  28. vim2elvis: Shodné znaky mezi Elvisem a Vimem, nastaveníeditoru
    http://www.root.cz/clanky/vim2elvis-2/
  29. Nej… VIM pluginy (1)
    http://www.root.cz/clanky/nej-vim-pluginy/
  30. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  31. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  32. JavaBrowser : Shows java file class, package in a tree as in IDEs. Java source browser.
    http://www.vim.org/scripts/scrip­t.php?script_id=588
  33. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318
  34. Scroll Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Scroll_lock
  35. Caps Lock (Necyklopedie)
    http://necyklopedie.wikia­.com/wiki/Caps_Lock
  36. Avoid the escape key
    http://vim.wikia.com/wiki/A­void_the_escape_key
  37. Map caps lock to escape in XWindows
    http://vim.wikia.com/wiki/VimTip166

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.