Last Updated on 2023-04-10 by Clay
Introduction
rich-cli
是一個基於 Python rich
套件的命令列工具,也就是說,我們可以不必撰寫 Python 程式碼就直接輸出彩色終端機的文字結果。
不過在終端機中還是直接被寫作 rich
。但重點是,我們可以替 Markdown 和 JSON 文件提供渲染,也能標記和格式化各式各樣的文本內容。
本篇文章的內容主要來自 rich-cli 的 GitHub,相關連結放置文末。下面我們首先來看看該如何安裝吧!
安裝方式
以下,我們有幾種選擇可以安裝 rich-cli
。
Windows / Linux
我們可以透過使用 pipx 安裝。pipx
是一個用於管理 Python 程式的工具,它允許您在虛擬環境中安裝並運行 Python 應用程序,而不會影響到全局環境。
pipx install rich-cli
MacOS
在 MacOS 的環境中,我們自然就是透過 Homebrew 來安裝 rich-cli 了。
brew install rich
Universal
另外一個通用的方法,就是直接使用 pip 安裝 python 的 rich-cli 套件:
python -m pip install rich-cli
或使用 conda 或 mamba:
mamba install -c conda-forge rich-cli
使用方法
選擇了上述任一種安裝方式後,現在我們應該在命令列中擁有 rich
指令了。首先我們來查看使用方法:
rich --help
Output:
Rich CLI v1.8.0 🤑 Rich text and formatting in the terminal Usage: rich [OPTIONS] <PATH,TEXT,URL, or '-'> ╭─ Options ────────────────────────────────────────────────────────────────────╮ │ -p --print Print console markup. See │ │ https://rich.readthedocs.io/en/lates… │ │ -u --rule Display a horizontal rule. │ │ -j --json Display as JSON. │ │ -m --markdown Display as markdown. │ │ --rst Display restructured text. │ │ --csv Display CSV as a table. │ │ --ipynb Display Jupyter notebook. │ │ --syntax Syntax highlighting. │ │ --inspect Inspect a python object. │ │ -h --head LINES Display first LINES of the file │ │ (requires --syntax or --csv). │ │ -t --tail LINES Display last LINES of the file │ │ (requires --syntax or --csv). │ │ -j --emoji Enable emoji code. e.g. :sparkle: │ │ -l --left Align to left. │ │ -r --right Align to right. │ │ -c --center Align to center. │ │ -L --text-left Justify text to left. │ │ -R --text-right Justify text to right. │ │ -C --text-center Justify text to center. │ │ -F --text-full Justify text to both left and right │ │ edges. │ │ --soft Enable soft wrapping of text │ │ (requires --print). │ │ -e --expand Expand to full width (requires │ │ --panel). │ │ -w --width SIZE Fit output to SIZE characters. │ │ -W --max-width SIZE Set maximum width to SIZE characters. │ │ -s --style STYLE Set text style to STYLE. │ │ --rule-style STYLE Set rule style to STYLE. │ │ --rule-char CHARACTER Use CHARACTER to generate a line with │ │ --rule. │ │ -d --padding TOP,RIGHT,BOTTOM,LEFT Padding around output. 1, 2 or 4 │ │ comma separated integers, e.g. 2,4 │ │ -a --panel BOX Set panel type to BOX. ascii, ascii2, │ │ double, heavy, none, rounded, square │ │ -S --panel-style STYLE Set the panel style to STYLE │ │ (requires --panel). │ │ --theme THEME Set syntax theme to THEME. See │ │ https://pygments.org/styles/ │ │ -n --line-numbers Enable line number in syntax. │ │ -g --guides Enable indentation guides in syntax │ │ highlighting │ │ -x --lexer LEXER Use LEXER for syntax highlighting. │ │ See https://pygments.org/docs/lexers/ │ │ -y --hyperlinks Render hyperlinks in markdown. │ │ --no-wrap Don't word wrap syntax highlighted │ │ files. │ │ --title TEXT Set panel title to TEXT. │ │ --caption TEXT Set panel caption to TEXT. │ │ --force-terminal Force terminal output when not │ │ writing to a terminal. │ │ -o --export-html PATH Write HTML to PATH. │ │ --export-svg PATH Write SVG to PATH. │ │ --pager Display in an interactive pager. │ │ -v --version Print version and exit. │ │ --help Show this message and exit. │ ╰──────────────────────────────────────────────────────────────────────────────╯ ♥ https://www.textualize.io
語法高亮
現在我們嘗試來對一個帶有程式碼的文件進行彩色輸出,也就是關鍵字高亮(highlight)。我們要在 rich
指令後加入文件的路徑。
rich
example.py
若要啟用行號,可以嘗試添加 --line-number
或 -n
。
若是添加 --guides
或 -g
則是啟用縮進指南。
rich example.py -n -g
若是有想要使用的主題,可以使用 --theme
來添加。我沒有認真去比對,不過我想主題名稱跟顏色搭配和 pygments 是相同的。
rich example.py --theme dracula
如果不想每次都指定主題,而是讓喜歡的主題變為預設配置,那麼我們可以設定 RICH_THEME
環境變數。以下命令等同於上面的命令:
RICH_THEME=dracula rich loop.py
也就是說,你可以把環境變數跟你的終端機設置綁定在一起,比方說在 ~/.bashrc 中寫入這個環境變數。
在默認情況下,如果 rich 發現行長度超過可用寬度,它將自動換行。我們可以使用 --no-wrap
關閉此行為;另外, rich 也會嘗試從文件名來推測文件格式,如果想要覆蓋自動檢測的語法分析器(比方說明明是 C++ 的程式但是 rich 卻搞錯成了 python,一般是若是副檔名正確是不會解析錯誤的),可以使用 --lexer
或 -x
開關顯式設置。
Markdown
添加 --markdown
或 -m
便能渲染 markdown 語法的文件。當然如果文件是以 .md 為副檔名,則會自動檢測 markdown。
rich README.md
若我們的終端機還支援顯示超連結的話,我們也可以添加 --hyperlinks
或 -y
,這將輸出超連結而不是完整的 URL。
rich README.md --hyperlinks
Jupyter notebook
在做資料分析時,jupyter notebook 是非常好用的編輯器,.ipynb 也支援我們隨時以單元(cell)來一小片段、一小片段地測試程式碼。
而在 rich-cli 中,自然也支援 jupyter notebook 的格式渲染。如果文件是以 .ipynb 為副檔名,則會自動檢測;如果不是以這為副檔名,也只需要添加 --ipynb
就能成功渲染。
rich example.ipynb
JSON
使用 --json
或 -j
能夠讓以 JSON 格式渲染文件。
rich example.json
CSV
rich 指令也可以將 CSV或 TSV 的內容顯示為表格。
rich example.csv
Rules
使用 --rule
或 -u
能夠渲染一條水平線,並且我們能夠使用 --rule-style
來指定這條水平線的樣式,也能以 --rule-char
來設置中間放置的文字。
rich "Hello [b]World[/b]!" --rule
rich "Hello [b]World[/b]!" --rule --rule-style "red"
rich "Hello [b]World[/b]!" --rule --rule-style "red" --rule-char "="
Pager
添加 --pager
就能以內建的分頁器(pager)來顯示文件內容。使用滑鼠、Page Up/Down、Home、End 或滾動條就能滾動頁面。如果想要使用使用 vi/vim 的移動方式(j、k、ctrl_d、ctrl-u)也是支援的。
rich example.py -n -g --theme monokai --pager
Network
rich
指令也可以直接渲染網路上的文件並呈現在終端機上,只要那個文件是可以存取的。我們只需要輸入一個以 http:// 或 https:// 開頭的 URL。這裡我們自然是直接以官方 GitHub 倉庫的 README.md 來做範例。
rich https://raw.githubusercontent.com/Textualize/rich-cli/main/README.md --markdown
Exporting
除了在終端機中渲染,rich 也可以將其渲染結果以 HTML 格式輸出。我們只需要加入 --export-html
或 -o
,然後輸入儲存的文件路徑。
rich README.md -o readme.html
執行後,我們應該會看到一份名為 readme.html 的文件。
Rich Printing
如果使用 --print
或 -p
選項,那麼我們會把第一個參數當作命令列標記,這樣可以添加如 bbcode 的樣式。實際範例如下:
rich "Hello, [bold magenta]World[/]!" --print
Soft wrapping
rich 指令預設會在適當位置來對文本進行換行,如果不需要此項設定,則可以使用 --soft
來禁用此默認設定。
Reading from Stdin
如果我們要從一個進程管線(pipe)來取得給 rich 的輸入,比方說從 cat
指令,我們可以使用以下指令格式:
请注意,当 rich 不直接写入终端时,它将禁用 ansi 颜色代码,因此您可能需要添加 --force-terminal
或 -F
来告诉 rich 保留 ansi 代码输出。
cat README.md | rich - --markdown --force-terminal
需要注意的是,這樣的使用方式會導致 rich
默認禁用 ANSI 顏色碼,因此需要添加如 --force-terminal
或 -F
來告訴 rich
保留 ANSI 碼的輸出。
通用選項
除此之外,還有許多通用的參數可以讓我們修改要渲染輸出的內容。之所以說是『通用』選項,是因為這些選項可以和上述的各種選項同時使用,而不會發生衝突。
樣式
我們可以使用 --style
或 -s
來設置輸出樣式。
rich "Hello, [b]World[/b]!" --print --style "on blue"
對齊
我們可以使用 --left
、--center
、--right
選項來將輸出對齊到我們想要的位置;也可以使用縮寫:-l
、-c
、-r
。
rich "Hello [b]World[/b]!" --print --center
寬度
我們也可以使用 --width
或 -w
來設置輸出所允許的寬度。
rich "I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration." -p -w 40
文本對齊
如果是要對整個文本進行對齊,則可以使用 --text-left
,--text-right
,--text-center
和 --text-full
;比較精簡的方式是單個字元選項:-L
,-R
,-C
和 -F
。
--left
和 --text-left
的區別在指定輸出寬度時較明顯。
以下是一個範例,我們指定了寬度為 40 (-w 40
),並使用 -c
來對齊。
rich "I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration." -p -w 40 -c -L
rich "I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration." -p -w 40 -c -R
rich "I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration." -p -w 40 -c -C
rich "I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration." -p -w 40 -c -F
填充
我們可以使用 --padding
或 -d
在輸出周圍填充。
rich "Hello [b]World[/b]!" -p -c --padding 3 --style "on blue"
面板
我們可以使用 --panel
或 -a
在文本周圍繪製面板,且面被可以採用多種樣式。
rich "Hello, [b]World[/b]!" -p -a heavy
基本上,rich-cli
是一個強大的命令列工具,能夠在終端機中生成美觀的輸出,如高亮顯示、markdown、json、jupyter notebook、csv…… 到文本對齊方式和樣式設置。這些功能能讓我們終端機的輸出不再呆板一致。