Hlavní navigace

Editor vi(m) a programování

Tomáš Zellerin 30. 6. 2000

Uživatel počítače tráví obvykle v prostředí editoru značnou část času. V prostředí Unixu podobných OS jsou zřejmě nejpoužívanějšími editory vi (s klony) a Emacs. Tento článek se zabývá pokročilejšími technikami v prvním z nich.

Editor vi je proslulý neobvyklým a zpočátku odrazujícím ovládáním – asi právě proto se každou chvíli někde objeví článeček na téma „vi pro začátečníky“. Já bych se zde chtěl věnovat poněkud pokročilejší tématice: méně známým vlastnostem editoru vi (a jeho velmi rozšířeného klonu vim – přiznám se, že jsem srostlý hlavně s ním a s „čistým“ vi mívám problémy) usnadňujícím programování.

Při psaní jsem čerpal hlavně z on-line helpu vim – takže pokud jej znáte nazpaměť, moc nového se nedozvíte. Mým hlavním problémem při používání tohoto helpu bylo, že jsem nevěděl co v něm hledat. Zde jsem se proto pokusil ukázat jen letmo některé věci, které vim umí, aby čtenáři věděli co lze v helpu nalézt.

Usnadnění editace

Abych neodradil neprogramátory hned na začátku, začnu obecněji použitelnou vlastností – doplňováním slov.

Používáte-li dlouhé identifikátory (nemusí to být zrovna „tohle_je_moje_ma­lá_lokální_pro­měnná“, ono opisovat znovu a znovu i třeba osmipísmenné slovo přestane bavit), stačí napsat několik prvních znaků a stisknout CTRL_p či CTRL_n; program doplní nejbližší slovo před či za kurzorem, které odpovídá danému začátku; opakovaným tisknutím se lze mezi odpovídajícími slovy přesouvat. Doplňované slovo je hledáno postupně v tomtéž souboru, ostatních otevřených oknech, ostatních načtených souborech a includovaných souborech (viz níže); kromě toho lze nastavit (pomocí proměnné complete či dictionary) „slovníky“, v nichž jsou slova dále hledána.

Kódy CTRL_p a CTRL_n mají několik bratříčků: CTRL_l umožňuje doplňovat celý řádek, a několik dalších kódů začínajících na CTRL_x má trošku jiné chování; za zmínku snad stojí CTRL_x CTRL_k, které vyhledává pouze ve slovníku definovaném pomocí proměnné dictionary.
(velmi užitečné je také doplňování CTRL_x CTRL_f, které doplňuje cestu na disku, což využijí zejména webdesigneři při tvorbě relativních odkazů – pozn. redakce)

Vyhledávání

Asi každý uživatel vi umí vyhledávat pomocí ‚/‘, ‚?‘, ‚n‘ a ‚N‘. Možná, že ne až tak známá je možnost použít # a * k nalezení slova pod kurzorem; * hledá dopředu, # dozadu. V tomto odstavci bych ale psal rád o něčem trochu jiném.

Představme si, že jsme dostali od někoho program, který chceme pochopit. V programu je volána funkce socket, o které jsme v životě neslyšeli. Z vi lze přímo vyvolat odpovídající manuálovou stránku, zmáčkneme-li (po přesunutí kurzoru na toto slovo) velké K.

O kousek níž je použita jakási struktura sockaddr_in. Manuálová stránka z tímto jménem neexistuje, zkusíme tedy něco jiného. Stiskem „[“ „I“ si zobrazíme všechny výskyty tohoto slova v tomto souboru, jakož i ve všech includovaných hlavičkových souborech. Výskyty jsou očíslovány; zatímco z prvního je zřejmé, že jde o jakýsi komentář, druhý vypadá nadějně. Stiskem 2 „[“ „CTRL_i“ přeskočíme na dané místo daného hlavičkového souboru.

Na stejné řádce je použita konstanta AF_INET. Je to velkými písmeny, bude to tedy nejspíš makro; jeho definici lze zobrazit pomocí „[“ „D“ a skočit na ní pomocí „[“ „CTRL_d“. Kdyby definic bylo víc, lze vybrat jinou než první opět pomocí předsazení čísla.

(Poznámka na okraj: obvykle termín „definice slova“ znamená „#define slovo“ a „includovaný soubor“ soubor zavedený pomocí „#include“ ze standardních cest – vi patří k unixu a tudíž k jazyku C. Je ale možné nastavit definici třeba na \def a includovací příkaz na \input a používat tento mechanismus v TeXu; navíc lze nastavit provádění příslušných příkazů „:set“ při každém natahování TeXového souboru.)

Užitečné může být i nalezení párové závorky či direktivy preprocesoru #if/ifdef/else/en­dif (klávesa „%“), skok na začátek či konec funkce pomocí „[[“ a „]]“ (i když tohle funguje vyhledáváním { a } v prvním sloupci, čili to lze velmi snadno zmást), nebo zjištění, zda daný text je zanořen v nějakém #if či #ifdef („[#“ skočí na nejvnořenější podmínku).

Soubor, na jehož jméně je kurzor (třeba v #include) lze začít editovat stiskem „gf“.

Integrace make a grep

Naprostá většina unixových programů se překládá pomocí utility „make. Tu lze samozřejmě spustit z vi (); pokud ale vynecháme onen ! (tedy pouze ":make <target>“), vim uloží chybový výstup do souboru, prohlédne jej, a poté skočí na první chybu. Poté můžeme skákat po chybách pomocí „:cn“ (dopředu) a „:cN“ (dozadu). To celé funguje pro výstup z gcc překladače; pro jiné programy volané pomocí make může být potřeba nadefinovat jak vypadá chybový výstup (samozřejmě musí obsahovat jméno souboru a číslo řádky, aby toto mohlo fungovat). To samé funguje pro grep: „:grep <vzor> <soubory>“ skočí na první nalezený výskyt vzoru atd.

Soubor tags a jeho používání

Ve větším programovém projektu je výhodné, máme li možnost si „odskočit“ na definici funkce či proměnné, na níž jsme narazili. To lze realizovat pomocí tzv. tagů. Pro jejich používání potřebujeme mít soubor s názvem tags, který obsahuje na každém řádku název tagu (třeba jméno funkce), název souboru v němž tag je, a příkaz – obvykle je to buď vyhledávací příkaz nebo číslo řádku (to je také příkaz – :57 skočí na řádek 57). Na daný tag můžeme skočit při spuštění vim (vim -t <jméno tagu>), příkazem „:ta <jméno tagu>“, nebo stiskem „CTRL-]“ na hledaném slově. Zpět se lze vrátit pomocí „CTRL_T“.

Soubor tagů samozřejmě nemusíme vytvářet ručně. Existují programy (jmenují se obvykle ctags nebo nějak podobně), které vezmou jako parametr (kromě případné haldy konfiguračních možností) seznam souborů se zdrojovými texty a soubor tags vytvoří.

Tagů ale využít i mimo programátorské prostředí – dobrým příkladem je vlastní help vim, jehož hypertextová propojení jsou realizována právě přes tagy.

Závěr

Pokusil jsem se ukázat některé méně často užívané možnosti programu vim, bez nároku na úplnost a přesnost. Předpokládám, že zájemce o jemnější nuance si dané téma případně prohlédne v on-line nápovědě.

P.S.: Máte při psaní (nejen) programů zapnuté zvýrazňování (syntax highlighting)? Pokud ne, zkuste „syntax on“, třeba vám to také usnadní práci, a hlavně hledání chyb.

Odkazy

Vim homepage
Exuberant ctags homepage

Našli jste v článku chybu?

25. 9. 2012 13:41

vje (neregistrovaný)

tento clanek i dalsi osobny rady od Tomase jsou mi ku prospechu dnes a denne. velmi dekuji! vjera

13. 7. 2000 14:55

Jaroslav Kodet (neregistrovaný)

.. ale JA tu adresu vim.
Adresa online verze prirucky editoru vim jsou (mozna prekvapive) na adrese http://www.kit.vslib.cz/~satrapa/docs/vim
:-))



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

Přehledná titulka, průvodci, responzivita

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

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

ČRo rozšiřuje DAB do Berouna

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

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

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

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

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

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

Jak vymáhat výživné zadarmo?

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

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

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

EET: Totálně nezvládli metodologii projektu

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

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

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

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

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

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

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

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

Jsou čajové sáčky toxické?

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?