4 個擁有絕佳命令列介面的終端程式
作者: Amjith Ramanujam 譯者: LCTT geekpi
讓我們來看幾個精心設計的 CLI 程式,以及如何解決一些可發現性問題。
在本文中,我會指出命令列介面的可發現性discoverability缺點以及克服這些問題的幾種方法。
我喜歡命令列。我第一次接觸命令列是在 1997 的 DOS 6.2 上。我學習了各種命令的語法,並展示瞭如何在目錄中列出隱藏的檔案(attrib
)。我會每次仔細檢查命令中的每個字元。 當我犯了一個錯誤,我會從頭開始重新輸入命令。直到有一天,有人向我展示瞭如何使用向上和向下箭頭按鍵遍歷命令列歷史,我被震驚了。
後來當我接觸到 Linux 時,讓我感到驚喜的是,上下箭頭保留了它們遍歷歷史記錄的能力。我仍然很仔細地打字,但是現在,我瞭解如何盲打,並且我能打的很快,每分鐘可以達到 55 個單詞的速度。接著有人向我展示了 tab 補完,再一次改變了我的生活。
在 GUI 應用程式中,選單、工具提示和圖示用於向用戶展示功能。而命令列缺乏這種能力,但是有辦法克服這個問題。在深入解決方案之前,我會來看看幾個有問題的 CLI 程式:
1、 MySQL
首先讓我們看看我們所鍾愛的 MySQL REPL。我經常發現自己在輸入 SELECT * FROM
然後按 Tab
yes
,它會顯示一堆 SQL 關鍵字、表、函式等。(LCTT 譯註:REPL —— Read-Eval-Print Loop,互動式開發環境)
MySQL gif
2、 Python
我們來看另一個例子,標準的 Python REPL。我開始輸入命令,然後習慣按 Tab
鍵。瞧,插入了一個 Tab
字元,考慮到 Tab
在 Python 原始碼中沒有特定作用,這是一個問題。
Python gif
好的使用者體驗
讓我看下設計良好的 CLI 程式以及它們是如何克服這些可發現性問題的。
自動補全: bpython
Bpython 是對 Python REPL 的一個很好的替代。當我執行 bpython 並開始輸入時,建議會立即出現。我沒用通過特殊的鍵盤繫結觸發它,甚至沒有按下 Tab
鍵。
bpython gif
當我出於習慣按下 Tab
鍵時,它會用列表中的第一個建議補全。這是給 CLI 設計帶來可發現性性的一個很好的例子。
bpython 的另一個方面是可以展示模組和函式的文件。當我輸入一個函式的名字時,它會顯示這個函式附帶的簽名以及文件字串。這是一個多麼令人難以置信的周到設計啊。
上下文感知補全:mycli
mycli 是預設的 MySQL 客戶端的現代替代品。這個工具對 MySQL 來說就像 bpython 之於標準 Python REPL 一樣。mycli 將在你輸入時自動補全關鍵字、表名、列和函式。
補全建議是上下文相關的。例如,在 SELECT * FROM
之後,只有來自當前資料庫的表才會列出,而不是所有可能的關鍵字。
mycli gif
模糊搜尋和線上幫助: pgcli
如果您正在尋找 PostgreSQL 版本的 mycli,請看看 pgcli。 與 mycli 一樣,它提供了上下文感知的自動補全。選單中的專案使用模糊搜尋縮小範圍。模糊搜尋允許使用者輸入整體字串中的任意子字串來嘗試找到正確的匹配項。
pgcli gif
pgcli 和 mycli 在其 CLI 中都實現了這個功能。斜槓命令的文件也作為補全選單的一部分展示。
可發現性: fish
在傳統的 Unix shell(Bash、zsh 等)中,有一種搜尋歷史記錄的方法。此搜尋模式由 Ctrl-R
觸發。當再次呼叫你上週執行過的命令時,例如 ssh或 docker,這是一個令人難以置信的有用的工具。 一旦你知道這個功能,你會發現自己經常會使用它。
如果這個功能是如此有用,那為什麼不每次都搜尋呢?這正是 fish shell 所做的。一旦你開始輸入命令,fish 將開始建議與歷史記錄類似的命令。然後,你可以按右箭頭鍵接受該建議。
命令列規矩
我已經回顧了一些解決可發現性的問題的創新方法,但也有一些基本的命令列功能應該作為每個 REPL 所實現基礎功能的一部分:
- 確保 REPL 有可通過箭頭鍵呼叫的歷史記錄。確保會話之間的歷史持續存在。
- 提供在編輯器中編輯命令的方法。不管你的補全是多麼棒,有時使用者只需要一個編輯器來製作完美的命令來刪除生產環境中所有的表。
- 使用分頁器(
pager
)來管道輸出。不要讓使用者滾動他們的終端。哦,要為分頁器設定個合理的預設值。(記得新增選項來處理顏色程式碼。) - 提供一種通過
Ctrl-R
介面或者 fish 式的自動搜尋來搜尋歷史記錄的方法。
總結
在第 2 節中,我將來看看 Python 中使你能夠實現這些技術的特定庫。同時,請檢視其中一些精心設計的命令列應用程式:
- bpython或 ptpython:具有自動補全支援的 Python REPL。
- http-prompt:互動式 HTTP 客戶端。
- mycli:MySQL、MariaDB 和 Percona 的命令列介面,具有自動補全和語法高亮。
- pgcli:具有自動補全和語法高亮,是對 psql 的替代工具。
- wharfee:用於管理 Docker 容器的 shell。
瞭解更多: Amjith Ramanujam 在 5 月 20 日在波特蘭俄勒岡州舉辦的 PyCon US 2017 上的談話“神奇的命令列工具”。
作者簡介:
Amjith Ramanujam - Amjith Ramanujam 是 pgcli 和 mycli 的創始人。人們認為它們很酷,他表示笑納讚譽。他喜歡用 Python、Javascript 和 C 程式設計。他喜歡編寫簡單易懂的程式碼,它們有時甚至會成功。