Vim ve funkci textového editoru pro tvůrčí psaní

16. 4. 2020
Doba čtení: 24 minut

Sdílet

V souvislosti s editorem Vim jsme se zabývali většinou tím, jak jej lze použít pro vývoj či jako užitečnou pomůcku pro administraci systému. Ovšem lze ho upravit i do podoby editoru pro tvůrčí psaní.

Obsah

1. Vim ve funkci textového editoru pro tvůrčí psaní

2. Co se skrývá pod termínem distraction-free editor

3. Znovuobjevení kola?

4. Textový editor Vim ve funkci distraction-free editoru

5. Nastavení velikosti plochy pro zobrazení textu

6. Vycentrování plochy pro zobrazení textu

7. Skrytí okrajů pomocných oken

8. Nastavení týkající se stavového řádku, popř. ovládacích elementů GUI

9. Změna rozestupu mezi textovými řádky

10. Volba vhodného formátu pro tvorbu

11. Parametry editace

12. Automatické přeformátování odstavců během úprav textů

13. Nastavení tvaru a barvy textového kurzoru

14. Jednoduchý modul pro zapnutí a opětovné vypnutí distraction-free režimu

15. Easy režim

16. Další pluginy pro Vim s podobnou funkcí

17. Odkazy na Internetu

1. Vim ve funkci textového editoru pro tvůrčí psaní

Jak jsem se již zmínil v perexu dnešního článku, čtenáři se mohli s textovým editorem Vim na stránkách Rootu setkat již nesčetněkrát. Většinou jsme se však zabývali těmi vlastnostmi Vimu, které jsou užitečné pro vývojáře, popř. pro administrátory, tj. tím, jak lze Vim používat pro úpravu silně strukturovaných dokumentů (zdrojových kódů, konfiguračních souborů, dokumentů vytvořených ve značkovacích jazycích aj.). Příkladem takového přístupu může být například seriál Textový editor Vim jako IDE. O Vimu se sice běžně mluví jako o programátorském textovém editoru, ovšem ve skutečnosti jsou jeho praktické možnosti mnohem větší. O tom se přesvědčíme dnes, protože si ukážeme, jakým způsobem lze Vim nakonfigurovat takovým způsobem, aby byl použitelný jako takzvaný editor pro tvůrčí psaní, což je velmi volný (ale příhodný) překlad termínu distraction-free editor. Ukazuje se tak, jak jsou možnosti Vimu, resp. přesněji řečeno možnosti jeho konfigurace, široké.

*

Obrázek 1: Příklad pluginu pro Vim, který z tohoto editoru vytvoří užitečný diář.

Poznámka: nastavení editoru, a Vim skript, který si dnes vysvětlíme, je odvozen ze skriptu, který naleznete v článku Distraction free writing in Vim. Ovšem podobné koncepty byly (nezávisle na sobě) vyvinuty i dalšími vývojáři.
*

Obrázek 2: Modul určený pro organizaci poznámek; lze zkombinovat s výše zmíněným modulem pro diář.

2. Co se skrývá pod termínem distraction-free editor

Co se ale vlastně skrývá pod termínem editor pro tvůrčí psaní, popř. pod jeho anglickým ekvivalentem? Termín distraction-free (text) editor je poměrně vágní (autoři různého SW si ho vykládají taktéž různě), ovšem většinou se jím označuje takový textový editor, popř. textový procesor, který zobrazuje své rozhraní na ploše celé obrazovky [1] a neobsahuje mnoho ovládacích prvků. V limitní podobě nejsou zobrazeny prakticky žádné ovládací prvky – pouze vlastní editovaný text a kurzor ukazující pozici, kde dochází k editaci. Existují ovšem i editory, které jdou ještě dále, protože emulují mechanický nebo elektromechanický psací stroj: text se pouze přidává na konec editovaného souboru a většinou nejsou podporovány žádné další operace (dokonce ani pohyb v textu), maximálně funkce BackSpace. To je ovšem – alespoň podle mého skromného názoru – jen pozérství, které zcela zbytečně ignoruje vývoj posledních 45 let v IT, tj. masivní prosazení počítačů s plně interaktivním rozhraním, které umožňuje rychle opravit různé chyby a nedodělky. Proto budeme v tomto článku za plnohodnotný a prakticky použitelný editor pro tvůrčí psaní (distraction-free) považovat aplikaci se zhruba následujícími vlastnostmi:

  • Umožňuje běh (zobrazení) na celé ploše obrazovky, ať již se jedná o program s grafickým uživatelským rozhraním či o editor běžící v terminálu (či přímo na textové konzoli).
  • Umožňuje vypnout většinu ovládacích prvků, ideálně až do stavu, kdy je vidět pouze editovaný text a textový kurzor.
  • Podporuje všechny základní editační operace, vyhledávání v textu apod.
  • Ideálně by měl podporovat slovník a kontrolu pravopisu.
  • Taktéž by bylo dobré, aby bylo podporováno zvýrazňování syntaxe u často používaných formátů dokumentů (AsciiDoc, MarkDown, reStructuredText, …).
  • Měl by podporovat Unicode (což je dnes již většinou samozřejmost)
  • Někteří autoři vyžadují i funkci pro počítání slov, protože u některých typů dokumentů je nutné se vejít do zadaného rozsahu (mnohdy je to ovšem kontraproduktivní).
  • Osobně oceňuji i možnost konfigurace tvaru, barvy a popř.(ne)blikání kurzoru.

Obrázek 3: Typickým zástupcem editorů pro tvůrčí psaní je PyRoom. Černý okraj je součástí designu editoru, protože jeho plocha musí zabrat celou obrazovku a širokoúhlé obrazovky nejsou příliš vhodným médiem pro tvorbu textů (pokud se ovšem neotočí o 90°).

Poznámka: v některých případech je zvýrazňování syntaxe nahrazeno přímým zobrazením dokumentu (typicky MarkDown) v podobě, kterou známe z textových procesorů, ovšem při psaní je lepší se soustředit na vlastní text a nikoli na způsob je pozdějšího zobrazení (viz například mnoho užitečných rad od Stephena Kinga).

Obrázek 4: GhostWriter je dalším známým editorem pro tvůrčí psaní. Dokáže přímo pracovat s MarkDownem a má jen minimum viditelných ovládacích prvků.

3. Znovuobjevení kola?

Popularita textových editorů určených pro tvůrčí psaní je do určité míry reakcí na stále se zvyšující komplikovanost uživatelských rozhraní, různých oznamovačů nových zpráv, připravených update atd. – počítač (resp. jeho rozhraní viditelné uživateli) se tak ze sluhy, který pouze tiše očekával příkazy od uživatele změnil v zařízení, které si (mnohdy neustále) vyžaduje pozornost a tím pádem ji odvádí od reálné práce. Ve skutečnosti ale nejsou distraction-free editory v žádném případě něčím nově objeveným, protože mnoho textových editorů pocházejících z éry osmibitových domácích mikropočítačů, popř. osobních mikropočítačů používalo – prakticky to byla nutnost vynucená technickými omezeními – taktéž minimalisticky pojaté uživatelské rozhraní (a samotné desktopové rozhraní, pokud vůbec existovalo, bylo taky relativně minimalistické a především pasivní). Mnoho tehdejších editorů bylo vybaveno buď pouze stavovým řádkem, popř. kombinací stavového řádku a řádku s menu. A u některých editorů bylo možné oba zmíněné ovládací prvky vypnout a mít tak k dispozici celou plochu obrazovky pouze pro přípravu textu.

Poznámka: ovšem ve skutečnosti samotné rozhraní editoru pouze podtrhovalo tehdejší stav techniky, kdy počítač umožňoval spuštění jediné aplikace – což je vlastně pravý význam termínu distraction-free. Ostatně toto je jeden z důvodů, proč G.R.R.Martin používá pro psaní starý dobrý WordStar pro DOS (na počítači s čistým DOSem).

Některé z původních minimalisticky pojatých textových editorů jsme si již popsali v předchozích článcích o historii vývoje výpočetní techniky a grafického uživatelského rozhraní, takže si zde jen ukažme několik screenshotů pro připomenutí:

Obrázek 5: Relativně jednoduchý textový editor (a současně i textový procesor) SpeedScript ve variantě určené pro osmibitové domácí mikropočítače Atari. Tento editor nabízel základní formátovací funkce, vyhledávání, nahrazování atd. Namísto menu byl ovládán klávesovými zkratkami, které mj. ovlivňovaly i obsah stavového řádku zobrazeného v horní části obrazovky. Tento textový editor byl různými programátory upravován, takže existují minimálně dvě počeštěné verze (Čapek, Čížek) a jedna slovenská verze (Štúr) – viz též příslušné odkazy na konci článku.

Obrázek 6: SpeedScript byl portován i na počítače kompatibilní s IBM PC a operačním systémem DOS. Zde bylo možné využít zobrazení osmdesáti znaků na textovém řádku, což byl oproti původním osmibitovým variantám velký pokrok vzhledem k tomu, že se při tisku používalo cca 60 znaků na řádek.

Obrázek 7: TypeWriter je textový editor/procesor určený pro domácí osmibitové mikropočítače ZX Spectrum.

Obrázek 8: Textový editor známý pod jménem e.com byl vlastně prakticky ideálním minimalistickým editorem pro tvůrčí psaní. Dokázal nastavovat oba okraje textu, provádět základní editační příkazy, vyhledávání, spouštění maker atd. To vše zabaleno v jediném spustitelném souboru o velikost nepřesahující pět kilobajtů.

Obrázek 9: Editor Joe (zde ve variantě přeložené pro Linux) v režimu emulace textového procesoru WordStar. Horní nápovědu i prakticky všechny další ovládací a informační prvky je možné vypnout a soustředit se pouze na psaní.

4. Textový editor Vim ve funkci distraction-free editoru

„vi is small, fast, and easy to use. Emacs is huge, slow and easy to use :)“

Existuje sice relativně velké množství textových editorů určených přímo pro tvůrčí psaní (viz například tento článek), ovšem ne vždy je nutné přecházet ke specializované aplikaci, u níž prakticky vždy hrozí nebezpečí, že nebude obsahovat některou důležitou vlastnost (a to se někdy týká i takových základních věcí, jako je kontrola pravopisu). Namísto toho může být výhodnější použít plnohodnotný a časem prověřený textový editor, který se náležitým způsobem upraví do podoby, jejíž vzhled i chování bude plně odpovídat požadavkům uživatele. Podívejme se například na plugin (přídavný modul) nazvaný Goyo, který textový editor Vim (ideálně GVim, u nějž lze provádět mnohé další nastavení vizuálního vzhledu) přepíná do režimu, který je již ve většině ohledů klasickým distraction-free editorem, ovšem stále se zachováním všech původních vlastností Vimu (a ty jsou skutečně nepřeberné):

Obrázek 10: Plugin Goyo je propracovaným přídavným modulem pro Vim, který tento editor přepíná do režimu distraction-free.

Ovšem cesta od klasického Vimu či GVimu k editoru nastaveném takovým způsobem, aby umožňoval tvůrčí psaní, vyžaduje několik kroků, protože původní GUI GVimu nejenže obsahuje mnoho (mnohdy zbytečných) ovládacích prvků, ale navíc není způsob zobrazení textů zcela ideální:

Obrázek 11: Gvim (Vim s grafickým uživatelským rozhraním) ve výchozím nastavení se příliš nepodobá editoru pro tvůrčí psaní.

Poznámka: v dnešním článku se sice věnujeme Vimu, ale podobné úpravy lze provést i v Emacsu. Viz například pěkný článek na toto téma: Emacs, naked.

5. Nastavení velikosti plochy pro zobrazení textu

Nejprve se budeme snažit o změnu velikosti plochy pro zobrazení textu. K tomu (alespoň teoreticky) slouží volby columns a lines, takže se můžeme pokusit je změnit, například na 65 znaků na řádku a 48 textových řádků:

set columns=65
set lines=48

Ve skutečnosti nám ovšem tyto volby samy o sobě příliš nepomůžou, protože pouze zmenší okno editoru a při jeho maximalizaci (resp. po přepnutí do režimu full screen) se vše vrátí zpět:

Obrázek 12: Změna počtu řádků a počtu sloupců.

Musíme tedy použít odlišný přístup, jenž bude popsán v navazující kapitole.

6. Vycentrování plochy pro zobrazení textu

Alternativní řešení je mnohem lepší a spočívá ve vytvoření několika oken (window) v rámci plochy alokované pro celý editor. Tato okna nebudou použita pro zobrazení reálného obsahu, ale pouze jako výplň plochy nalevo, napravo, nahoře a dole pod aktivním oknem. Ke specifikaci okrajů lze použít globálních proměnných zapsaných do nějakého Vim skriptu. Tyto proměnné udávají potřebnou velikost pracovní plochy – prostředního okna:

let g:dfm_width = 80 "absolute width or percentage, like 0.7
let g:dfm_height = 0.8

Pro vytvoření dalších pomocných oken poslouží tato část skriptu, která volá příkazy split a vsplit pro postupné rozdělení plochy na podokna:

let l:w = g:dfm_width > 1 ? g:dfm_width : (winwidth('%') * g:dfm_width)
 
let l:margins = {
      \ "l": ("silent leftabove " . float2nr((winwidth('%') - l:w) / 2 - 1) . " vsplit new"),
      \ "h": ("silent rightbelow " . float2nr((winwidth('%') - l:w) / 2 - 1) . " vsplit new"),
      \ "j": ("silent leftabove " . float2nr(winheight('%') * (1 - g:dfm_height) / 2 - 1) . " split new"),
      \ "k": ("silent rightbelow " . float2nr(winheight('%') * (1 - g:dfm_height) / 2 - 1) . " split new"),
      \ }
 
  for key in keys(l:margins)
    execute l:margins[key] . " | wincmd " . key
  endfor

Obrázek 13: Rozdělení plochy editoru na jednotlivá podokna.

Poznámka: více informací získáte příkazy:
:help window
:help split
:help vsplit
:help wincmd

7. Skrytí okrajů pomocných oken

Pomocná okna a především okraje mezi okny by neměly být viditelné. Toho není ve Vimu problém dosáhnout, protože prakticky každý prvek jeho rozhraní má modifikovatelnou barvu popředí, barvu pozadí a styl textu (výjimkou je kurzor v textové konzoli). V našem konkrétním případě nastavíme vhodnou barvu zobrazení u prvků nazvaných NonText, VertSplit, StatusLine a StatusLineNC, například následovně:

for key in ['NonText', 'VertSplit', 'StatusLine', 'StatusLineNC']
    execute 'hi ' . key . '  ctermbg=NONE guibg=NONE guifg=bg cterm=NONE term=NONE'
endfor

Obrázek 14: Skrytí okrajů oken a dalších prvků, které nejsou nutně zapotřebí.

Poznámka: více informací o použitých příkazech opět naleznete v nápovědě samotného Vimu:
:help highlight
:help term
:help cterm
:help ctermfg
:help ctermbg
:help guifg
:help guibg

8. Nastavení týkající se stavového řádku, popř. ovládacích elementů GUI

Dále je vhodné skrýt veškeré prvky GUI, což je velmi snadné:

set guioptions=

V MacOS existuje volba fullscreen, kterou lze zapnout pro přepnutí do režimu plné obrazovky:

set fullscreen
Poznámka: tuto volbu jsem nezkoušel (nemám kde), ovšem měla by vést ke stejnému výsledku, jako stisk Alt+F11 ve správci oken v Linuxu.

Většinou budeme chtít vypnout i pravítko, a to příkazem:

set noruler

Popř. lze pravítko nechat zobrazeno, ale změnit jeho formát (tj. jaké informace mají být zobrazeny). Formát pravítka se nastavuje pomocí konfiguračního řetězce přiřazeného do konfiguračního parametru rulerformat, zatímco u stavového řádku se jedná o konfigurační parametr statusline. Způsob zobrazení stavového řádku pro poslední (nejspodnější) okno se řídí pomocí volby laststatus. Vypnutí stavového řádku zajistí volba:

set laststatus=0
ruler

Obrázek 15: Nastavení pravítka.

statusline

Obrázek 16: Nastavení stavového řádku.

9. Změna rozestupu mezi textovými řádky

Při delším psaní může být užitečné změnit rozestupy mezi jednotlivými řádky, což je opět volba dostupná pouze v GVimu (pochopitelně). Rozestup mezi řádky se uvádí v pixelech a nastavuje se volbou linespace:

set linespace=3

Obrázek 17: Nastavení linespace=0.

Obrázek 18: Nastavení linespace=3.

Obrázek 19: Nastavení linespace=5.

10. Volba vhodného formátu pro tvorbu

Výše uvedené screenshoty sice používají první verzi dnešního článku zapsanou přímo v HTML, ovšem pro tvůrčí psaní vůbec není HTML vhodné – je příliš rušivé. Ideální bude použít některý z postmoderních značkovacích jazyků, o nichž jsme se zmínili v článku Rozsáhlý svět značkovacích jazyků.

Jen ve stručnosti:

AsciiDoc, jehož první verze vznikla v roce 2002 a jehož autorem je Stuart Rackham, je možná nejvhodnějším formátem. Jedná se o značkovací jazyk, který se podobně jako ostatní postmoderní značkovací jazyky snaží o to, aby byl na prvním místě samotný dokument (text) a případné značky se přidávaly pouze tam, kde je to nutné. Navíc by měl být dokument vytvořený v AsciiDocu čitelný i bez použití konvertorů (asciidoc, a2×, Asciidoctor). AsciiDoc je dnes podporovaný v mnoha textových editorech, které mnohdy nabízí i režim náhledu na editovaný dokument, viz například textový editor Atom. Jeho předností je například podpora pro specifikaci tabulek.

V roce 2002, tedy ve stejném roce, kdy vznikl AsciiDoc, byl navržen i další podobný značkovací jazyk nazvaný reST neboli reStructuredText, jehož autorem je David Goodger. Jedná se o jazyk částečně postavený na značkovacím jazyku StructuredText používaném v Zope, který ovšem měl několik nepříjemných vlastností, které byly v reST vyřešeny. Dnes se tento značkovací jazyk používá velmi masivně, a to ve světě Pythonu (například pro dokumentaci vlastního jazyka a jeho knihoven), protože ho od roku 2008 podporuje nástroj Sphinx. Důležitou službou je Read the Docs umožňující publikování dokumentace vytvořené právě v reST, popř. v Markdownu. Může se jednat jak o několik odstavců, tak i o rozsáhlé knihy.

Dva roky po uvedení AsciiDocu a ReStructuredTextu vznikl formát Markdown, který pravděpodobně není nutné čtenářům tohoto serveru dlouze představovat, protože soubory Markdown jsou masivně používány, zejména pro zápis kratší dokumentace, v níž se ještě neprojeví některé nepodporované vlastnosti. Původními autory Markdownu jsou John Gruber a Aaron Swartz. Původně se jednalo o velmi jednoduchý značkovací jazyk umožňující specifikaci nadpisů, seznamů s odrážkami, číslovaných seznamů, odkazů a obrázků, později ovšem došlo k několika rozšířením Markdownu o další vlastnosti, například o zaškrtávací boxy (což je pro beletrii a podobné texty zbytečné).

Poznámka: AsciiDoc je sice teoreticky nejvhodnější formátem, ovšem plugin pro jeho zvýraznění má ve Vimu problémy s delšími dokumenty. Z tohoto hlediska je tedy lepší používat Markdown, popř. si knihu rozdělit do kapitol a každou kapitolu mít uloženou ve zvláštním souboru (se všemi z toho plynoucími výhodami a nevýhodami).

11. Parametry editace

Při editaci dokumentů s dlouhými odstavci (například beletrie) je nutné nějakým způsobem pracovat s „nekonečnými odstavci“, což jsou vlastně textové řádky, které po zalomení vytvoří celý odstavec. Takovým způsobem se s dokumenty pracuje v textových procesorech.

Nejprve si uvedeme konfigurační parametry ovlivňující způsob zobrazení dlouhých textových řádků, tj. „nekonečných odstavců“:

# Jméno parametru Zkrácený název Význam
1 wrap wrap zapnutí vizuálního zalamování, při němž se do souborů automaticky nevkládá znak pro konec řádku
2 nowrap nowrap vypnutí vizuálního zalamování, vypíná i volbu linebreak
3 linebreak lbr zapnutí vizuálního zalamování na hranicích slov
4 nolinebreak nolbr vypnutí vizuálního zalamování na hranicích slov
5 showbreak sbr specifikace textu vkládaného na začátek vizuálně zalomené řádky (text se do souboru neuloží)

Ve druhé tabulce jsou uvedeny konfigurační parametry, které se používají v případě, že je text poloautomaticky či zcela automaticky formátován do samostatných řádků (Vim tedy v textu vytváří či naopak ruší znaky CR):

# Jméno parametru Zkrácený název Význam
1 textwidth tw automatické zalamování na xxx sloupci (při psaní se automaticky vkládá znak pro konec řádku)
2 wrapmargin wm alternativa k předchozí volbě, umožňuje vkládat znak konce řádku relativně vůči pravému okraji okna
3 formatoptions fo přesné určení způsobu formátování textů
4 formatlistpat flp použit při formátování seznamů

Pod pojmem vizuální zalamování textů je myšlen způsob zobrazení dlouhých textových řádků na obrazovce, aniž by ovšem docházelo ke skutečnému vkládání znaků pro konec řádku (CR) do editovaného souboru – tedy kombinace wrap a linebreak. Ve skutečnosti je právě tento způsob přípravy textů nejjednodušší a nejpřirozenější, pro lepší práci s textem však může být vhodné provést přemapování kláves pro posun kurzoru nahoru a dolů následujícím způsobem:

" šipkou nahoru se pohybujeme po obrazových řádcích směrem nahoru
:map <Up>   gk
" šipkou dolů se pohybujeme po obrazových řádcích směrem dolů
:map <Down> gj

12. Automatické přeformátování odstavců během úprav textů

V této kapitole si popíšeme druhý způsob práce s běžnými texty. Jedná se o způsob založený na tom, že textové odstavce jsou rozděleny do fyzických textových řádků takovým způsobem, že je Vim může rozeznat (pozná tedy začátek a konec odstavce) a tím pádem je i může poloautomaticky či dokonce zcela automaticky zformátovat, resp. přerovnat. Základním parametrem, který ovlivňuje chování Vimu při formátování odstavců, je volba textwidth, zkracovaná též na tw. Nulová hodnota vypíná formátování, zatímco hodnota kladná udává maximální délku textových řádků (typicky se používají hodnoty 60, 72 či 80). Podobný význam má i parametr wrapmargin, pomocí nějž je možné zadat šířku odstavců relativně k pravému okraji okna. Pokud například bude šířka okna 80 znaků a parametr wrapmargin bude nastaven na 10, budou se odstavce přerovnávat tak, aby maximální délka každého řádku byla rovna 80–10=70 znakům.

Textový editor Vim ovšem bez dalšího nastavení používá hodnoty textwidth a wrapmargin pouze při vkládání nového textu, nikoli například pro spojování kratších řádků při provádění různých editačních operací. Buď je možné formátování vynutit ručně, například příkazem gqap (format (a) paragraph), nebo lze do volby formatoptions přidat znak a, který zajistí automatické přeformátování odstavce při jakékoli manipulaci s textem:

:set formatoptions+=a

V případě, že je nastavena volba textwidth, lze odstavec či jakýkoli vybraný text zarovnat doleva, doprava či ho vycentrovat pomocí příkazů:

:left
:right
:center

Text je nutné nejprve vybrat do bloku, popř. použít jiný způsob zadání rozsahu výběru (například procento, určením čísel řádků atd.).

13. Nastavení tvaru a barvy textového kurzoru

Další užitečnou vlastností Vimu je jeho schopnost měnit konfiguraci tvaru, barvy i chování textového kurzoru v případě, že je editor Vim spuštěný s podporou grafického uživatelského rozhraní, tj. tehdy, když je použita volba vim -g, popř. je použit příkaz gvim. Na tomto místě je vhodné zdůraznit, že dále uvedené příkazy nebudou plně funkční v případě, že je textový editor Vim spuštěn v emulátoru terminálu, či dokonce na fyzickém terminálu (v Linuxu je z X Window Systemu přístupný například přes klávesovou kombinaci Ctrl+Alt+F1), protože způsob zobrazení kurzoru je v takových případech závislý buď na nastavení emulátoru terminálu nebo na konfiguraci hardware terminálu fyzického (jednou z výjimek je DOS a konzole ve Windows, kde lze částečně určit tvar kurzoru). Všechny vlastnosti textového kurzoru (při spuštění v GUI) jsou určeny konfiguračním parametrem guicursor a taktéž příkazem highlight, kterým se nastavují barvy kurzoru v jednotlivých režimech.

Podívejme se nyní podrobněji na možnosti konfiguračního parametru guicursor. Začněme specifikátorem režimu. Může se jednat o libovolnou kombinaci následujících kódů, které jsou od sebe odděleny pomlčkou, takže například řetězec n-v vybírá normální a současně i vizuální režim:

Kód režimu Význam zkratky Popis
n normal normální režim
o operator normální režim ve chvíli očekávání operátoru (posun kurzoru), běžně se odvozuje od vlastností nastavených pro normální režim
i insert vkládací režim (příkazy a, A, i, I, o, O, c apod.)
r replace přepisovací režim (příkazy r a R)
c command příkazový režim (barva kurzoru umístěného za posledním zapsaným znakem)
ci command příkazový režim při nastavení vkládání (přepíná se klávesou INSERT)
cr command příkazový režim při nastavení přepisování (přepíná se klávesou INSERT)
v visual vizuální (výběrový) režim
ve visual exclusive vizuální (výběrový) režim při nastavení exclusive (poslední znak není zahrnut do výběru)
sm showmatch zobrazení párového znaku ve vkládacím režimu (kurzor se na chvíli může přesunout na párovou závorku atd.)
a all všechny režimy

Za kódem režimu či režimů se zapisuje dvojtečka a za ní další parametry, které jsou od sebe oddělené pomlčkou:

Parametr Význam
block blokový kurzor (kurzor má tvar obdélníku s plochou přesně o velikosti jednoho znaku)
horXX kurzor má tvar horizontální čáry o šířce XX procent výšky znaků (nenastavujte více než 100, jinak se kurzor nebude dobře překreslovat)
verXX kurzor má tvar vertikální čáry o šířce XX procent šířky znaků (nenastavujte více než 100, jinak se kurzor nebude dobře překreslovat)
blinkonNN interval, kdy je kurzor viditelný, zadaný v milisekundách (0=kurzor nebliká)
blinkoffNN interval, kdy je kurzor viditelný, zadaný v milisekundách
blinkwaitNN interval, kdy je kurzor po přesunu zobrazený bez blikání, zadaný v milisekundách
jiný text jméno skupiny specifikované příkazem highlight

Použití jména skupiny pro změnu barvy kurzoru je jednoduché. Následující sekvence příkazů například nastaví barvu kurzoru pro všechny režimy na čistě žlutou, znaky pod kurzorem budou zobrazeny tmavě červenou barvou. Kurzor má tvar horizontální čárky, která má tloušťku jedné čtvrtiny výšky znaků (přesněji řečeno jedné čtvrtiny výšky znaků plus hodnoty linespace:

:set guicursor=a:hor25-myCursorStyle
:highlight myCursorStyle guibg=yellow guifg=darkred

14. Jednoduchý modul pro zapnutí a opětovné vypnutí distraction-free režimu

Většinu nastavení popsaných v předchozích kapitolách lze použít v jednoduchém modulu (vlastně jen jediném Vim skriptu), který dokáže po stisku klávesové zkratky Leader+z (kde Leader je například zpětné lomítko – jedná se o plně konfigurovanou volbu) přepínat mezi distraction-free režimem a běžným režimem zobrazení:

let g:dfm_width = 80 "absolute width or percentage, like 0.7
let g:dfm_height = 0.8
 
let s:dfm_enabled = 0
 
function! ToggleDistractionFreeMode()
  let l:w = g:dfm_width > 1 ? g:dfm_width : (winwidth('%') * g:dfm_width)
  let l:margins = {
        \ "l": ("silent leftabove " . float2nr((winwidth('%') - l:w) / 2 - 1) . " vsplit new"),
        \ "h": ("silent rightbelow " . float2nr((winwidth('%') - l:w) / 2 - 1) . " vsplit new"),
        \ "j": ("silent leftabove " . float2nr(winheight('%') * (1 - g:dfm_height) / 2 - 1) . " split new"),
        \ "k": ("silent rightbelow " . float2nr(winheight('%') * (1 - g:dfm_height) / 2 - 1) . " split new"),
        \ }
  if (s:dfm_enabled == 0)
    let s:dfm_enabled = 1
    for key in keys(l:margins)
      execute l:margins[key] . " | wincmd " . key
    endfor
    for key in ['NonText', 'VertSplit', 'StatusLine', 'StatusLineNC']
      execute 'hi ' . key . '  ctermbg=NONE guibg=NONE guifg=bg cterm=NONE term=NONE'
    endfor
    set wrap | set linebreak
    set statusline=foo
    map j gj
    map k gk
  else
    let s:dfm_enabled = 0
    for key in keys(l:margins)
      execute "wincmd " . key . " | close "
    endfor
    set nowrap | set nolinebreak
    unmap j
    unmap k
  endif
endfunction
 
nmap <silent> <Leader>z :call ToggleDistractionFreeMode()<CR>
Poznámka: úplný skript naleznete v článku Distraction free writing in Vim.

Tento skript lze načíst z .vimrc příkazem autocommand, a to jen pro vybrané typy souborů:

augroup __ascii__
  au!
  au BufRead,BufNewFile *.txt set tw=72 formatoptions+=t foldmethod=indent
  au BufRead,BufNewFile *.txt set foldclose=all foldnestmax=1 tabstop=4
  au BufRead,BufNewFile *.txt so df.vim
augroup END

15. Easy režim

Easy režim (příkaz evim) je pochopitelně plně podporován a jeho nastavení nemá vliv na způsob zobrazení textů při editaci (a naopak). Díky evimu je tedy možné Vim používat jako nemodální editor (samozřejmě do určité míry, protože striktně nemodální není žádný editor).

bitcoin_skoleni

16. Další pluginy pro Vim s podobnou funkcí

Existují pochopitelně i další pluginy pro Vim, které podobné funkce nabízí. Pravděpodobně nejpoužívanějším pluginem tohoto typu je qoyo.vim, jehož repositář i s popisem naleznete na GitHubu na adrese https://github.com/junegunn/goyo.vim. Alternativně je možné použít i LiteDFM, viz též https://github.com/bilalq/lite-dfm.

Obrázek 18: Pro delší práci je možná vhodnější tmavé pozadí – s naším pluginem je plně kompatibilní jakékoli barevné schéma.

17. Odkazy na Internetu

  1. Textové editory pro tvůrčí psaní
    https://www.root.cz/clanky/textove-editory-pro-tvurci-psani/
  2. Seriál Textový editor Vim jako IDE
    https://www.root.cz/serialy/textovy-editor-vim-jako-ide/
  3. Články s nálepkou „Vim“ na Rootu
    https://www.root.cz/n/vim/
  4. goyo.vim
    https://github.com/junegunn/goyo.vim
  5. LiteDFM
    https://github.com/bilalq/lite-dfm
  6. distraction-free-writing-vim
    https://github.com/laktek/distraction-free-writing-vim
  7. Distraction Free Writing with Vim
    http://www.laktek.com/2012/09/05/dis­traction-free-writing-with-vim/
  8. Distraction Free Vim
    http://thedarnedestthing.com/dis­traction%20free%20vim
  9. Vim – The Distraction Free Editor
    https://matthewsetter.com/vim-the-distraction-free-editor/
  10. Distraction free writing in Vim
    https://zserge.com/posts/vim-distraction-free/
  11. Distraction-free writing with vim
    https://www.hamvocke.com/blog/dis­traction-free-writing/
  12. tablign na PyPi
    https://pypi.org/project/tablign/
  13. tablign na GitHubu
    https://github.com/nschloe/tablign
  14. Tables in vim (reddit)
    https://www.reddit.com/r/vim/com­ments/8lyigo/tables_in_vim/
  15. vim-table-mode (repositář na GitHubu)
    https://github.com/dhruvasagar/vim-table-mode
  16. table-mode na Vim.org (starší verze!)
    https://www.vim.org/scrip­ts/script.php?script_id=4501
  17. Smarter Table Editing
    https://vim.fandom.com/wi­ki/Smarter_Table_Editing
  18. Smarter Table Editing II
    https://vim.fandom.com/wi­ki/Smarter_Table_Editing_II
  19. Články o Vimu na Root.cz:
    http://www.root.cz/n/vim/clanky/
  20. Replace and Virtual Replace Modes
    https://medium.com/vim-drops/replace-and-virtual-replace-modes-3e841b9161ca
  21. How can I easily create and maintain tables?
    https://vi.stackexchange.com/qu­estions/363/how-can-i-easily-create-and-maintain-tables
  22. Vim – the editor
    http://www.vim.org/
  23. Vim as a Python IDE, or Python IDE as Vim
    http://blog.jetbrains.com/pychar­m/2013/06/vim-as-a-python-ide-or-python-ide-as-vim/
  24. Popis skriptu Vim Pathogen
    http://www.vim.org/scripts/scrip­t.php?script_id=2332
  25. Posledníverze skriptu Vim Pathogen
    https://tpo.pe/pathogen.vim
  26. Nejlepší pluginy pro Vim
    http://vimawesome.com/
  27. Nejlepší pluginy pro Vim
    http://www.vim.org/scripts/scrip­t_search_results.php?order_by=ra­ting
  28. Vi Improved
    https://wiki.python.org/moin/Vim
  29. Building Vim
    http://vim.wikia.com/wiki/Bu­ilding_Vim
  30. Vim plugins for developers
    http://www.linuxtoday.com/upload/vim-plugins-for-developers-140619094010.html
  31. Writing Vim Plugins
    http://stevelosh.com/blog/2011/09/wri­ting-vim-plugins/
  32. how to understand this vim script?
    http://stackoverflow.com/qu­estions/12625091/how-to-understand-this-vim-script
  33. Novinky ve VIM 7: Skriptovací jazyk
    http://www.root.cz/vim-sedm-druha-cast/
  34. DirDiff.vim : A plugin to diff and merge two directories recursively.
    http://www.vim.org/scripts/scrip­t.php?script_id=102
  35. vim-dirdiff na GitHubu
    https://github.com/will133/vim-dirdiff
  36. fakeclip : pseudo clipboard register for non-GUI version of Vim
    http://www.vim.org/scripts/scrip­t.php?script_id=2098
  37. vim-fakeclip na GitHubu
    https://github.com/kana/vim-fakeclip
  38. vim-fakeclip: Dokumentace
    http://kana.github.io/con­fig/vim/fakeclip.html
  39. Vim Multiple Cursors na GitHubu
    https://github.com/terryma/vim-multiple-cursors
  40. SLIME (Wikipedia)
    http://en.wikipedia.org/wiki/SLIME
  41. vim-slime na GitHubu
    https://github.com/jpalardy/vim-slime
  42. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  43. JavaBrowser : Shows java file class, package in a tree as in IDEs. Java source browser.
    http://www.vim.org/scripts/scrip­t.php?script_id=588
  44. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318
  45. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  46. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  47. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  48. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  49. Tutorial: Make Vim as Your C/C++ IDE Using c.vim Plugin
    http://www.thegeekstuff.com/2009/01/tu­torial-make-vim-as-your-cc-ide-using-cvim-plugin/
  50. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  51. The History of Vim
    https://jovicailic.org/2014/06/the-history-of-vim/
  52. Display date-and-time on status line
    http://vim.wikia.com/wiki/Display_date-and-time_on_status_line
  53. Vim 8.1 is available!
    https://www.vim.org/vim-8.1-released.php
  54. Vim 8.0 is released
    https://laravel-news.com/2016/09/vim-8–0-is-released/
  55. Vim: So long Pathogen, hello native package loading
    https://shapeshed.com/vim-packages/
  56. Asynchronous grep plugin for Vim
    https://github.com/ramele/agrep
  57. Run Async Shell Commands in Vim 8.0 / NeoVim and Output to Quickfix Window
    https://github.com/skywin­d3000/asyncrun.vim
  58. :smile command was not backported! #5116
    https://github.com/neovim/ne­ovim/issues/5116
  59. Run :make and :grep in background jobs (experimental)
    https://github.com/edkolev/vim-amake
  60. Favorite vim plugins
    http://sherifsoliman.com/2016/05/30/fa­vorite-vim-plugins/
  61. Makejob
    http://www.vim.org/scripts/scrip­t.php?script_id=5479
  62. Vim sedm – první část
    http://www.root.cz/clanky/vim-sedm-prvni-cast/
  63. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  64. History of the Text Editor
    http://vanstee.me/history-of-the-text-editor.html
  65. Interview with Bill Joy
    http://web.cecs.pdx.edu/~kir­kenda/joy84.html
  66. vi Editor Commands
    http://www.cs.rit.edu/~cslab/vi­.html#A1.4
  67. vi Manual
    http://www.cs.fsu.edu/gene­ral/vimanual.html
  68. Mastering the Vi Editor
    http://www.susnet.uk/mastering-the-vi-editor
  69. PyRoom
    http://pyroom.org/
  70. PyRoom
    https://en.wikipedia.org/wiki/PyRoom
  71. CodeRoom
    https://code.google.com/ar­chive/p/coderoom/
  72. Full-screen writing program
    https://en.wikipedia.org/wiki/Full-screen_writing_program
  73. Ghostwriter
    https://wereturtle.github­.io/ghostwriter/
  74. JOE – Joe's Own Editor
    https://joe-editor.sourceforge.io/4.6/man.html
  75. Distraction Free Editing
    https://zim-wiki.org/manual/Plugins/Dis­traction_Free_Editing.html
  76. Rozsáhlý svět značkovacích jazyků
    https://www.root.cz/clanky/rozsahly-svet-znackovacich-jazyku/
  77. Game of Thrones author George R.R. Martin explains why he writes on a DOS machine
    https://www.theverge.com/2014/5/14/5716232/g­eorge-r-r-martin-uses-dos-wordstar-to-write
  78. The Social Media (G.R.R. Martin)
    https://grrm.livejournal.com/197075­.html
  79. WordStar pro DOS
    https://en.wikipedia.org/wi­ki/WordStar#MS-DOS
  80. Emacs, naked
    https://bzg.fr/en/emacs-strip-tease.html/
  81. Capek
    http://texteditors.org/cgi-bin/wiki.pl?Capek
  82. Cizek
    http://texteditors.org/cgi-bin/wiki.pl?Cizek
  83. Stur
    http://texteditors.org/cgi-bin/wiki.pl?Stur

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.