Hlavní navigace

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

Michal Burda 16. 12. 2003

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!

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:

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é.

Našli jste v článku chybu?

20. 12. 2003 11:34

BVer (neregistrovaný)

Naprosty souhlas, kod budiz vzdy neproporcionalni.
Je ale nutno rozlisovat tabelator coby znak (ten by mel vyhynout) a tabelator klavesu (uzitecna zalezitost, expanduje-li se do mezer :-)

Jeste bych chtel v teto souvislosti pripomenout, ze tabelator-znak ma nekdy bohuzel i syntakticky vyznam (napr. Makefile). Nastesti jde cim dal vice o historii.





19. 12. 2003 1:10

Miloslav Ponkrác (neregistrovaný)

Já taky píšu závorky pod sebe. Pokud napíšu cyklus přes jednu obrazovku, používám foldy na "zavření" úrovní cyklu.

Osobně mi přijde používání závorek pod sebe jako bloků mnohem čitelnější, než ten styl, kdy otevírací závorka se píše hned za podmínku. Ale uznávám, že je to věc názoru.

Pořád mě osobně přijde, že při závorkách pod sebe se u kratších či delších cyklů oko chytá lépe, než při druhém stylu.

A snad jen poznámku, že jakékoli delší cykly nezávisle na stylu se hůř chytají okem. Pr…





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

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

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

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

Přehledná titulka, průvodci, responzivita

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

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

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

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

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

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

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

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

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

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

Jsou čajové sáčky toxické?

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

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

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

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život