Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

VIM na plný výkon: zvýrazněte si hloubku odsazení

Ztrácíte orientaci v hluboko zanořených cyklech? Stávají se vaše programy nepřehledné? Naučte VIM graficky zvýrazňovat hloubku odsazení a máte po problémech!

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Odsazování ve zdrojových kódech patří k dobrým mravům každého programátora. Výrazně se tak zvyšuje čitelnost a přehlednost zdrojového kódu. Každý jistě při psaní zdrojáků odsazuje těla podmínek, cyklů a funkcí, v HTML zvýrazňuje vnoření tagů vhodným odsazením a podobně.

Co když ale píšeme něco složitého, kde se to množí cykly a vnořenými podmínkami, a my zjišťujeme, že se stále víc a víc vzdalujeme od levého okraje – jediného záchytného bodu pro naše oko? Stačí několik stupňů odsazení a jsme ztraceni. Kód se stává nepřehledným, bez dodatečného úsilí nevíme, co patří k čemu. Příklad:

void nejaka_funkce(int x) {
  if (x > 0) {
    for (int i = 0; i < 10; i++) {
      if (x == 3) {
        int j = i;
        while (j < x) {
          jina_funkce();
        }
      } else {
        neco_dalsiho();
      }
    }
  }
}

Závorky na konci se množí, a kdybychom chtěli přidat nějaký příkaz těsně za tělo cyklu for, bude trochu problémem najít rychle to správné místo.

Někdo může namítnout, že veliká hloubka vnořených cyklů a podmínek indikuje špatný přístup programátora k řešené úloze. Jistě by se v takovém složitém algoritmu daly najít části vhodné k vyčlenění do samostatných procedur, čímž by se zvýšila modulárnost a tedy i čitelnost. Samozřejmě je to pravda. Ne vždy je však takový přístup obecně použitelný. (Co když editujeme HTML, a ne program?)

Další výbornou pomůckou pro zvýšení orientace jsou bezesporu foldy. Díky nim můžete „sbalit“ část textu do jediného řádku a „rozbalovat“ jen tehdy, když s ním chcete pracovat. (Typicky se takto smrsknou celé funkce, popř. těla cyklů…) V orientaci v hluboko odsazených částech programu nám však mnoho nepomohou.

Řešením může být grafické zvýraznění odsazení. Na Internetu jsem našel pár pluginů pro VIM, které se snaží nějakým způsobem zvýrazňovat mezery na začátku řádku, s žádným jsem však nebyl na 100 % spokojen, a tak jsem si napsal svůj. Dovolím si jej nyní čtenářům Roota prezentovat.

Celý vtip spočívá ve vytvoření podadresáře ~/.vim/after/syn­tax, do kterého je třeba vložit soubor c.vim (za předpokladu, že chceme zvýrazňovat odsazování v jazyce C). Obsah souboru je následující:

syntax match xTab1 /^  / nextgroup=xTab2 containedin=ALL
syntax match xTab2 /  /  contained nextgroup=xTab3
syntax match xTab3 /  /  contained nextgroup=xTab4
syntax match xTab4 /  /  contained nextgroup=xTab5
syntax match xTab5 /  /  contained nextgroup=xTab6
syntax match xTab6 /  /  contained nextgroup=xTab7
syntax match xTab7 /  /  contained nextgroup=xTab2

highlight xTab1 guibg=#330000 guifg=White
highlight xTab3 guibg=#000033 guifg=White
highlight xTab5 guibg=#002200 guifg=White
highlight xTab7 guibg=#330000 guifg=White 

Mezi lomítka (/) na řádcích 1 až 7 vložte tolik mezer, kolik jste zvyklí odsazovat. (Já tam mám dvě.)

Ukázka grafického zvýraznění odsazování

Výsledkem je, že mezery použité jako odsazení získají mírně odlišnou barvu od pozadí, takže na větším souboru vzniknou svislé pruhy. Uvedené nastavení vyvede první dvě mezery v barvě červené, následují dvě černě, pak modře, zase černě, zeleně, černě… Dále se již barvy opakují.

Barvy sloupců můžete dle libosti měnit editací posledních čtyř řádků výpisu (začínajících „highlight“). Čísla za guibg lze pochopitelně měnit, a nastavit tak jiné barevné provedení.

Důležité je zmínit, že uvedeným postupem obarvíte pouze mezery. Pokud na odsazení používáte tabulátor, budete muset zdrojový kód mírně pozměnit.

Ještě připomínám, že pokud chcete, aby VIM automaticky převáděl stisk Tab v insert módu na patřičný počet mezer (třeba 2), vložte do svého .vimrc souboru toto:

set expandtab
set shiftwidth=2

A co dělat, chceme-li si zvýrazňování odsazení užít i v jiných typech souborů a ne jenom v céčku? Stačí jednoduše vytvořit příslušné soubory ~/.vim/after/syn­tax/typ_soubo­ru.vim. Dostačující bude vyrobit několik symbolických odkazů na náš c.vim:

davame_internetu_obsah
       
cd ~/.vim/after/syntax
ln -s c.vim php.vim
ln -s c.vim html.vim
ln -s c.vim java.vim

…atd.

Disclaimer: toto je první verze řešení. Podle Murphyho zákonů i empirických programátorských pravidel se určitě v prezentovaném kódu vyskytne nějaká chyba. Autor proto prosí o ušetření před ukamenováním za jakékoliv nesrovnalosti, které, jestli způsobeny, jsou neúmyslné.

Michal Burda

Michal Burda

Michal Burda vystudoval informatiku a aplikovanou matematiku a nyní pracuje na Ostravské univerzitě jako odborný asistent. Zajímá se o data mining, Javu a Linux.

Školení: Linux – Firemní server

Na třídenním školení se naučíte nainstalovat a spravovat kompletní linuxový server do Vaší firmy se všemi základními službami, které potřebujete pro provoz Vaší sítě, firemních emailů a webových stránek.

Podrobnější informace a přihláška

Ohodnoťte jako ve škole:
Průměrná známka 2,53

Přehled názorů

Skoky na konec bloku
Milan Vančura 16. 12. 2003 08:48
Nový
└ 
Re: Skoky na konec bloku
jam 16. 12. 2003 16:03
Nový
 
└ 
Re: Skoky na konec bloku
Milan Vančura 17. 12. 2003 09:43
Nový
 
 
└ 
Re: Skoky na konec bloku
jam 17. 12. 2003 12:18
Nový
Super tip :-)
Vladimir Kralik 16. 12. 2003 09:31
Nový
Refill-mode
lzap 16. 12. 2003 09:36
Nový
└ 
Re: Refill-mode
Milan Vančura 16. 12. 2003 09:51
Nový
 
├ 
Re: Refill-mode
Milan Vančura 16. 12. 2003 10:05
Nový
 
└ 
Re: Refill-mode
lzap 17. 12. 2003 14:22
Nový
Mezery vs Tab
MaKr 16. 12. 2003 10:05
Nový
├ 
Re: Mezery vs Tab
Milan Vančura 16. 12. 2003 10:14
Nový
├ 
Re: Mezery vs Tab
Marcel Svitalský 16. 12. 2003 10:17
Nový
│
└ 
Re: Mezery vs Tab
jam 16. 12. 2003 16:11
Nový
│
 
└ 
Re: Mezery vs Tab
Marcel Svitalský 16. 12. 2003 22:25
Nový
├ 
Re: Mezery vs Tab
Petr Pražák 16. 12. 2003 10:20
Nový
├ 
Re: Mezery vs Tab
MaKr 16. 12. 2003 10:39
Nový
│
└ 
Re: Mezery vs Tab
Milan Vančura 16. 12. 2003 11:48
Nový
│
 
└ 
Re: Mezery vs Tab
Lampa 16. 12. 2003 13:35
Nový
│
 
 
└ 
Re: Mezery vs Tab
Milan Vančura 16. 12. 2003 14:26
Nový
└ 
Re: Mezery vs Tab
bk 16. 12. 2003 16:33
Nový
 
├ 
Re: Mezery vs Tab
Yeti 16. 12. 2003 17:46
Nový
 
├ 
Re: Mezery vs Tab
gmmns 16. 12. 2003 22:39
Nový
 
└ 
Re: Mezery vs Tab
Radek Podgorny 17. 12. 2003 00:06
Nový
 
 
├ 
Re: Mezery vs Tab - dodatek
Radek Podgorny 17. 12. 2003 00:26
Nový
 
 
│
└ 
Re: Mezery vs Tab - dodatek
Yeti 17. 12. 2003 14:59
Nový
 
 
│
 
├ 
Re: Mezery vs Tab - dodatek
Radek Podgorny 17. 12. 2003 17:31
Nový
 
 
│
 
└ 
Re: Mezery vs Tab - dodatek
BVer 20. 12. 2003 11:34
Nový
 
 
└ 
Re: Mezery vs Tab
Yeti 17. 12. 2003 14:54
Nový
 
 
 
└ 
Re: Mezery vs Tab
Radek Podgorny 17. 12. 2003 19:18
Nový
php funkce
Matous Cervenka 16. 12. 2003 10:34
Nový
├ 
Re: php funkce
Milan Vančura 16. 12. 2003 10:38
Nový
├ 
Re: php funkce
Peter Cech 16. 12. 2003 11:36
Nový
├ 
Re: php funkce
anonymní uživatel 16. 12. 2003 12:18
Nový
└ 
Re: php funkce
ludfan 16. 12. 2003 12:40
Nový
OT: styl
kvr 16. 12. 2003 12:53
Nový
Pouziti pri odsazovani s tabulatorem
Jan Pomikalek 16. 12. 2003 13:33
Nový
└ 
Re: Pouziti pri odsazovani s tabulatorem
Jan Pomikalek 16. 12. 2003 13:57
Nový
 
└ 
Re: Pouziti pri odsazovani s tabulatorem
Milan Vančura 16. 12. 2003 14:23
Nový
vim a java ?
marek 16. 12. 2003 14:06
Nový
├ 
Re: vim a java ?
burlog 16. 12. 2003 14:09
Nový
│
└ 
Re: vim a java ?
Petr Kubanek 16. 12. 2003 16:47
Nový
│
 
└ 
Re: vim a java ?
martin 17. 12. 2003 08:31
Nový
├ 
Re: vim a java ?
Martin Krauskopf 16. 12. 2003 17:10
Nový
└ 
Re: vim a java ?
Martin Krauskopf 16. 12. 2003 17:23
Nový
 
└ 
Re: vim a java ?
Vasek 17. 12. 2003 00:36
Nový
 
 
└ 
Re: vim a java ?
Martin Krauskopf 17. 12. 2003 00:49
Nový
omylem zasifrovany text
jan 17. 12. 2003 13:13
Nový
kdyz si takhle prasecky napisu oteviraci zavorky..
gek 17. 12. 2003 14:52
Nový
├ 
Re: kdyz si takhle prasecky napisu oteviraci zavor
kubik 17. 12. 2003 17:35
Nový
├ 
Re: kdyz si takhle prasecky napisu oteviraci zavor
Martin Krauskopf 17. 12. 2003 18:07
Nový
└ 
Re: kdyz si takhle prasecky napisu oteviraci zavor
Michal Burda 18. 12. 2003 15:46
Nový
 
└ 
A proč by to nepomohlo?
Miloslav Ponkrác 19. 12. 2003 01:10
Nový
indent & <home>, indent & zalomení
Jaroslav Henner 17. 12. 2003 22:40
Nový
└ 
Re: indent & <home>, indent & zalomení
Milan Vančura 18. 12. 2003 09:56
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem