Hlavní navigace

Editace tabulek v editoru Vim

20. 6. 2019
Doba čtení: 21 minut

Sdílet

V dnešním článku o editoru Vim se seznámíme s tím, jak je možné v něm pracovat s tabulkami uloženými v běžných textových souborech. Ukážeme si i použití filtru tablign a velmi užitečného přídavného modulu table-mode.

Obsah

1. Editace tabulek ve Vimu

2. Problematika tvorby a editace tabulek ve Vimu

3. Režim „virtuální editace“

4. Implementace režimu „virtuální editace“ ve Vimu

5. Změna chování některých klávesových zkratek v režimu „virtuální editace“

6. Změna chování některých klávesových zkratek v režimu VREPLACE

7. Příklady použití režimu „virtuální editace“ ve Vimu

8. Pomocný nástroj (filtr) tablign

9. Instalace nástroje tablign

10. Příklady použití nástroje tablign

11. Editace tabulek uložených ve formátu CSV

12. Plugin table-mode přidávající do Vimu další režim pro práci s tabulkami

13. Instalace pluginu table-mode

14. Přepnutí do „tabulkového režimu“

15. Vytvoření jednoduché tabulky

16. Specifikace oddělovače buněk

17. Ruční zápis nové tabulky z existujících dat

18. Nové příkazy pro editaci tabulky

19. Editace vzorců

20. Odkazy na Internetu

1. Editace tabulek ve Vimu

Populární textový editor Vim, s jehož některými možnostmi jsme se již seznámili v tomto seriálu i v několika samostatných článcích, se dnes používá v mnoha různých oblastech. Primárně je samozřejmě Vim využíván vývojáři pro tvorbu a úpravy zdrojových kódů, administrátory i lidmi z DevOps týmů pro editaci konfiguračních souborů atd. Ovšem to ve skutečnosti není zdaleka vše, protože Vim je možné využít například i pro tvorbu dokumentace (v různých formátech, včetně TeXu, LaTeXu, AsciiDocu, MarkDownu, RestructuredTextu atd. atd.) a mj. jsme se seznámili i s možností použít Vim ve funkci nástroje pro organizaci času a/nebo projektů, i když je na tomto místě nutné přiznat, že možnosti režimu OrgMode v konkurenčním Emacsu jsou v této oblasti prozatím propracovanější.

Obrázek 1: Režim vim-OrgMode.

Pro tvorbu čistého textu, strukturovaného textu, popř. textu napsaného v nějakém značkovacím jazyce, je Vim skutečně velmi dobře použitelný, ovšem s jednou výjimkou – v běžném Vimu se (bez použití dalších pluginů či filtrů) relativně složitě pracuje s tabulkami:

|--------+------+-------+--------+-----------+-------------------|
| login  |  uid | gid   | name   | homedir   | interpreter       |
|--------+------+-------+--------+-----------+-------------------|
| root   |  0   | 0     | root   | /root     | /bin/bash         |
| daemon |  1   | 1     | daemon | /usr/sbin | /usr/sbin/nologin |
| bin    |  2   | 2     | bin    | /bin      | /usr/sbin/nologin |
| sys    |  3   | 3     | sys    | /dev      | /usr/sbin/nologin |
| sync   |  4   | 65534 | sync   | /bin      | /bin/sync         |
|--------+------+-------+--------+-----------+-------------------|

Obrázek 2: Jednoduchý dokument zobrazený v režimu Org mode v textovém editoru Emacs.

2. Problematika tvorby a editace tabulek ve Vimu

Práce s tabulkami ve Vimu je problematická z několika důvodů. Především v běžných vimovských režimech (převzatých z původního editoru Vi) není možné přesunout kurzor za konec napsaných řádků: můžeme se přesunout pouze přesně na konec textu a příkazem a přidat další znaky (popř. přesun a příkaz pro přidání zkombinovat do jediného příkazu A). To je při tvorbě tabulek dosti pracné a navíc se poněkud vytrácí elegance některých příkazů, například příkazu n| určeného pro horizontální přesun kurzoru (v rámci textového řádku) na zadaný sloupec (za n se pochopitelně doplní číslo sloupce). V běžných režimech se například na řádku o délce 50 znaků nelze přesunout na sloupec číslo 100 příkazem 100|, protože se textový kurzor „zasekne“ na posledním zapsaném znaku:

Toto je text zapsaný v bufferu.
                              ^
  poslední možná pozice kurzoru

A druhý důvod spočívá v tom, že samotný Vim nijak nerozeznává oddělovače sloupců, takže nemá v základní sadě příkazů příkazy pro pohyb mezi sloupci, jejich mazání a pochopitelně ani příkaz pro naformátování tabulky po provedených editačních operacích.

Poznámka: v následujících kapitolách budou použity screenshoty Vimu otevřeného ve velmi malém terminálu. Není to z toho důvodu, že by byl autor masochista a měl miniaturní monitor, ale kvůli omezení dané designem Roota – články jsou zobrazovány jako úzké „nudle“ a obrázky s vyšším horizontálním rozlišením jsou naškálovány do menší velikosti, což u screenshotů textového editoru postrádá význam. Z tohoto důvodu má okno editoru pouze 25 řádků a 59 znaků na řádku.

3. Režim „virtuální editace“

Práce s tabulkami v běžném textovém editoru může být v některých případech poměrně komplikovaná. Představme si například situaci, kdy je nutné do tohoto souboru na konec přidat znaky s vertikální úsečkou:

|----+-------+---------
| ID | name  | surname
|----+-------+---------
| 01 | Jon   | Snow
| 02 | Marty | McFly
|----+-------+---------

Výsledkem by měla být tato tabulka:

|----+-------+---------|
| ID | name  | surname |
|----+-------+---------|
| 01 | Jon   | Snow    |
| 02 | Marty | McFly   |
|----+-------+---------|

Ideální by tedy byl stav, kdy se kurzor přesune na konec prvního řádku, vloží se znak | a poté se (buď makrem, nebo ručně) kurzor přesune na další řádek, ovšem do stejného sloupce, aby bylo možné vložit další znak |. Ve standardních režimech Vimu to však není možné – je nutné se přepnout do takzvaného režimu virtuální editace, kdy se kurzor přesunuje kamkoli po obrazovce, tedy i do míst, kde se ve skutečnosti žádný text nenachází.

Obrázek 3: Mnoho původních programátorských textových editorů pro DOS režim virtuální editace podporovalo. Velmi dobrým příkladem může být textový editor zabudovaný do populárního souborového manažeru Dos Navigator.

Obrázek 4: Podobnou možnosti nalezneme například v editoru mcedit, který je součástí Midnight Commanderu.

Obrázek 5: Příklad přesunu kurzoru mimo vlatní oblast textu v mceditu.

4. Implementace režimu „virtuální editace“ ve Vimu

První z naznačených problémů je možné poměrně snadno řešit v rámci čistého Vimu, přesněji řečeno Vimu, který není (resp. nemusí být) doplněn o žádný plugin. Vim totiž obsahuje speciální režim „virtuální editace“, což ve skutečnosti znamená, že se textový kurzor může přesouvat i za konec fyzické textové řádky. Pokud tedy kurzor přesuneme na stý sloupec a přidáme do textu znak, doplní Vim textový řádek mezerami. Navíc se změní i funkce příkazu n|, kterým je možné přesunout textový kurzor na libovolné místo v rámci editovaného řádku, včetně místa za fyzickým řádkem. Díky těmto možnostem se možnosti Vimu při tvorbě a editaci tabulek zvětšují. Režim virtuální editace se řídí konfiguračním parametrem virtualedit, kterému lze přiřadit jednu z těchto voleb:

# Volba Význam
1 block povolení virtuální editace při práci s vizuálními bloky
2 insert povolení virtuální editace ve vkládacím režimu
3 all povolení virtuální editace ve všech režimech
4 onemore zajímavá volba umožňující přesun kurzoru pouze ZA poslední znak

Samotný příkaz pro nastavení či změnu volby vypadá takto:

:set virtualedit=vybraná_volba

Po zapnutí režimu virtuální editace si můžeme (například) vytvořit makro namapované na klávesu a, které zajistí, že se na padesátou pozici na řádku (nezávisle na jeho obsahu) vloží znak |, který může představovat pravý okraj tabulky:

50|i|<Esc><Down>

Makro namapujeme na klávesu a běžným způsobem, tj. příkazem qa. Přehrání makra zajistí příkaz @a a díky tomu, že se kurzor přesouvá na další řádek (do virtuálního padesátého sloupce), je pochopitelně možné makro opakovat: 10@a.

Aby byl režim virtuální editace podporován, musí být Vim přeložen s volbou +virtualedit, což snadno zjistíme příkazem:

:ver

Příklad výstupu:

VIM - Vi IMproved 8.1 (2018 May 18, compiled Jun 17 2019 09:09:11)
Included patches: 1-1561
Modified by <bugzilla@redhat.com>
Compiled by <bugzilla@redhat.com>
Huge version with GTK2 GUI.  Features included (+) or not (-):
+acl             +farsi           +mouse_netterm   +syntax
+arabic          +file_in_path    +mouse_sgr       +tag_binary
+autocmd         +find_in_path    -mouse_sysmouse  +tag_old_static
+balloon_eval    +float           +mouse_urxvt     -tag_any_white
+browse          +folding         +mouse_xterm     +tcl
++builtin_terms  -footer          +multi_byte      +terminfo
+byte_offset     +fork()          +multi_lang      +termresponse
+cindent         +gettext         -mzscheme        +textobjects
+clientserver    -hangul_input    +netbeans_intg   +title
+clipboard       +iconv           +path_extra      +toolbar
+cmdline_compl   +insert_expand   +perl            +user_commands
+cmdline_hist    +jumplist        +persistent_undo +vertsplit
+cmdline_info    +keymap          +postscript      +virtualedit
+comments        +langmap         +printer         +visual
+conceal         +libcall         +profile         +visualextra
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      +python3         +vreplace
+cursorbind      +listcmds        +quickfix        +wildignore
+cursorshape     +localmap        +reltime         +wildmenu
+dialog_con_gui  +lua             +rightleft       +windows
+diff            +menu            +ruby            +writebackup
+digraphs        +mksession       +scrollbind      +X11
+dnd             +modify_fname    +signs           -xfontset
-ebcdic          +mouse           +smartindent     +xim
+emacs_tags      +mouseshape      -sniff           +xsmp_interact
+eval            +mouse_dec       +startuptime     +xterm_clipboard
+ex_extra        +mouse_gpm       +statusline      -xterm_save
+extra_search    -mouse_jsbterm   -sun_workshop    +xpm

Obrázek 6: Vim s povolenou volbou +virtualedit.

Obrázek 7: Nápověda k režimu virtuální editace.

5. Význam konfigurační volby onemore

Zastavme se na chvíli u poslední volby zmíněné v předchozí tabulce. Jedná se o volbu nazvanou onemore. Tato relativně málo známá volba umožňuje přesuny kurzoru ZA poslední znak zapsaný na textovém řádku, ale ne dále (ovšem samotným přesunem se žádná nová mezera do souboru nevloží, pouze je možné, aby kurzor stál za koncem řádku, který je možné zvýraznit volbou set list).

Může se jednat o dosti zajímavou a užitečnou volbu, která zajistí, že se mnoho příkazů stane konzistentní, a to včetně uživatelských maker atd. Můžeme si to ostatně ukázat i na příkladu makra umožňujícího, aby se vybraný text zvýraznil, konkrétně aby se obalil do značek <strong> a </strong> a následně se kurzor přesunul na začátek takto zvýrazněného textu (toto makro používám při psaní článku):

au BufRead,BufNewFile *.htm,*.html vmap <C-B> omaomb<esc>`bi</strong><esc>`ai<strong><esc>

Toto makro je sice funkční, ovšem s jednou výjimkou – nebude pracovat korektně v případě, kdy budeme chtít zvýraznit poslední slovo na řádku, protože nedojde ke zvýraznění posledního znaku. Pochopitelně je možné tento problém opravit v samotném makru (ovšem dosti složitým způsobem), nebo je možné pracovat v režimu virtuální editace s nastavením onemore:

:set virtualedit=onemore
Poznámka: kromě toho je nastavení virtualedit=onemore výhodné i pro ty uživatele, kteří s vimem teprve začínají a znají například jen jediný příkaz pro přepnutí editoru do vkládacího režimu, a to klávesou klávesou i nebo Insert. V takovém případě je pro uživatele dost problematické připojit cokoli na konec řádku, protože to vyžaduje použití příkazů a nebo A.

Obrázek 8: Nápověda k nastavení virtualedit.

6. Změna chování některých klávesových zkratek v režimu VREPLACE

Kromě režimu virtuální editace se můžeme setkat i s režimem nazvaným VREPLACE, který se taktéž někdy používá pro editaci tabulek. Tento režim má poněkud odlišný význam, protože mění i chování kláves určených pro mazání. Jedná se především o klávesy Backspace, Ctrl+W a Ctrl+U použité v režimu vkládání. Připomeňme si, že v klasickém režimu vkládání slouží Backspace pro smazání znaku, který se nachází nalevo od kurzoru (pokud tedy nepoužijeme right-to-left režim, což pravděpodobně není případ čtenářů tohoto článku) a klávesa Ctrl+W pro smazání slova před kurzorem. Klávesa Ctrl+U vrátí zpět všechny změny, které byly na řádku provedeny. V případě, že se použije režim virtuální editace, bude klávesa Backspace sloužit nikoli pro smazání posledního znaku, ale pro obnovení jeho původní podoby. Podobně je tomu i u klávesy Ctrl+W, která vrátí zpět obsah celého slova, které se nachází nalevo od kurzoru.

Obrázek 9: Přepínání mezi režimy modálního textového editoru Vim (některé varianty základních režimů zde nejsou pro větší názornost diagramu nakresleny).

7. Příklady použití režimu „virtuální editace“

Podívejme se nyní na příklad použití režimu virtuální editace při úpravách tabulky, která je součástí dokumentace projektu Bootstrap, se kterým jsme se seznámili v článku Můžeme věřit překladačům? Projekty řešící schéma „důvěřivé důvěry“. Na screenshotech jsou zvýrazněny konce řádků modrým znakem dolaru; tento režim zobrazení je zapnut příkazem:

:set list

Obrázek 10: Kurzor se může přesunout mimo vlastní text, a to i v normálním režimu. Pro lepší ilustraci je zde použita volba :set list zobrazující konce řádků s využitím modrého dolaru.

Obrázek 11: I při editaci v režimu vkládání je možné kurzor přesunout mimo vlastní text (jméno tohoto režimu je zobrazeno na pravítku vlevo dole).

8. Pomocný nástroj (filtr) tablign

V této chvíli již tedy víme, jak je možné využít režim virtuální editace pro alespoň částečné vylepšení práce s tabulkami. Ovšem pravděpodobně sami uznáte, že se v žádném případě nejedná o ideální řešení, a to například tehdy, pokud potřebujeme tabulky editovat. Při editacích dochází k „rozhození“ jednotlivých buňek, které již nebudou zarovnány pod sebe. Jedno z možných řešení tohoto problému spočívá v použití externího filtru nazvaného tablign. Tento filtr pracuje jednoduše. Na jeho vstupu je několik textových řádků. Filtr v těchto řádcích rozpozná oddělovače sloupců a zarovná text takovým způsobem, aby buňky pod sebou přesně lícovaly. Rozpoznáno je hned několik oddělovačů sloupců, včetně znaku | (běžné tabulky, asi nejčitelnější a nejpřenositelnější řešení), čárky, středníku a & (tabulky z TeXu).

Poznámka: striktně řečeno vlastně tablign nepracuje jako skutečný filtr v unixovém slova smyslu, protože potřebuje zjistit šířku všech buněk. Ve skutečnosti se celá tabulka načte do paměti jako jeden řetězec, rozdělí se na řádky a ty se posléze zpracují. Pro obrovské tabulky tedy dojde k vyšší spotřebě paměti, což však při běžném použití (desítky, stovky, tisíce řádků) v žádném případě nebude vadit.

Tento projekt nalezneme na GitHubu na adrese https://github.com/nschloe/tablign i ve formě balíčku pro Python na https://pypi.org/project/tablign/.

9. Instalace nástroje tablign

Instalace nástroje tablign je vetšinou velmi snadná, protože se jedná o projekt naprogramovaný v čistém Pythonu (bez dalších závislostí), který je dostupný na PyPi. Pro instalaci tedy můžeme použít nástroj pip nebo pip3, a to konkrétně následujícím způsobem:

$ pip3 install --user tablign

Instalace proběhne během několika sekund:

Downloading/unpacking tablign
  Downloading tablign-0.1.7-py2.py3-none-any.whl
Downloading/unpacking pipdate>=0.3.0,<0.4.0 (from tablign)
  Downloading pipdate-0.3.2-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): appdirs in ./.local/lib/python3.4/site-packages (from pipdate>=0.3.0,<0.4.0->tablign)
Requirement already satisfied (use --upgrade to upgrade): requests in /usr/lib/python3/dist-packages (from pipdate>=0.3.0,<0.4.0->tablign)
Installing collected packages: tablign, pipdate
Successfully installed tablign pipdate
Cleaning up...

Ověřte si, že je tablign dostupný na PATH:

$ tablign
 
1,2,3
foo,bar,baz
hello,world,!
Ctrl+D
1     , 2     , 3
foo   , bar   , baz
hello , world , !
$

10. Příklady použití nástroje tablign

Po instalaci by měl být nástroj tablign spustitelný z příkazové řádky, což je v tuto chvíli vše, co budeme potřebovat, protože externí filtry z Vimu dokážeme spouštět, a to příkazem ! zadávaným z příkazového režimu (tedy s dvojtečkou) nebo z režimu vizuálních bloků (výběr přes v, Ctrl+V apod.). Podívejme se tedy na několik příkladů použití.

První příklad

Obrázek 12: Příprava tabulky, ovšem bez snahy o zarovnání buněk.

Obrázek 13: Výběr řádků tabulky do bloku a příprava spuštění filtru tablign.

Obrázek 14: Výsledek po zarovnání.

Druhý příklad

Obrázek 15: Tabulka s dokumentací k projektu Bootstrap, jejíž buňky nejsou zarovnány.

Obrázek 16: Výběr rozházené části tabulky do bloku.

Obrázek 17: Výsledek aplikace filtru tablign.

11. Editace tabulek uložených ve formátu CSV

Výše popsaný příkaz tablign je dokonce možné použít i ve chvíli, kdy budeme potřebovat upravit tabulky ve formátu CSV (Comma Separated Values). Jak již název tohoto formátu naznačuje, jsou jednotlivé buňky odděleny čárkou (a současně se jedná o lež, protože se může jednat i o středník, ostatně na podobné chuťovky jsme u formátů navržených v součinnosti s MS zvyklí, viz například problémy s formátem BMP). U CSV formátu jsou texty umístěny do uvozovek a u čísel nehrají roli mezery umístěné před a za číselnou hodnotu. To v praxi znamená, že můžeme před nebo za čárky (středníky) oddělující jednotlivé buňky vložit mezery, aniž by to změnilo sémantiku uložených dat. Tudíž je možné si CSV upravit takovým způsobem, aby byl ve Vimu čitelnější a snadněji se editoval (velikost souboru se ovšem může mnohdy i násobně zvětšit!).

Obrázek 18: Původní obsah souboru s tabulkou uloženou ve formátu CSV.

Obrázek 19: Zavolání externího filtru tablign.

Obrázek 20: Výsledek je již krásně čitelný.

12. Plugin table-mode přidávající do Vimu další režim pro práci s tabulkami

I přes existenci režimu virtuální editace a filtru tablign není práce s tabulkami ve Vimu zcela snadná. Jedná se jak o vlastní tvorbu tabulek, tak i o jejich následnou editaci. A to samozřejmě nepočítáme s tím, že by tabulky obsahovaly vzorečky, které by automaticky měnily obsah vypočtených buněk tak, jak je tomu v běžných tabulkových procesorech. Určité řešení ovšem existuje. Jedná se o plugin nazvaný table-mode, jehož repositář naleznete na adrese https://github.com/dhruvasagar/vim-table-mode. Na tomto pluginu je zajímavé mj. i to, že je celý naprogramován přímo ve VimScriptu a tudíž nevyžaduje žádné externí nástroje a dokonce ani to, aby byl Vim přeložen s podporou rozhraní pro další jazyky (Python, Luu, Perl atd.).

Obrázek 21: Nápověda k pluginu table-mode.

13. Instalace pluginu table-mode

Plugin table-mode je možné využít jak ve Vimu 7.x, tak i ve Vimu 8.x (o Vimu 7.x se zmiňuji z toho důvodu, že tuto verzi nalezneme na mnoha serverech se stabilní distribucí Linuxu). Pokud používáte Vim 8.x s vlastním správcem projektů, bude postačovat plugin nainstalovat do adresáře ~/.vim, který by měl mít následující strukturu (samotná instalace se tedy provede pouhým naklonováním repositáře):

.
└── pack
    └── packages
        └── vim-table-mode
            ├── autoload
            │   └── tablemode
            │       └── spreadsheet
            ├── doc
            ├── ftplugin
            ├── plugin
            └── t
                ├── config
                └── fixtures
                    ├── align
                    ├── cell
                    ├── formula
                    └── table

V případě, že musíte používat Vim 7, lze použít například správce projektů Pathogen. V takovém případě bude struktura adresáře ~/.vim vypadat poněkud odlišně:

.
├── autoload
│   └── go
│       └── test-fixtures
│           ├── cmd
│           ├── complete
.           .
.           .
.           .
├── bundle
│   ├── calendar-vim
│   │   ├── autoload
│   │   ├── doc
│   │   └── plugin
│   ├── rainbow_parentheses.vim
│   │   ├── autoload
│   │   └── plugin
│   ├── todo.txt-vim
│   │   ├── autoload
│   │   │   └── todo
│   │   ├── doc
│   │   ├── ftdetect
│   │   ├── ftplugin
│   │   └── syntax
│   │       └── python
│   │           └── dateregex
│   │               └── dateregex
│   ├── vim-fugitive
│   │   ├── doc
│   │   └── plugin
│   ├── vim-slime
│   │   ├── doc
│   │   └── plugin
│   └── vim-table-mode
│       ├── autoload
│       │   └── tablemode
│       │       └── spreadsheet
│       ├── doc
│       ├── ftplugin
│       ├── plugin
│       └── t
│           ├── config
│           └── fixtures
│               ├── align
│               ├── cell
│               ├── formula
│               └── table
├── doc
├── ftdetect
├── plugin
├── spell
└── syntax

Jinými slovy – repositář s pluginem je nutné naklonovat do podadresáře ~/.vim/bundle.

14. Přepnutí do „tabulkového režimu“

Ihned po své instalaci by měl být plugin table-mode k dispozici, ovšem vzhledem k tomu, že poměrně zásadním způsobem mění chování Vimu, je ho nutné explicitně aktivovat, popř. si explicitně vyžádat přeformátování tabulky. K tomu slouží následující příkazy, všechny zadávané v příkazovém režimu (proto je před nimi uvedena dvojtečka):

# Příkaz Stručný popis
1 :TableModeEnable přepnutí do režimu editace tabulek
2 :TableModeDisable vypnutí režimu editace tabulek
3 :TableModeToggle přepínání mezi běžnými režimy Vimu a režimem editace tabulek
4 :Tableize aktuální řádek se změní na tabulku

Obrázek 22: Aktivace režimu table-mode.

15. Vytvoření jednoduché tabulky z existujících dat

Novou tabulku je možné vytvořit hned několika různými způsoby. Pokud již máme k dispozici data s nějakým oddělovačem sloupců, můžeme taková data převést na tabulku velmi snadno, a to příkazem :Tableize. Vstupem může být soubor s tímto obsahem:

ID|Name|Surname
01|Foo|Bar

Výběrem obou řádků (libovolným způsobem) a spuštěním příkazu Tableize můžeme tento buffer změnit na tabulku:

| ID | Name | Surname |
| 01 | Foo  | Bar     |

Zde jsme konkrétně použili příkaz:

:%Tableize

Zcela stejným způsobem můžeme tabulku vytvořit z dat, kde jsou jednotlivé položky záznamů odděleny například čárkou:

ID,Name,Surname
01,Foo,Bar

Pro změnu použijeme odlišnou podobu příkazu :Tableize:

:1,$Tableize

Výsledek ovšem bude i v tomto případě totožný:

| ID | Name | Surname |
| 01 | Foo  | Bar     |

16. Specifikace oddělovače buněk

Poměrně často se můžeme setkat s tím, že soubor s daty bude mít odlišný oddělovač. V takovém případě musíme příkazu :Tableize tento oddělovač předat. Například soubor (či jeho část):

ID*Name*Surname
01*Foo*Bar
02*I*Robot

Převedeme na tabulku příkazem:

:%Tableize/*

S výsledkem:

| ID | Name | Surname |
| 01 | Foo  | Bar     |
| 02 | I    | Robot   |
Poznámka: zde je vhodné upozornit na to, že vstupní soubor může obsahovat různá data, tj. například tabulky smíchané s běžným textem atd. A právě v takových případech je :Tableize velmi užitečný, protože nám umožňuje vybrat jen několik řádků (ve vizuálním režimu) a poté pouze tyto řádky převést na skutečnou tabulku. To je poměrně podstatný rozdíl od různých pomocných skriptů, které například pracují s obsahem celého souboru, bez ohledu na to, že se v něm mohou nacházet různé poznámky, hlavičky, generovaná metadata apod.

Poslední příklad na dané téma. Tentokrát se bude jednat o známý soubor /etc/passwd, jehož údaje budeme chtít převést na tabulku:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin

Soubor otevřeme (pro jistotu jen pro čtení :-) a převedeme vybranou část (vizuální blok) na tabulku:

:'<,'>Tableize/:

Výsledkem by měl být buffer s následujícím obsahem:

| root     | x | 0  | 0     | root                 | /root           | /bin/bash         |
| daemon   | x | 1  | 1     | daemon               | /usr/sbin       | /usr/sbin/nologin |
| bin      | x | 2  | 2     | bin                  | /bin            | /usr/sbin/nologin |
| sys      | x | 3  | 3     | sys                  | /dev            | /usr/sbin/nologin |
| sync     | x | 4  | 65534 | sync                 | /bin            | /bin/sync         |
| games    | x | 5  | 60    | games                | /usr/games      | /usr/sbin/nologin |
| man      | x | 6  | 12    | man                  | /var/cache/man  | /usr/sbin/nologin |
| lp       | x | 7  | 7     | lp                   | /var/spool/lpd  | /usr/sbin/nologin |
| mail     | x | 8  | 8     | mail                 | /var/mail       | /usr/sbin/nologin |
| news     | x | 9  | 9     | news                 | /var/spool/news | /usr/sbin/nologin |
| uucp     | x | 10 | 10    | uucp                 | /var/spool/uucp | /usr/sbin/nologin |
| proxy    | x | 13 | 13    | proxy                | /bin            | /usr/sbin/nologin |
| www-data | x | 33 | 33    | www-data             | /var/www        | /usr/sbin/nologin |
| backup   | x | 34 | 34    | backup               | /var/backups    | /usr/sbin/nologin |
| list     | x | 38 | 38    | Mailing List Manager | /var/list       | /usr/sbin/nologin |

17. Ruční zápis nové tabulky

V předchozí kapitole jsme si ukázali, jakým způsobem můžeme vytvořit tabulku ve chvíli, kdy máme k dispozici vstupní textový soubor s daty. Ovšem nic nám nebrání si tabulku postupně vytvořit. Příkazem :TableModeEnable si nejdříve ověřte, že je režim zápisu tabulek povolen. Následně je možné si odzkoušet následující kroky:

Obrázek 23: Po zápisu prvního řádku se automaticky tabulka přeformátuje. Že se jedná o tabulku poznáme podle zvýraznění oddělovačů.

Obrázek 24: Zápis dalších řádků s automatickým formátováním tabulky.

Obrázek 25: Zápis dalších řádků s automatickým formátováním tabulky (po přechodu na další řádek).

Obrázek 26: Do tabulky lze pomocí || vložit vertikální oddělovač, který se automaticky naformátuje.

Obrázek 27: A následně se tabulka automaticky přeformátuje a zarovná.

CS24_early

18. Nové příkazy pro editaci tabulky

Plugin table-mode nabízí i další příkazy, které všechny začínají tzv. lokálním uvozovacím znakem. Tím bývá zpětné lomítko nebo čárka, osobně však používám mezeru. Nastavení této volby je snadné:

let maplocalleader = ","
# Zkratka Stručný popis příkazu
1 | vytvoření tabulky
2 leader+tt přeformátování tabulky
3 leader+T dtto, ale s volbou oddělovače
4 [| ]| přechod na předchozí/následující buňku
5 leader+tdd smazání celého řádku
6 leader+tdc smazání celého sloupce
7 leader+ts setřídění sloupce

19. Editace vzorců

Plugin table-mode podporuje i práci se vzorci, což je téma, kterému se budeme věnovat příště (navíc možná není tak užitečné, jako schopnost editovat ve Vimu tabulky civilizovaným způsobem).

20. Odkazy na Internetu

  1. tablign na PyPi
    https://pypi.org/project/tablign/
  2. tablign na GitHubu
    https://github.com/nschloe/tablign
  3. Tables in vim (reddit)
    https://www.reddit.com/r/vim/com­ments/8lyigo/tables_in_vim/
  4. vim-table-mode (repositář na GitHubu)
    https://github.com/dhruvasagar/vim-table-mode
  5. table-mode na Vim.org (starší verze!)
    https://www.vim.org/scrip­ts/script.php?script_id=4501
  6. Smarter Table Editing
    https://vim.fandom.com/wi­ki/Smarter_Table_Editing
  7. Smarter Table Editing II
    https://vim.fandom.com/wi­ki/Smarter_Table_Editing_II
  8. Články o Vimu na Root.cz:
    http://www.root.cz/n/vim/clanky/
  9. Replace and Virtual Replace Modes
    https://medium.com/vim-drops/replace-and-virtual-replace-modes-3e841b9161ca
  10. How can I easily create and maintain tables?
    https://vi.stackexchange.com/qu­estions/363/how-can-i-easily-create-and-maintain-tables
  11. Vim – the editor
    http://www.vim.org/
  12. 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/
  13. Popis skriptu Vim Pathogen
    http://www.vim.org/scripts/scrip­t.php?script_id=2332
  14. Posledníverze skriptu Vim Pathogen
    https://tpo.pe/pathogen.vim
  15. Nejlepší pluginy pro Vim
    http://vimawesome.com/
  16. Nejlepší pluginy pro Vim
    http://www.vim.org/scripts/scrip­t_search_results.php?order_by=ra­ting
  17. Vi Improved
    https://wiki.python.org/moin/Vim
  18. Building Vim
    http://vim.wikia.com/wiki/Bu­ilding_Vim
  19. Vim plugins for developers
    http://www.linuxtoday.com/upload/vim-plugins-for-developers-140619094010.html
  20. Writing Vim Plugins
    http://stevelosh.com/blog/2011/09/wri­ting-vim-plugins/
  21. how to understand this vim script?
    http://stackoverflow.com/qu­estions/12625091/how-to-understand-this-vim-script
  22. Novinky ve VIM 7: Skriptovací jazyk
    http://www.root.cz/vim-sedm-druha-cast/
  23. DirDiff.vim : A plugin to diff and merge two directories recursively.
    http://www.vim.org/scripts/scrip­t.php?script_id=102
  24. vim-dirdiff na GitHubu
    https://github.com/will133/vim-dirdiff
  25. fakeclip : pseudo clipboard register for non-GUI version of Vim
    http://www.vim.org/scripts/scrip­t.php?script_id=2098
  26. vim-fakeclip na GitHubu
    https://github.com/kana/vim-fakeclip
  27. vim-fakeclip: Dokumentace
    http://kana.github.io/con­fig/vim/fakeclip.html
  28. Vim Multiple Cursors na GitHubu
    https://github.com/terryma/vim-multiple-cursors
  29. SLIME (Wikipedia)
    http://en.wikipedia.org/wiki/SLIME
  30. vim-slime na GitHubu
    https://github.com/jpalardy/vim-slime
  31. The NERD tree: A tree explorer plugin for navigating the filesystem
    http://www.vim.org/scripts/scrip­t.php?script_id=1658
  32. 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
  33. snippetsEmu : An attempt to emulate TextMate's snippet expansion
    http://www.vim.org/scripts/scrip­t.php?script_id=1318
  34. c.vim : C/C++ IDE key mappings
    http://lug.fh-swf.de/vim/vim-c/c-hotkeys.pdf
  35. Základní základy editoru Vim
    http://www.root.cz/clanky/zakladni-zaklady-editoru-vim/
  36. Jak si přizpůsobit Vim
    http://www.root.cz/serialy/jak-si-prizpusobit-vim/
  37. Taglist (plugin)
    http://www.vim.org/scripts/scrip­t.php?script_id=273
  38. 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/
  39. c.vim : C/C++ IDE
    http://vim.sourceforge.net/scrip­ts/script.php?script_id=213
  40. The History of Vim
    https://jovicailic.org/2014/06/the-history-of-vim/
  41. Display date-and-time on status line
    http://vim.wikia.com/wiki/Display_date-and-time_on_status_line
  42. Vim 8.1 is available!
    https://www.vim.org/vim-8.1-released.php
  43. Vim 8.0 is released
    https://laravel-news.com/2016/09/vim-8–0-is-released/
  44. Vim: So long Pathogen, hello native package loading
    https://shapeshed.com/vim-packages/
  45. Asynchronous grep plugin for Vim
    https://github.com/ramele/agrep
  46. Run Async Shell Commands in Vim 8.0 / NeoVim and Output to Quickfix Window
    https://github.com/skywin­d3000/asyncrun.vim
  47. :smile command was not backported! #5116
    https://github.com/neovim/ne­ovim/issues/5116
  48. Run :make and :grep in background jobs (experimental)
    https://github.com/edkolev/vim-amake
  49. Favorite vim plugins
    http://sherifsoliman.com/2016/05/30/fa­vorite-vim-plugins/
  50. Makejob
    http://www.vim.org/scripts/scrip­t.php?script_id=5479
  51. Vim sedm – první část
    http://www.root.cz/clanky/vim-sedm-prvni-cast/
  52. vim (man page)
    http://www.linux-tutorial.info/modules.php?na­me=ManPage&sec=1&manpage=vim
  53. History of the Text Editor
    http://vanstee.me/history-of-the-text-editor.html
  54. Interview with Bill Joy
    http://web.cecs.pdx.edu/~kir­kenda/joy84.html
  55. vi Editor Commands
    http://www.cs.rit.edu/~cslab/vi­.html#A1.4
  56. vi Manual
    http://www.cs.fsu.edu/gene­ral/vimanual.html
  57. Mastering the Vi Editor
    http://www.susnet.uk/mastering-the-vi-editor

Byl pro vás článek přínosný?

Autor článku

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