Vim (výslovnost ; zkratka z Vi IMproved) je open source textový editor, který lze spustit v prostředí většiny operačních systémů. Je oblíbený zejména mezi zkušenými uživateli operačních systémů unixového typu. Kromě klasického Vimu existuje celá řada editorů, které jsou založeny na principu Vimu, ale mají nějaké specifické vlastnosti např. Yzis pro prostředí KDE.
Vlastnosti
Modální editor Vim je modální editor. A i když Vim modální koncept ovládání nevymyslel, výborně ho adoptoval a rozvinul a tím se postaral o přijetí tohoto konceptu ovládání textových editorů. Vim je vzorem pro mnoho dalších modálních editorů a rozšíření. Viz kapitola klony Vimu.
Modální ovládání je populární zejména mezi vývojáři, pro které je práce s textovým editorem denní chleba. Výhodou modálního ovládání je vysoká efektivita editace textu, nevýhodou obtížnost naučit se tomuto ovládání. Investovat čas a naučit se ovládat Vim se vyplatí lidem, kteří editují spoustu strukturovaného textu. Typický uživatel Vimu je programátor nebo unixový admin. Pokud někomu přijde ovládání Vimu složité, nemýlí se.
Modální ovládání znamená, že ovládání probíhá v různých módech. V různých módech editor na stejné klávesové příkazy reaguje různě. Základní mod (v češtině se také používá pojem režim) je mod Normal. V něm lze prohlížet text a s textem manipulovat pomocí příkazů, ale nejde v něm psát.
Příkaz je stisknutí jedné nebo více (sekvenčně) kláves. Protože v modu Normal nejde psát, lze jako příkazy používat obyčejné znaky na klávesnici bez modifikátorů. To usnadňuje jejich zadávání. Například příkaz x smaže znak pod kurzorem.
Příkazy Vimu se neomezují jen na kombinaci různých operaci s různými textovými objekty. Jsou tu příkazy jako Ctrl-A která zvýší číslo o jedna, nebo tečka, jenž zopakuje poslední příkaz a mnohé další. Opakování příkazu je silné právě díky existenci obecných textových objektů (jeich víc, včetně vět, odstavců, obsahy závorek atd). Ještě silněji výhodu textových objektů oceníme při nahrávání maker, tedy možnost zopakování několika příkazů najednou.
Jeden z příkazů je příkazi, který zapíná modu Insert. V tomto modu lze vkládat (psát) text. Když se napíše 'dd' vloží se do textu 'dd'. V tomto modu Vim nejvíce připomíná ostatní editory. Příbuzný je mod Replace, který text nevkládá, ale přepisuje. Tento režim mají i některé běžné editory – s trochou nadsázkou je můžeme považovat také za modální. Další běžné mody jsou mod Visual pro označování textu a mod Command-line pro příkazovou řádku. Příkazovou řádku potřebujeme pro příkazy, kterým potřebujeme předávat parametry. V běžných editorech se místo toho používají dialogová okna. A existují i další speciální mody.
Textové a GUI rozhraní náhled|Plugin WAI-Fmm9 - ukázka možností textového rozhraní Vim má grafické rozhraní, ale jeho původ je terminálový a stále je určen pro používání v terminálu. Grafické rozhraní je proto jen volitelná nadstavba a veškerá funkčnost Vimu je a musí být dostupná skrz textové rozhraní a tomu je uživatelské rozhraní Vimu přizpůsobeno. Všechno se proto odehrává v jednom textovém okně.
náhled|Vim na Androidu v Termuxu Ale i samotné textové rozhraní je chudé a je primárně postaveno na používání příkazového řádku místo dialogových oken, byť v textové podobě. Moderní Vim od verze 8 podporuje popup okna, která se občas používají, třeba při doplňování textu, ale základního ovládání se to nedotklo. Neexistuje factory dialog pro vyhledávání textu nebo dialog pro ukládání souboru, to vše se stále dělá na příkazovém řádku. Ale některé pluginy, jako třeba plugin WAI-Fmm9, ukazují, že v tomto směru jsou možnosti Vimu nevyužity. Viz obrázek pluginu Fmm9, který ukazuje dva spuštěné Vimy, jednou s popup oknem obsahu složky a jednou s oknem menu složky. Vim sám takové rozhraní nenabízí i když ho umožňuje vytvořit.
Textový režim i příkazový řádek mají své výhody a jsou užitečné dodnes. Díky němu můžeme mít Vim například na moderním tabletu s Androidem v Termuxu a mít tak plnohodnotné vývojové prostředí na Androidu. Klony Vimu se dokonce ani nenamáhaly GUI implementovat na rozdíl od samotného Vimu.
Příkazy V příkazech se skrývá hlavní síla Vimu. Příkaz je povel, který pošleme vimu téměř jakoukoliv stisknutou klávesou na klávesnici. Třeba Enter, Ctrl-A nebo jen ..
Vim má hodně příkazů a další mohou lřidat pluginy a také si je může definovat každý uživatel, a to se od něj i očekává. Pro něco takového neexistuje na klávesnici dostatek znaků ani za pomoci Shift, Ctrl a Alt modifikátorů. Proto Vim podporuje víceznakové příkazy. Samozřejmě co nejkratší, aby dalo co nejméně práce je napsat. To vede k záhadným zkratkám, které neznalý uživatel nemá šanci rozklíčovat, třeba příkazívé sekvence vipgq nebo ggVGd. To první třeba označí celý aktuální odstavec 'vip' a přeformátuje ho 'gq'. Na to druhé vám v normálním editoru stačí napsat jen Ctrl-A a Del. Někdy se Vimu efektivita vymyká z ruky.
Aby se příkazy lépe pamatovaly, snaží se Vim mít příkazy mnemotechnické a logicky uspořádané. Aby to fungovalo, je potřeba ovládat trochu angličtinu. Například mazání, to vždy obsahuje příkaz d (delete) a pak následuje informace o tom, co má smazat.
S tím soujvisí další schopnost Vimu, práce s textovými objekty. Vim se snaží rozpoznat strukturu textu a s ní pracovat. Slova, věty, odstavce a různé bloky textu vymezené třeba závorkami, uvozovkami nebo html tagy a podobně. Lze si definovat i vlastní textové objekty třeba v nějakých textových databázích. Standardní textové objekty jsou konfigurovatelné a u slov se navíc rozlišují dva druhy, velká W a malá w (word) slova.
Příkaz dw smaže malé slovo, dW velké slovo. Velká slova jsou rozdělena jen prázdnými znaky jako mezera či tabulátor. Malá slova tvoří zpravidla jen písmena, čísla a podtržítka a vše ostatní je rozděluje, takže text 'třída.metoda' je jedno Slovo a 3 slova (třída, ., metoda).
Krom textových objektů lze příkazy delete a spol kombinovat i s příkazy pohybu, kam spadá i vyhledávání. Například fx znamená jdi na nejbližší znak 'x'. Příkaz dfx znamená smaž text až po nejbližší znak 'x'. Také lze zadat počet opakování, tedy 3diw smaže tři slova.
Příkaz d není jediný, je jich ve Vimu více, se všemi se pracuje podobně, mazi ty základní patří ještě y pro kopírování (yank) a c pro změnu (change). Kdo umí pracovat s 'd', umí i s těmi ostatními. Je to trochu složité, ale ne nepřekonatelně a kdo si takové ovládání zažije a naučí se to podvědomě používat, ten může text editovat velmi efektivně.
Textové objekty mají ještě jedno skvělé využití, a to jsou makra. Díky obecným textovým objektům mohou být hodně univerzální a tím zjednodušit i komplexní formátování velmi rozsáhlého opakujícího se textu. Makra se vutváří nahráváním, je to jen záznam příkazů uživatele, takže je to pohodlné a rychlé. Potom stačí dát příkaz 1000@q a během sekundy upravit 1000 bloků textu makrem 'q'.
Příkazy na úpravu textu jsou jen malá podmnožina příkazů Vimu. Předchozí popis je jen ukázka principů, na kterých Vim stojí.
Pomocí příkazu příkazového řádku :map a řady jeho variant pro různé režimy si může uživatel namapovat své vlastní příkazy. Lze definovat i vlastní textové objekty. Když si to napíše do konfiguračního souboru, bude to fungovat už na vždy. Uživatelé Vimu tohle dělají, přizpůsobují si Vim svým vlastním preferencím a potřebám, Vim každého uživatele je proto trochu jiný. Vim udržuje zpětnou kompatibilitu desítky let, proto jeho konfigurační soubor může být rozšiřován také desítky let, mít za tu dobu stovky i tisíce řádků nastavení, které Vim plně přizpůsobují potřebám a preferencím uživatele.
Příkaz :imap mapuje příkazy pro mod Insert. Zajímavé je, že lze mapovat příkazy i na prostý text. Například lze využít faktu, že za čárkou se píše mezera a tak nikdy v normálním textu nebudete potřebovat napsat ,f a udělat si z toho příkaz, třeba „:imap ,f function(“ a kdykoliv napíšete do textu ,f, vloží se do něj slovo „function(“. Lze ale dělat cokoliv, nejen vkládat text. Třeba si na příkaz ,, namapovat přeskočení kurzoru do vedlejšího okna.
Registry Registry Vimu jsou pojmenované paměťové oblasti, se kterými lze pracovat, něco jako pojmenované schránky (clipboard). Registry jsou dvou druhů, obecné a speciální. Obecné slouží k ukládání textů do paměti a pro nahrávání maker, běžně do nich zapisujeme i z nich čteme. Speciální registry si pak samy pamatují různé věci, třeba naposledy vyhledávaný text. Ty slouží ke čtení i když i do některých speciálních lze zapisovat. Obecné registry jsou pojmenovány a až z a A až Z, speciální
Na registr se odkazujeme znakem ". Např. "r je registr r. Na příkazovém řádku pak do něj vložíme text pomocí Ctrl-r a ve skriptech ho můžeme číst či zapisovat pomocí znaku @, třeba :let \@r = \@s (do registru r kopírujeme obsah registru s).
Pokud neuvedeme registr, použije se defaultně registr " (odkazujeme se na něj jako na ""). V něm najdeme výsledek poslední textové operace. Najdeme ho i v registru 0, v registru 1 předposlední, v registru 2 před předposlední a ták dále až do registru 9. Registr * je propojen se systémovou schránkou. Tam najdeme to, co jsme kopírovali do schránky v jiném programu nebo zápisem do tohoto registru můžeme poslat text do schránky pro jiné programy.
Příkazový řádek Nějakou zjednodušenou podobu příkazů má každý textový editor, byť se jim většinou říká hotkeys. Příkazový řádek tak obvyklý není. Ale funkčně se dá připodobnit k jednoduchým dialogovým oknům a menu. Slouží ke spouštění příkazů, kterým předáváme parametry. Třeba při nahrazování textu, otvírání nového souboru a podobně. Ale existují i bezparametrové příkazy třeba pro zavření všech oken a také lze volat funkce skriptovacího jazyka, ať systémové nebo vlastní.
Ve Vimu jsou tři mody příkazového řádku, mod Command-line a mod Ex primitivní a moderní. Command-line se vyvolá příkazem : a po provedení příkazu se ukončí, je jednorázový. Příkazem Q se přepneme do modu Ex a dýchne na nás pradávná historie. Mod Ex je relikt nejprimitivnější doby textových editorů, kdy se text nedal psát přímo, ale jen pomocí příkazového řádku a na slepo. V tomto režimu se nedá ani editovat sama příkazová řádka, lze jen mazat, nefunguje v ní maping ani abbreviations. Tento režim ukončíme příkazem :vi. Příkazem gQ pak zapneme moderní podobu modu Ex, je to běžný moderní příkazový řádek jaký vyvoláme příkazem :, jediný rozdíl je, že se po vykonání příkazu neukončí a zůstáváme v něm. Ukončí se opět příkazem :vi.
Dialogová okna mají výhodu v tom, že si uživatel toho nemusí moc pamatovat a mohou být komplexnější. Vim s gui také může mít dialogová okna, ale to je nadstandardní luxus a Vim musí být schopen se bez nich obejít, protože musí fungovat i na terminálu. Příkazový řádek má ale řadu výhod a silných stránek.
Historie – Vim si pamatuje zadávané příkazy, historii lze vyvolat a lze ji procházet pomocí šipky nahoru a dolů, nebo lze zobrazit seznam příkazů příkazem :history Zkrácená jména – Při psaní příkazu nemusíte zadávat celý název, stačí nejkratší možnou část, která příkaz jednoznačně identifikuje. Po zadání kratšího názvu se volí podle priority. Např. :h = :help, :hi = :hilight a :his = history. Není to podle abecedy, třeba :d = :delete i když existuje i příkaz :debug. Vlastní příkazy – Vim umožňuje vytvořit si vlastní příkazy. Typicky tak, že si ve VimScriptu napíšeme nějakou složitou funkci, která například komplexním způsobem manipuluje s textem a tu pak napojíme na vlastní příkaz, aby šla snadno spouštět z příkazového řádku. Vlastní funkce musí začínat Velkým písmenem, aby nemohlo dojít ke konfliktu s vnitřními funkcemi Vimu. Pomocí vlastních komplexních funkcí tak můžeme Vim rozšířit o mnoho možností, takto vznikají rozšiřující pluginy pro Vim.