Náhrada utility cat nástrojem bat a ccat

9. 1. 2020
Doba čtení: 19 minut

Sdílet

Dnes se seznámíme s nástroji nazvanými bat a ccat. Jedná se o alternativy ke standardní utilitě cat, jejíž možnosti rozšiřují o schopnost obarvení syntaxe zdrojových kódů, souborů používajících značkovací jazyky apod.

Obsah

1. Utility cat a tac

2. Alternativa k utilitě cat – nástroj bat

3. Instalace nástroje bat

4. Základní použití nástroje bat

5. Další možnosti nabízené nástrojem bat

6. Podporované typy souborů

7. Volba barvového schématu

8. Barvová schémata použitá na tmavém pozadí

9. Barvová schémata použitá na světlém pozadí

10. Bat a Git

11. Další ukázky možností projektu bat

12. Ostatní nástroje sloužící pro zvýraznění syntaxe vybraného textu nebo souboru

13. Alternativní projekt ccat

14. Příklady použití nástroje ccat

15. Převod textu do HTML se zvýrazněním syntaxe

16. Obsah následující části seriálu

17. Odkazy na Internetu

1. Utility cat a tac

Standardní nástroj cat pravděpodobně není nutné pravidelným čtenářům Roota podrobněji představovat. Jedná se o utilitu, která se typicky používá pro zobrazení obsahu souborů (popř. speciálního souboru) na terminálu. Ovšem je ji možné použít i k dalším účelům, například pro spojení několika souborů s přesměrováním výstupu do výsledného souboru (což je obecnější řešení, než použití „operátoru“ + v jiných operačních systémech). Kromě toho je možné si zvolit i způsob zobrazení obsahu souboru. Přepínačem -n resp. –number se zapíná výpis čísel řádků, přepínač -E popř. –show-ends povoluje zobrazení znaků „$“ na konci každého řádku a přepínač -T neboli –show-tabs řídí zobrazení znaků horizontálního tabulátoru ve formě „^I“. Podobně lze pomocí -v určit zobrazení ostatních řídicích znaků (viz též přiložená trojice screenshotů).

Obrázek 1: Použití standardního nástroje cat pro zobrazení obsahu zdrojového souboru (se znaky Tab, protože se v tomto konkrétním případě jedná o zdrojový kód napsaný v jazyce Go).

Poznámka: přepínače -E a -T tedy zhruba odpovídají nastavení :set list v textovém editoru Vim.

V některých situacích (výpis historie v opačném pořadí atd.) je nutné zobrazit obsah nějakého souboru, ale s prohozeným pořadím textových řádků – poslední řádek se zobrazí jako první atd. Pro tento účel slouží další utilita, která se jmenuje tac (tedy „cat“ zapsáno obráceně). Tato utilita navíc umožňuje specifikaci, který znak či sekvence znaků je považována za označení konce řádku. Pokud jsou konce řádku označeny pevnou sekvencí znaků, lze ji specifikovat volbou -s popř. –separator, ovšem specifikovat je možné i regulární výraz volbou -r resp. její delší variantou –regex.

Obrázek 2: Přepínačem -t se v nástroji cat zapne zobrazování tabulátorů formou „^I“.

Poznámka: implementace tac je interně složitější, než je tomu v případě cat, protože samotný výpis (v opačném pořadí) může nastat až ve chvíli, kdy utilita nalezne konec souboru, resp. standardního vstupu.

Obrázek 3: Zvýraznění konců řádků znakem $ v nástroji cat.

Obrázek 4: Použití příkazu tac namísto cat vede k zobrazení řádků ze souboru se zdrojovým kódem v opačném pořadí.

2. Alternativa k utilitě cat – nástroj bat

Výše zmíněné utility cat a tac mají v praxi všemožné možnosti použití, a to jak při interaktivní práci v shellu, tak i při tvorbě shellových skriptů. Současně ale můžeme narazit i na určité limity, zejména při výpisu zdrojových kódů, souborů používajících značkovací jazyky (HTML, Markdown, AsciiDoc, TeX, LaTeX atd.), které bývají v prakticky všech programátorských textových editorech zobrazeny se zvýrazněnou syntaxí a mnohdy i s volitelným barevným schématem. Při interaktivní práci v shellu by mnohdy bylo velmi užitečné mít možnost si zobrazit obsah takových souborů se zvýrazněnou syntaxí, a to ideálně s využitím nějakého prohlížeče a nikoli plnohodnotného textového editoru, jehož chování nemusí být vždy užitečné (textový editor totiž mj. převezme vstup z klávesnice a nejedná se tedy o nástroj, který by bylo možné jednoduše spojit například s utilitou fzf (fuzzy finder), kterou si popíšeme příště).

Utility nahrazující a rozšiřující možnosti standardního nástroje cat samozřejmě existují a dokonce jich je několik. Jedna z těchto utilit (a nutno říci, že poskytovanými možnostmi asi nejlepší nástroj tohoto typu) se jmenuje bat, což je opět slovní hříčka odkazující na původní cat (a nikoli na dávkové – batch soubory z MS DOSu). Velkou předností batu je podpora poměrně značného množství různých typů souborů a taktéž možnost konfigurace barvového schématu použitého pro obarvení syntaxe, přičemž některá barvová schémata jsou určena pro tmavé pozadí terminálu a další pro pozadí světlé. Taktéž se jedná o dostatečně rychlý nástroj (i když podle benchmarků nikoli nejrychlejší, což však při běžném použití nemusí způsobovat žádné viditelné problémy) a zapomenout nesmíme na již výše zmíněnou možnost integrace fzf + bat. Navíc bat dokáže dokument automaticky zobrazovat po stránkách, k čemuž se používá nastavený nástroj typu „pager“ (typicky more a less).

Poznámka: mezi „chytré“ vlastnosti patří například to, že se při rozpoznání binárních souborů utilita nesnaží takový obsah zobrazit na terminálu, což mnohdy vede (kvůli různým kombinacím řídicích znaků) ke změně jeho konfigurace.

Obrázek 5: Logo nástroje bat.

Na rozdíl od minule popsaného nástroje Go Bullet Train, který je naprogramován v jazyce Go, je dnes popisovaná utilita bat vytvořena v Rustu. I přes značné rozdíly v sémantice obou zmíněných programovacích jazyků mají výsledné spustitelné podoby obou nástrojů podobné vlastnosti – jsou velmi rychlé a navíc má vlastní spustitelný binární soubor jen několik závislostí na dalších knihovnách. To mj. do značné míry zjednodušuje instalaci GBTbatu na těch distribucích, do nichž tyto utility nejsou (alespoň prozatím) zařazeny.

Poznámka: ve třinácté kapitole je zmíněna alternativa k batu, která se jmenuje ccat. Ta je pro změnu opět vytvořena v jazyce Go. Ovšem ccat prozatím podporuje jen několik programovacích jazyků a nelze zvolit barevná schémata, takže minimálně z pohledu nabízených funkcí je bat vítězem.

Obrázek 6: Zobrazení obsahu souboru .bashrc standardní utilitou cat.

Obrázek 7: Zobrazení obsahu téhož souboru .bashrc, tentokrát ovšem utilitou bat. Tento nástroj automaticky rozpoznal formát souboru a na základě této informace zvýraznil jeho syntaxi.

3. Instalace nástroje bat

V případě, že se nástroj bat nenachází v repositáři linuxové distribuce (což je v současnosti dosti pravděpodobné), je možné provést jeho instalaci buď z připravených spustitelných binárních souborů nebo provést překlad nástroje ze zdrojových souborů (k tomuto účelu je nutné mít nainstalovaný překladač Rustu a další podpůrné nástroje).

Obrázek 8: Standardní nástroj cat zobrazující zdrojový kód naprogramovaný v jazyce Go.

Obrázek 9: Tentýž zdrojový kód, ovšem nyní zobrazený batem, pochopitelně se zvýrazněním syntaxe.

Instalace spustitelného binárního souboru je většinou velmi snadná, pochopitelně pokud používáte nějakou podporovanou mikroprocesorovou architektu. V následujícím příkladu je ukázána instalace na platformě x86–64. Nejprve je nutné získat tarball se spustitelným binárním souborem pro tuto platformu, například nástrojem wget:

$ wget https://github.com/sharkdp/bat/releases/download/v0.12.1/bat-v0.12.1-x86_64-unknown-linux-gnu.tar.gz

Následně se tarball rozbalí:

$ tar xvfz bat-v0.12.1-x86_64-unknown-linux-gnu.tar.gz bat-v0.12.1-x86_64-unknown-linux-gnu

Poté je již pouze nutné umístit spustitelný soubor vzniklý po rozbalení do takového adresáře, na který ukazuje proměnná prostředí PATH (například do /usr/local/bin, popř. do adresáře bin nebo .local/bin umístěného v domácím adresáři).

Žádné podrobnější nastavení ani instalaci dalších balíčků již většinou není nutné provádět, protože spustitelné binární soubory získané překladem pomocí Rustu mají (ostatně podobně jako v případě Go) jen relativně malé množství závislostí, o čemž se můžeme snadno přesvědčit:

$ ldd bat 
 
        linux-vdso.so.1 (0x00007ffd6a5ea000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f65d5432000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f65d507c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f65d5d21000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f65d4e78000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f65d4c5a000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f65d4a43000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f65d46f8000)

Alternativně je možné provést překlad nástroje bat přímo ze zdrojových souborů. Potřebovat budete především překladač i další podpůrné nástroje programovacího jazyka Rust, a to včetně utility Cargo. Tentokrát namísto stažení tarballu s binárním spustitelným souborem naklonujeme repositář se zdrojovými kódy:

$ git clone --recursive https://github.com/sharkdp/bat

Poté přejdeme do adresáře s naklonovaným repositářem a provedeme překlad popř. i instalaci, a to přes nástroj Cargo:

$ cd bat
$ cargo build --bins
$ cargo install

Obrázek 10: I vestavěná nápověda batu se zobrazí se zvýrazněním syntaxe.

4. Základní použití nástroje bat

Nástroj bat se může používat podobným způsobem, jako standardní utilita cat v kombinaci s pagerem (less, more). V tom nejjednodušším případě je tedy možné zadat pouze jméno souboru, který se má zobrazit, ideálně i s obarvením (zvýrazněním) syntaxe v případě, že je typ souboru rozeznán a bat obsahuje příslušný popis syntaxe:

$ bat src/go/go-capture/capture.go

Obrázek 11: Zobrazení obsahu souboru .vimrc (tedy konfiguračního souboru pro textový editor Vim) nástrojem cat.

Obrázek 12: Tentýž soubor, ovšem zobrazený batem.

Zvolit je možné i barvové schéma, kterým se blíže věnujeme v sedmé kapitole:

$ bat src/go/go-capture/capture.go --theme ansi-light

Pokud je zapotřebí zobrazit soubor ve stylu „cat“ (obsah se zvýrazněním syntaxe, ovšem bez dalších dodatečných informací), použije se:

$ bat --plain src/go-root/article_01/01_hello_world.go

nebo jen:

$ bat -p src/go/go-capture/capture.go 

Existují i další varianty, například zobrazení čísel řádků:

$ bat --style numbers full src/go-root/article_01/01_hello_world.go

Přidání mřížky okolo textu:

$ bat --style grid src/go-root/article_01/01_hello_world.go

Popř. zobrazení všech dodatečných informací (čísla řádků atd.):

$ bat --style full src/go-root/article_01/01_hello_world.go

Obrázek 13: Zobrazení obsahu souboru ve stylu nástroje cat, ovšem s obarvením syntaxe.

Všechny řídicí znaky lze zobrazit volbou -A nebo její variantou –show-all:

$ bat .vimrc --show-all

Obrázek 14: Zobrazení (resp. přesněji řečeno zvýraznění) řídicích znaků.

5. Další možnosti nabízené nástrojem bat

Podívejme se nyní na některé další možnosti, které nám nástroj bat nabízí.

Zapnutí zalomení dlouhých řádků:

$ bat src/go-root/LICENSE --theme ansi-dark --wrap auto

Vypnutí zalomení:

$ bat src/go-root/LICENSE --theme ansi-dark --wrap never

Poslední varianta zalamování:

$ bat src/go-root/LICENSE --theme ansi-dark --wrap character

Zvýraznění vybraného řádku:

$ bat src/go/go-capture/capture.go --theme ansi-light --highlight-line 15

popř.:

$ bat src/go/go-capture/capture.go --theme ansi-light --highlight-line 15 -n
Poznámka: tuto volbu lze použít například ve skriptech, které zpracovávají výsledky překladů atd.

Zobrazení pouze vybraných řádků (včetně obou limitních řádků):

$ bat src/go/go-capture/capture.go --line-range 30:40

Specifikace, jaká pravidla pro obarvení syntaxe se mají zvolit, tentokrát nezávisle na jménu nebo koncovce souboru:

$ bat -m my.svg:xml src/sum.svg

Obrázek 15: Rozpoznání binárního souboru (nerozbije se nastavení terminálu).

Obrázek 16: Volbou -A lze mj. povolit i zobrazení binárních souborů.

6. Podporované typy souborů

Jednou z předností utility bat oproti jiným podobně koncipovaným nástrojům je podpora zvýraznění syntaxe mnoha typů programovacích jazyků, značkovacích jazyků i konfiguračních souborů (což ocení i administrátoři, nejenom programátoři). Všechny standardně podporované typy souborů i s jejich jmény či koncovkami jsou vypsány v následující tabulce, ovšem nejedná se o neměnné nastavení, protože v případě potřeby lze doplnit pravidla pro další typy souborů, upravit seznam koncovek (například .asm namísto .s) apod.:

# Jazyk, formát či typ souboru Koncovky či plná jména souborů
1 ActionScript as
2 Advanced CSV csv,tsv
3 AppleScript applescript,script editor
4 ARM Assembly s,S
5 AsciiDoc adoc,asciidoc,asc
6 ASP asa
7 Assembly (x86_64) yasm,nasm,asm,inc,mac
8 AWK awk
9 Batch File bat,cmd
10 BibTeX bib
11 Bourne Again Shell (bash) sh,bash,zsh,.bash_aliases,­.bash_completions,.bash_fun­ctions,.bash_login,.bash_lo­gout,.bash_profile,.bash_va­riables,.bashrc,.profile,­.textmate_init,.zshrc,PKGBU­ILD,.ebuild,.eclass
12 C c,h
13 C# cs,csx
14 C++ cpp,cc,cp,cxx,c++,C,h,hh,­hpp,hxx,h++,inl,ipp
15 Cabal cabal
16 Clojure clj,cljc,cljs,edn
17 CMake CMakeLists.txt,cmake
18 CMake C Header h.in
19 CMake C++ Header hh.in,hpp.in,hxx.in,h++.in
20 CMakeCache CMakeCache.txt
21 Crystal cr
22 CSS css,css.erb,css.liquid
23 D d,di
24 Dart dart
25 Diff diff,patch
26 Dockerfile Dockerfile,dockerfile
27 DotENV .env,.envrc,.env.dist,.en­v.local,.env.sample,.env.e­xample,.env.test,.env.tes­t.local,.env.dev,.env.deve­lopment,.env.development.lo­cal,.env.prod,.env.produc­tion,.env.production.local,­.env.dusk.local
28 Elixir ex,exs
29 Elm elm
30 Erlang erl,hrl,Emakefile,emakefile
31 F# fs,fsi,fsx
32 F# fs,fsi,fsx
33 friendly interactive shell (fish) fish
34 Git Attributes attributes,gitattributes,.gitattributes
35 Git Commit COMMIT_EDITMSG,MERGE_MSG,TAG_EDITMSG
36 Git Config gitconfig,.gitconfig,.gitmodules
37 Git Ignore exclude,gitignore,.gitignore
38 Git Link .git
39 Git Log gitlog
40 Git Rebase Todo git-rebase-todo
41 Go go
42 Graphviz (DOT) dot,DOT,gv
43 Groovy groovy,gvy,gradle,Jenkinsfile
44 Haskell hs
45 Haskell (improved) hs,hsc
46 Highlight non-printables show-nonprintable
47 hosts hosts
48 HTML html,htm,shtml,xhtml
49 HTML (ASP) asp
50 HTML (EEx) html.eex
51 HTML (Erlang) yaws
52 HTML (Rails) rails,rhtml,erb,html.erb
53 HTML (Tcl) adp
54 HTML (Twig) twig,html.twig
55 INI ini,INI,INF,reg,REG,lng,cfg,CFG,des­ktop,url,URL,.editorconfig,­.hgrc,hgrc
56 Java java,bsh
57 Java Properties properties
58 Java Server Page (JSP) jsp
59 JavaScript js,htc
60 JavaScript (Babel) js,jsx,babel,es6
61 JavaScript (Rails) js.erb
62 JSON json,sublime-settings,sublime-menu,sublime-keymap,sublime-mousemap,sublime-theme,sublime-build,sublime-project,sublime-completions,sublime-commands,sublime-macro,sublime-color-scheme,ipynb,Pipfile.lock
63 jsonnet jsonnet,libsonnet,libjsonnet
64 Julia jl
65 Kotlin kt,kts
66 LaTeX tex,ltx
67 Less less,css.less
68 Lisp lisp,cl,clisp,l,mud,el,scm,ss,lsp,fasl
69 Literate Haskell lhs
70 Lua lua
71 Makefile make,GNUmakefile,makefile,Ma­kefile,makefile.am,Makefi­le.am,makefile.in,Makefile­.in,OCamlMakefile,mak,mk
72 Manpage man
73 Markdown md,mdown,markdown,markdn
74 MATLAB matlab
75 NAnt Build File build
76 Nix nix
77 Objective-C m,h
78 Objective-C++ mm,M,h
79 OCaml ml,mli
80 OCamllex mll
81 OCamlyacc mly
82 orgmode org
83 Pascal pas,p,dpr
84 Perl pl,pm,pod,t,PL
85 PHP php,php3,php4,php5,php7,phps,phpt,phtml
86 Plain Text txt
87 PowerShell ps1,psm1,psd1
88 Protocol Buffer proto,protodevel
89 Protocol Buffer (TEXT) pb.txt,proto.text,textpb,pbtxt,prototxt
90 Puppet pp,epp
91 PureScript purs
92 Python py,py3,pyw,pyi,pyx,pyx.in,pxd,pxd­.in,pxi,pxi.in,rpy,cpy,SCon­struct,Sconstruct,sconstruc­t,SConscript,gyp,gypi,Sna­kefile,wscript
93 R R,r,s,S,Rprofile
94 Rd (R Documentation) rd
95 Regular Expression re
96 requirements.txt requirements.txt
97 reStructuredText rst,rest
98 Robot Framework syntax highlighting. robot
99 Ruby rb,Appfile,Appraisals,Ber­ksfile,Brewfile,capfile,cgi,Chef­file,config.ru,Deliverfile,Fas­tfile,fcgi,Gemfile,gemspec,Gu­ardfile,irbrc,jbuilder,Pod­file,podspec,prawn,rabl,ra­ke,Rakefile,Rantfile,rbx,rjs,ru­by.rail,Scanfile,simplecov,Snap­file,thor,Thorfile,Vagran­tfile
100 Ruby Haml haml,sass
101 Ruby on Rails rxml,builder
102 Rust rs
103 Sass sass
104 Scala scala,sbt
105 SCSS scss
106 SQL sql,ddl,dml
107 SQL (Rails) erbsql,sql.erb
108 SSH Config ssh_config
109 SSHD Config sshd_config
110 Strace strace
111 Swift swift
112 syslog log
113 Tcl tcl
114 Terraform tf,tfvars,hcl
115 TeX sty,cls
116 Textile textile
117 TOML toml,tml,Cargo.lock,Gopkg.lock,Pipfile
118 TypeScript ts
119 TypeScriptReact tsx
120 varlink varlink
121 Verilog v,V
122 VimL vim,.vimrc
123 XML xml,xsd,xslt,tld,dtml,rss,opml,svg
124 YAML yaml,yml,sublime-syntax

Všechny aktuálně podporované typy souborů je možné si nechat vypsat, a to konkrétně příkazem:

$ bat --list-languages
Poznámka: vzhledem k tomu, že bat je naprogramovaný v Rustu, nás asi nepřekvapí, že i příklady obarvení zdrojových kódů jsou napsány v tomto oblíbeném programovacím jazyce.

7. Volba barvového schématu

Již v úvodních kapitolách jsme si řekli, že při spouštění nástroje bat je možné si zvolit i některé barvové schéma, které se následně použije. To se provádí přepínačem –theme. Barvová schémata si dokonce můžeme všechna vypsat i s konkrétním příkladem zvýraznění syntaxe, a to následujícím příkazem:

$ bat --list-themes

8. Barvová schémata použitá na tmavém pozadí

Na dalších deseti screenshotech jsou jednotlivá barvová schémata ukázána. Nejdříve na tmavém pozadí (což je pravděpodobně konfigurace používaná na většině vývojářských počítačů):

Obrázek 17: Barvová schémata 1337, DarkNeon a GitHub.

Obrázek 18: Barvová schémata Monokai Extended, Monokai Extended Bright a Monokai Extended Light.

Obrázek 19: Barvová schémata Monokai Extended Origin, OneHalfDark a OneHalfLight.

Obrázek 20: Barvová schémata Sublime Snazzy, TwoDark a ansi-dark.

Obrázek 21: Barvová schémata ansi-light, base16 a zenburn.

9. Barvová schémata použitá na světlém pozadí

Nezapomeneme ani na schémata zobrazená na světlém pozadí (jen některá jsou čitelná, což je ovšem pochopitelné):

Obrázek 22: Barvová schémata 1337, DarkNeon a GitHub.

Obrázek 23: Barvová schémata Monokai Extended, Monokai Extended Bright a Monokai Extended Light.

Obrázek 24: Barvová schémata Monokai Extended Origin, OneHalfDark a OneHalfLight.

Obrázek 25: Barvová schémata Sublime Snazzy, TwoDark a ansi-dark.

Obrázek 26: Barvová schémata ansi-light, base16 a zenburn.

10. Bat a Git

Pokud se s využitím batu zobrazuje soubor z Git repositáře, který byl změněn, automaticky se přidané řádky označí znakem + a smazané řádky znakem -:

   1   │ module github.com/redhatinsighs/insights-operator-controller
   2   │
   3   │ go 1.13
   4   │
   5   │ require (
   6   │     github.com/ZachtimusPrime/Go-Splunk-HTTP v0.0.0-20190909123348-f5369e72b8af
   7   │     github.com/bitly/go-simplejson v0.5.0 // indirect
   8 + │     github.com/c-bata/go-prompt v0.2.3
   9   │     github.com/dgrijalva/jwt-go v3.2.0+incompatible
  10   │     github.com/gorilla/mux v1.7.3
  11 + │     github.com/gorilla/mux v1.7.3
  12 + │     github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
  13   │     github.com/lib/pq v1.2.0
  14 _ │     github.com/mattn/go-sqlite3 v1.11.0
  15   │     github.com/prometheus/client_golang v1.1.0
  16   │     github.com/spf13/viper v1.4.0
  17   │     github.com/verdverm/frisby v0.0.0-20170604211311-b16556248a9a
  18   │ )

11. Další ukázky možností projektu bat

Obrázek 26: Výchozí barvové schéma se nehodí pro světlá pozadí terminálu.

Obrázek 27: Přepnutí na čitelnější schéma.

Obrázek 28: Další schéma nevhodné pro světlá pozadí.

Obrázek 29: Zvýraznění řádku číslo 15.

Obrázek 30: Dtto, ovšem s vypnutím zobrazení všech dalších informací (kromě vlastního textu).

Obrázek 31: Zobrazení obsahu textového souboru se zdrojovým kódem se zobrazením řídicích znaků (taby, konce řádků, mezery).

12. Ostatní nástroje sloužící pro zvýraznění syntaxe vybraného textu nebo souboru

Již z předchozího textu víme, že bat není jedinou utilitou, která dokáže zobrazit obsah vybraného (většinou textového) souboru se zvýrazněním syntaxe. Mezi další nástroje nebo knihovny určené pro zvýraznění (obarvení) syntaxe patří především knihovna Pygments, s níž jsme se již na stránkách Roota setkali v článcích Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů a Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů: vlastní filtry a lexery. Tuto knihovnu určenou pro jazyk Python lze použít pro vytvoření aplikací, které mohou zpracovávat tokenizovaný kód popř. ho přímo zobrazovat s obarvením syntaxe. Kromě toho taktéž existuje projekt GNU Source-highlight, nástroj ccat zmíněný v navazujících kapitolách, nástroj Rouge (naprogramovaný pro změnu v jazyce Ruby) nebo utilita hicat (ta vyžaduje mít nainstalovány nástroje z ekosystému JavaScriptu a npm).

13. Alternativní projekt ccat

S projektem nazvaným ccat (ať již se jeho jméno vyslovuje jakkoli) jsme se již setkali v několika poznámkách v předchozím textu. Jedná se o projekt, který se v mnohém podobá batu, ovšem – alespoň prozatím – je jeho použití omezeno na menší množství typů souborů a taktéž nabídka barvových palet se zredukovala na paletu určenou pro terminály s tmavým pozadím a na paletu určenou pro pozadí světlá. Prozatím je podporováno zvýraznění syntaxe pro sedm programovacích jazyků (což je dáno vlastnostmi použité knihovny sourcegraph/ syntaxhighlight, která prozatím více jazyků nepodporuje):

# Jazyk
1 C
2 Go
3 Java
4 JavaScript
5 JSON
6 Python
7 Ruby
Poznámka: soubory JSON jsou zobrazovány se stejnými pravidly, jako JavaScript (i když zcela striktně řečeno není JSON podmnožinou notace zápisu objektů JavaScriptu).

Obrázek 32: Zobrazení zdrojového souboru s výchozím nastavením barvové palety připravené pro světlé prostředí terminálu.

Instalace nástroje ccat je v případě, že máte nainstalován překladač jazyka Go a nastaven GOPATH, zcela jednoduchá:

$ go get -u github.com/jingweno/ccat

Použít lze pochopitelně i alias:

$ alias cat=ccat
Poznámka: může se stát, že dojde ke kolizi jména tohoto balíčku s nástroji dostupnými v balíčku ccrypt. Samozřejmě není problém ccat přejmenovat (ostatně se většinou bude volat přes alias).

14. Příklady použití nástroje ccat

Základní použití – náhrada nástroje cat, ovšem s obarvením syntaxe:

$ ccat src/go/hello.go

Volba barvového schématu, zde konkrétně schématu připraveného pro terminály s tmavým pozadím (samotné pozadí se přitom nemění – takovou kontrolu nad terminálem tento nástroj nemá):

$ ccat --bg=dark src/go/hello.go

Obrázek 33: Zobrazení zdrojového souboru s výchozím nastavením barvové palety připravené pro tmavé prostředí terminálu.

Zobrazení barvové palety, která se použije:

$ ccat --palette

Obrázek 34: Zobrazení dostupné barvové palety (ve skutečnosti se mezi „black“ a „blue“ nalézá blikající text „blink“.

Změna jedné barvy z palety za jinou:

$ $ ccat -G String="_darkblue_" -G Plaintext="darkred" src/go/hello.go

Obrázek 35: Zobrazení souboru .bashrc.

15. Převod textu do HTML se zvýrazněním syntaxe

Potenciálně velmi užitečná funkce nástroje ccat spočívá v tom, že namísto zobrazení obsahu souboru s obarveným textem na standardním výstupu se provede převod do HTML, v němž budou použity značky pro změnu barvy textu. Jedná se o podobný postup, který nabízí například skript nazvaný „2html“, který je součástí sady nástrojů pro textový editor Vim. V případě použití nástroje ccat je pouze nutné výstup přesměrovat do nějakého nového souboru „novy.html“ a ten si následně zobrazit v prohlížeči (popř., což je ovšem dost divoká možnost, ho otevřít v textovém procesoru).

bitcoin školení listopad 24

Obrázek 36: Obsah souboru se zdrojovým kódem po jeho převedení do HTML stránky a zobrazení ve webovém prohlížeči.

16. Obsah následující části seriálu

Nástroje bat a ccat, s nimiž jsme se dnes alespoň ve stručnosti seznámili, jsou vlastně jen jednoúčelovými utilitami. Jejich plný přínos a možné usnadnění a urychlení práce doceníme až tehdy, pokud jejich možnosti zkombinujeme s dalšími nástroji. Jedním z velmi užitečných nástrojů s mnoha různými způsoby využití je i nástroj nazvaný fzf neboli plným jménem (command line) fuzzy finder. Tato utilita umožňuje nejenom vyhledávat soubory na základě interaktivně zadaných kritérií, ale například pracovat s procesy, proměnnými prostředí (environment variables), je spustitelná a plně integrovatelná do textového editoru Vim a především ji lze velmi snadno propojit s dnes popisovaným projektem bat. Nic nám navíc nebrání ji použít společně s minule zmíněným projektem Go Bullet Train.

17. Odkazy na Internetu

  1. Repositář projektu bat
    https://github.com/sharkdp/bat
  2. bat releases
    https://github.com/sharkdp/bat/re­leases
  3. Alternativy k batu
    https://github.com/sharkdp/bat/blob/mas­ter/doc/alternatives.md
  4. Ccat
    https://github.com/jingweno/ccat
  5. How to colorizing cat command output or files using ccat app on Linux or Unix system
    https://www.cyberciti.biz/howto/linux-unix-cat-command-with-colours/
  6. Repositář projektu fzf
    https://github.com/junegunn/fzf
  7. fzf wiki
    https://github.com/junegun­n/fzf/wiki/examples
  8. Vim universe. fzf – command line fuzzy finder (video)
    https://www.youtube.com/wat­ch?v=qgG5Jhi_Els
  9. fzf: Terminal Fuzzy Finder for Linux (video)
    https://www.youtube.com/watch?v=vt33Hp-4RXg
  10. Go Bullet Train (GBT)
    https://github.com/tisnik/gbt
  11. bullettrain-sh
    https://github.com/caiogondim/bullet-train.zsh
  12. An oh-my-zsh shell theme based on the Powerline Vim plugin
    https://github.com/caiogondim/bullet-train.zsh
  13. Nerd fonts
    https://www.nerdfonts.com/
  14. nerd-fonts (repositář)
    https://github.com/ryanoasis/nerd-fonts
  15. Shell
    https://en.wikipedia.org/wi­ki/Shell_(computing)
  16. Minimalistická a rychlá příkazová řádka pro libovolný shell Starship
    https://www.root.cz/zpravic­ky/minimalisticka-a-rychla-prikazova-radka-pro-libovolny-shell-starship/
  17. Finally, a command line shell for the 90s
    http://fishshell.com/
  18. Bourne shell
    https://en.wikipedia.org/wi­ki/Bourne_shell
  19. Korn shell
    http://www.kornshell.org/
  20. Prompt Expansion
    http://zsh.sourceforge.net/Doc/Re­lease/Prompt-Expansion.html#Prompt-Expansion
  21. PS1 prompt explained for Linux/Unix
    https://www.linuxnix.com/linuxunix-shell-ps1-prompt-explained-in-detail/
  22. Bash $PS1 Generator2.0
    https://www.kirsle.net/wi­zards/ps1.html
  23. BASH Git Prompt
    https://github.com/magicmonty/bash-git-prompt
  24. Seznam vybraných Unicode fontů
    https://en.wikipedia.org/wi­ki/Unicode_font#List_of_U­nicode_fonts
  25. Unix History
    https://www.levenez.com/unix/
  26. C shell
    https://en.wikipedia.org/wiki/C_shell
  27. tput(1) – Linux man page
    https://linux.die.net/man/1/tput
  28. fc-list(1) – Linux man page
    https://linux.die.net/man/1/fc-list
  29. fc-cache(1) – Linux man page
    https://linux.die.net/man/1/fc-cache
  30. fc-query(1) – Linux man page
    https://linux.die.net/man/1/fc-query
  31. Unicode character recognition
    http://shapecatcher.com/
  32. Pygments
    https://pygments.org/
  33. GNU Source-highlight 3.1.8
    https://www.gnu.org/software/src-highlite/

Autor článku

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