高手過招不用鼠標(biāo),一款超好用的跨平臺(tái)命令行界面庫

命令行工具是程序員的秘密武器,它們安裝簡單、啟動(dòng)速度快、界面簡潔,一條指令或者快捷鍵即可完成操作,用完即走深藏不露。

而最趁手的莫過于自己親手打造的!本期 《講解開源項(xiàng)目》 就介紹一個(gè)讓你快速擁有完美命令行界面的跨平臺(tái)庫—— tui.rs

你一定有過這樣的糾結(jié):我的程序需要一個(gè)界面,但使用諸如 Qt 等框架又比較繁瑣?,F(xiàn)在 tui.rs 來了,它是 Rust 下的命令行 UI 庫,不僅上手方便內(nèi)置多種組件,而且效果炫酷支持跨平臺(tái)使用。

輕松實(shí)現(xiàn)一份代碼可以無縫運(yùn)行在 Linux/Windows/Mac 之上!
接下來你不僅可以快速上手 tui.rs,還會(huì)收獲多款基于它構(gòu)建的神兵利器!
一、安裝
tui.rs 采用 Rust 語言編寫,和所有其他 Rust 依賴的安裝方法一樣,直接在 cargo.toml 中添加依賴即可:
[dependencies]tui = "0.17"
crossterm = "0.22"
如果需要官方示例,則直接 clone 官方倉庫:

二、快速入門
2.1 一覽芳容
我們主要使用 tui.rs 提供的以下模塊進(jìn)行 UI 編寫(所有 UI 元素都實(shí)現(xiàn)了 Widget 或 StatefuWidget Trait):
- bakend 用于生成管理命令行的后端
- layout 用于管理 UI 組件的布局
- style 用于為 UI 添加樣式
- symbols 描述繪制散點(diǎn)圖時(shí)所用點(diǎn)的樣式
- text 用于描述帶樣式的文本
- widgets 包含預(yù)定義的 UI 組件
如下代碼就可以實(shí)現(xiàn)一個(gè)很簡單的 tui 界面:

這些代碼可能看起來不少,但大部分都是固定的模板,不需要我們每次的重新構(gòu)思。下面,就讓我們來詳細(xì)了解其中的細(xì)節(jié)。
2.2 創(chuàng)作模板
官方通過 example 給出了使用 tui.rs 進(jìn)行設(shè)計(jì)的模板,我希望各位讀者在使用時(shí)也能遵守這套模板以保證程序的可讀性。
一個(gè)使用 tui.rs 程序的一生大概是這樣的:

其模塊可以大致分為:
- App.rs 實(shí)現(xiàn) App 結(jié)構(gòu)體,用于處理 UI 邏輯,保存 UI 狀態(tài)
- ui.rs 實(shí)現(xiàn) UI 渲染功能
但對(duì)于小型程序來講,也可以都寫在 main.rs 之中。
首先來看開始和結(jié)束部分關(guān)于 Terminal 的操作,每次運(yùn)行都會(huì)保存原始 Terminal 界面內(nèi)容并在一個(gè)新的窗體上運(yùn)行,在結(jié)束后又會(huì)恢復(fù)到原來的 Terminal 窗體中,有效地防止了搞亂原來的窗口內(nèi)容。這部分代碼模板官方已經(jīng)給出,基本無需修改:

接下來是處理 UI 邏輯的 run_App 函數(shù),我們在此處理諸如 用戶按鍵、UI 狀態(tài)更改等邏輯

對(duì)于功能簡單的界面來講,這個(gè)函數(shù)作用不大。但如果我們的程序需要更新一些組件狀態(tài)(比如列表選中項(xiàng)、用戶輸入、外界數(shù)據(jù)交互等)則應(yīng)在此統(tǒng)一處理。
之后,我們會(huì)使用 terminal.draw() 方法繪制界面,其接受一個(gè)閉包:

在這里,有如下流程:
- 使用 Layout 按照需求給定 Constraint 切分窗體,獲取 chunks,每個(gè) chunk 也可以利用 Layout 繼續(xù)進(jìn)行分割
- 實(shí)例化組件,每個(gè)組件都實(shí)現(xiàn)了 default 方法,在使用時(shí)我們應(yīng)該先使用 xxx::default() 獲取默認(rèn)對(duì)象,再利用默認(rèn)對(duì)象更新組件樣式。例如 Block::default().borders(Borders::ALL) 、Style::default().bg(Color::White) 等。這也是官方推薦做法。
- 使用 f.render_widget 渲染組件到窗體上,對(duì)于類似 列表 等存在狀態(tài)(比如當(dāng)前選中元素)的組件,則使用 f.render_stateful_widget 進(jìn)行渲染
關(guān)于 tui.rs 其他內(nèi)置組件的使用方法,可以查看官方的 example 文件,編寫套路是一樣的,可以根據(jù)需要直接復(fù)制粘貼。
需要注意到是,在此我們只關(guān)心 UI 組件的顯示方式和內(nèi)容,有關(guān)程序邏輯的內(nèi)容應(yīng)放在 run_App 中處理以免打亂程序架構(gòu)或影響 UI 繪制效果(你總不希望 UI 繪制到一半的時(shí)候因?yàn)檫M(jìn)行了某些 IO 操作而卡住了對(duì)吧?)
到這里對(duì)于 tui.rs 的介紹就結(jié)束了,實(shí)際上使用 tui.rs 編寫 UI 界面很簡單,只要根據(jù)創(chuàng)作模板結(jié)合官方例子一步步構(gòu)建,任何人都可以很快上手。
三、更多實(shí)用工具
下面將介紹介紹幾款基于 tui.rs 構(gòu)建的流行開源項(xiàng)目,它們無一例外是命令行工具里的“神兵利器“!
3.1 實(shí)時(shí)股票數(shù)據(jù)
支持查看不同時(shí)間維度以及交易量等數(shù)據(jù),股票實(shí)時(shí)數(shù)據(jù)來自雅虎。

地址:tarkah/tickrs
3.2 文件傳輸工具
支持 SCP/SFTP/FTP/S3 功能豐富的終端文件傳輸工具。

地址:veeso/termscp
3.3 網(wǎng)絡(luò)監(jiān)控工具
用于按進(jìn)程、連接、遠(yuǎn)程 IP、主機(jī)名顯示當(dāng)前網(wǎng)絡(luò)利用率。

地址:imsnif/bandwhich
限于篇幅這里就不介紹其它開源項(xiàng)目了,感興趣的小伙伴可以去項(xiàng)目首頁尋找。
四、最后
以上就是本文的所有內(nèi)容,希望您從中有所收獲。
最后,感謝您的閱讀和陪伴?。?!
這里是 HelloGitHub 分享 GitHub 上有趣、入門級(jí)的開源項(xiàng)目。您的每個(gè)點(diǎn)贊、留言、分享都是對(duì)我們最大的鼓勵(lì)!