Zvýrazňování syntaxe
Každý slušný editor dnes již dovede zvýrazňovat syntaxi zpracovávaných souborů. Barevně odlišuje různé významné prvky v textu, jako jsou klíčová slova, příkazy, identifikátory a podobně. Je pochopitelně určeno pro texty, které mají nějakou vnitřní strukturu - programovací jazyky, HTML kód, zdrojový text pro TeX či *roff a podobně. Vim v současnosti podporuje několik set formátů a není problém doplnit si vlastní. Definiční (syntaktické) soubory se nacházejí v adresáři /usr/share/vim/syntax (případně /usr/local/…).
Příkaz :syntax on
aktivuje zvýrazňování a zároveň načte sadu příkazů určujících pravidla pro barevnost editovaného souboru. Toto rozhodnutí vychází z přípony souboru, případně z obsahu jeho prvního řádku. Pokud by se Vim spletl, můžete jej následně opravit příkazem :set syntax=
název. Kde název je vlastním jménem některého ze syntaktických souborů - třeba :set syntax=xml
.
Pokud vám standardní barvy nevyhovují (to se snadno může stát, protože některé sady pravidel jsou dost zběsilé), můžete si je změnit, i když ne zcela jednoduše. Musíte prozkoumat příslušný syntaktický soubor. Najdete v něm především informace dvou typů: Příkazy syntax
určují kategorii, do které daná skupina znaků patří. Například, že skupina znaků uzavřených do uvozovek je řetězec znaků. Příkazy highlight
pak stanoví, jak bude která kategorie vypadat. Třeba
highlight String term=bold ctermfg=Green guifg=#30a030
Barvu lze popsat pro tři kategorie zařízení: černobílý terminál ( term
), barevný terminál ( cterm
) a okno v grafickém režimu ( gui
). Za poslední dvě je třeba vždy ještě uvést, zda definujete barvu textu ( fg
) či jeho pozadí ( bg
).
Chcete-li změnit některou barvu, musíte nejprve najít kategorii, které byla přiřazena. Lze vyjít buď z příkazů highlight
a orientovat se podle barvy, nebo analyzovat příkazy syntax
. Většinou se dá udělat kvalifikovaný odhad podle jména kategorie a ten pak upřesnit podle obsahu příkazů.
Požadovaného vzhledu pak dosáhnete úpravou či předefinováním příkazu highlight
. Doporučuji nechat původní syntaktický soubor a úpravu barev provést sadou příkazů highlight
, které vložíte do konfiguračního souboru za syntax on
.
Například na svém notebooku edituji prakticky výlučně v grafickém režimu, takže ideálním místem pro úpravy vzhledu je soubor gvimrc. Ten můj obsahuje
highlight Normal guifg=lightgray guibg=black highlight Search guibg=#996666 highlight Visual guibg=#666666
Upravuje tedy barvy pro běžný text a pozadí pro zvýraznění nalezených řetězců a vybraného bloku (tzv. vizuální režim).
Vylepšujeme hledání
Základní užitečností při hledání je nastavení :set hlsearch
. Způsobí, že Vim barevně zvýrazňuje všechny výskyty naposled hledaného řetězce. To se hodí jak při hledání samotném, tak při ladění regulárních výrazů pro hledání a nahrazování. I tohle hledání se totiž počítá a vy tak můžete vidět, které znaky vyhovují zadanému vzoru.
Toto zvýraznění se dá dočasně potlačit příkazem :nohlsearch
. Po jeho použití zvýraznění zmizí, ale jakmile znovu něco vyhledáte, opět se objeví. Srovnejte toto chování s příkazem :set nohlsearch
, který zvýrazňování vypne trvale.
Hodně kontroverzní je :set incsearch
. Použijete-li tento příkaz, Vim již při zadávání hledaného řetězce ukazuje jeho první výskyt (tedy místo, kam vás přesune hledání). Kurzor však zůstává na původním místě a teprve když zadání hledaného vzoru potvrdíte klávesou <Enter>, skutečně se přesunete na daný výskyt.
To je jistě užitečná služba, ale já osobně mám s jejím používáním problémy. Stručně řečeno zapomínám na závěrečný <Enter>. Když zadávám hledaný řetězec a Vim mi ukáže cílové místo, automaticky vnitřně zajásám a stisknu třeba kurzorovou klávesu nebo mám snahu psát nějaký příkaz. Přitom se ale stále ještě nacházím ve fázi zadávání hledaného řetězce, takže se editor začne chovat „divně“. Vždy jsem z toho dost zmatený a zatím jsem se ještě nevycvičil k tomu, abych incsearch
začal používat.
V souvislosti s hledáním jistě stojí za zmínku, že po :set ignorecase
nebude Vim rozlišovat malá písmena od velkých. Pokud si navíc zapnete :set smartcase
, bude to platit jen tehdy, když hledaný vzor zapíšete malými písmeny. Jakmile v něm použijete velké, bude jej hledat přesně v té podobě, v jaké byl zadán.
Editace textu
Základní výbavičku usnadňující editaci textu podle mého soudu tvoří:
:set backspace=2 |
ve vkládacím režimu lze volně vymazávat znaky |
:set showmatch |
zapíšete-li pravou závorku, ukáže vám k ní příslušející levou (krátce na ni poskočí kurzorem a zase se vrátí); hodně užitečné třeba pro TeXovské texty, které se hemží závorkami |
:set nojoinspaces |
nevkládá dvě mezery za větu při spojování řádků (nejsme Američani) |
Pro uspořádání textu má zásadní význam nastavení šířky řádku. Zajistí je příkaz
:set textwidth=
číslo. Zadáte-li nenulovou hodnotu, bude Vim „hlídat“ pravý okraj a kdykoli dojde k jeho překročení, přesune při psaní aktuální slovo na začátek nového řádku. To uvítáte při psaní textů. Naopak při vytváření programů je často vhodnější mít neomezenou délku řádku a o řádkování se starat svépomocí. V tom případě použijte :set textwidth=0
.
Speciálně pro zdrojové texty vám přijdou vhod různé režimy odsazování, které Vim dovede. Osobně používám :set smartindent
, který je z nich „nejchytřejší“. Stručně řečeno se chová tak, že zachovává odsazení od levého okraje a v odpovídajících situacích je zvětšuje (např. když začal nový blok), nebo naopak zmenšuje. Alternativně můžete použít režimy :set cindent
, který je striktněji vázán na jazyk C, či :set autoindent
, který pouze zachovává aktuální odsazení.
Jedna z věcí, které dovedou při zpracování textů pozlobit, jsou tabulátory. Někdo je rád používá, jiný se jim snaží vyhýbat. Ať patříte do jedné či druhé skupiny, Vim vám vyhoví.
Základní volbou pro vkládání tabulátorů je expandtab
. Použijete-li :set expandtab
, editor je bude nahrazovat mezerami. Stisknete-li ve vkládacím režimu tabulátor, Vim vloží tolik mezer, aby se dostal na nejbližší tabulátorovou pozici (jejich odstup lze určit pomocí :set tabstop=
číslo , implicitně je 8). Naopak při :set noexpandtab
(což je implicitní nastavení) se do textu vkládají skutečně znaky „tabulátor“.
Nastavení expandtab
má vliv jen na nově vkládané znaky, existujícího textu se netýká. Můžete však použít příkaz :retab
, který projde celý text a všechny tabulátory v něm převede podle současného nastavení expandtab
. Čili buď změní odpovídající počty mezer na tabulátory, nebo naopak. Je to velmi praktické, pokud musíte zpracovávat text, který odporuje vašim zvyklostem.
To je pro dnešek vše. Za týden se zaměříme převážně na makra a řeč bude i o spolupráci Vim s externím spellcheckerem ispell.