What's involved in getting a "modern" terminal setup?

Julia Evans

打造「現代化」終端機環境需要做些什麼?

哈囉!最近我做了一份終端機使用調查,詢問大家覺得有哪些令人困擾的地方。有一位受訪者這樣留言:

要擁有現代化的終端機體驗,需要處理的環節實在太多了。真希望這些功能一開始就內建好。

我當下的第一反應是「喔,要擁有現代化的終端機體驗沒那麼難,你只要……」就好,但越想越發現,這個「你只要……」的清單越來越長,而且需要補充的但書也越來越多。

所以我想寫下一些筆記,談談對我個人而言「現代化」終端機體驗究竟意味著什麼,以及我認為是哪些因素讓大家難以達到這樣的體驗。

什麼是「現代化的終端機體驗」?

以下是我認為重要的幾個功能,以及負責這些功能的是系統的哪個部分:

  • 支援多行複製貼上:如果我在 shell 貼上 3 個指令,它不應該馬上全部執行!那太可怕了!(shell終端機模擬器
  • 無限的 shell 歷史紀錄:如果我在 shell 執行過某個指令,它應該要永久保存,而不是在 500 筆之類的數量後就被刪除。而且我希望指令在執行當下就立刻寫入歷史紀錄,而不是等到結束 shell 連線階段才儲存(shell
  • 實用的提示字元:我的提示字元裡一定要有目前所在的目錄和目前的 Git 分支,沒有它們我活不下去(shell
  • 24 位元色彩:這對我很重要,因為我發現比起只有 256 色的終端機,有 24 位元色彩支援的環境要為 neovim 設定主題容易得多(終端機模擬器
  • 剪貼簿整合,讓 vim 與作業系統之間的剪貼簿能夠互通,這樣我在 Firefox 複製內容後,只要在 vim 裡按 p 就能貼上(文字編輯器,或許也與作業系統/終端機模擬器有關)
  • 優良的自動補齊:例如像 Git 這類指令應該要有針對該指令的自動補齊功能(shell
  • ls 顯示色彩shell 設定
  • 我喜歡的終端機主題:我在終端機裡花很多時間,希望它看起來賞心悅目,而且主題能和終端機編輯器的主題一致。(終端機模擬器文字編輯器
  • 自動修復終端機:如果某個程式印出了奇怪的跳脫字元序列把終端機弄亂了,我希望它能自動重置,讓終端機不會一直處於錯亂狀態(shell
  • 按鍵綁定:我希望 Ctrl+left arrow 能正常運作(shell應用程式
  • 能夠在像是 less 這類程式中使用滾輪捲動:(終端機模擬器應用程式

市面上還有成千上萬種其他的終端機便利功能,每個人重視的點都不一樣,但以上這些是少了會讓我非常困擾的功能。

我如何實現「現代化體驗」

我的基本做法是:

  1. 使用 fish shell。基本上不太做額外設定,除了:
    • EDITOR 環境變數設為我最喜歡的終端機編輯器
    • ls 設為 ls --color=auto 的別名
  2. 使用任何支援 24 位元色彩的終端機模擬器。過去我用過 GNOME Terminal、Terminator 和 iTerm,但我對這點並不挑剔。除了選擇字型之外,我幾乎不會另外設定。
  3. 使用 neovim,搭配我在過去約 9 年間慢慢累積建立的設定(上一次把 vim 設定全部刪除、從頭開始是 9 年前的事)
  4. 使用 base16 framework 來為所有東西套用主題

有幾個因素影響了我的做法:

  • 我不會花很多時間透過 SSH 連到其他機器上工作
  • 比起為所有操作都想出純鍵盤的操作方式,我寧願稍微多用一點滑鼠
  • 我同時處理很多小型專案,而不是單一大型專案

實現「現代化」體驗的一些「開箱即用」選項

如果你想要有不錯的體驗,卻不想花太多時間在設定上呢?要把 vim 設定到讓我滿意的狀態,真的花了我大約十年,這時間可不短!

我認為要用最少的設定獲得還不錯的終端機體驗,最好的建議是:

  • shell:使用 fish 或是搭配 oh-my-zshzsh
  • 終端機模擬器:幾乎任何支援 24 位元色彩的都可以,例如以下這些都很受歡迎:
    • linux:GNOME Terminal、Konsole、Terminator、xfce4-terminal
    • mac:iTerm(Terminal.app 不支援 256 色)
    • 跨平台:kitty、alacritty、wezterm 或 ghostty
  • shell 設定:
    • EDITOR 環境變數設為你最喜歡的終端機文字編輯器
    • 或許可以將 ls 設為 ls --color=auto 的別名
  • 文字編輯器:這就比較難抉擇了,或許是 microhelix?我兩者都沒有認真長期使用過,但它們看起來都是非常棒的專案,而且最讓人驚豔的是,你在 micro 裡可以直接使用所有常見的圖形介面編輯器指令(Ctrl-C 複製、Ctrl-V 貼上、Ctrl-A 全選),而且運作完全符合預期。我本來可能會想試著換成 helix,要不是重新訓練我的 vim 肌肉記憶實在太困難的話。而且 helix 目前還沒有圖形介面或外掛系統。

就我個人而言,我不會使用 xterm、rxvt 或 Terminal.app 作為終端機模擬器,因為以我過去的經驗,它們缺少了一些核心功能(以 Terminal.app 來說就是 24 位元色彩),讓終端機變得更難用。

不過我也不想假裝要獲得「現代化」終端機體驗比實際上更簡單——我認為有兩個問題讓這件事變得困難。我們來談談它們吧!

實現「現代化」體驗的難題 1:shell

bash 和 zsh 是目前最受歡迎的兩種 shell,但兩者預設提供的體驗都不是我開箱即用就會滿意的,例如:

  • 你需要自訂提示字元
  • 它們預設不會附帶 Git 補齊功能,你必須自行設定
  • 預設情況下,bash 只會儲存 500(!)行歷史紀錄,而(至少在 Mac OS 上)zsh 則只設定為儲存 2000 行,這仍然不算多
  • 我覺得 bash 的 Tab 補齊非常令人沮喪,如果有一個以上的符合項目,你就無法用 Tab 鍵逐一瀏覽它們

而且雖然我很喜歡 fish,但它並非 POSIX 相容,這確實讓許多人難以轉換過去。

當然,要學會如何在 bash 或其他 shell 中自訂提示字元是完全可行的,而且甚至不需要太複雜(在 bash 中我可能會先從像是 export PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' 這樣的設定開始,或是改用 starship)。但每一個「不複雜」的小設定累積起來就很可觀了,尤其是當你需要在多個系統之間同步設定時更是如此。

要獲得「現代化」shell 體驗,一個極受歡迎的解決方案是 oh-my-zsh。它看起來是個很棒的專案,我也知道很多人用得很開心,但我過去在使用這類設定系統時遇到不少困難——目前看來,光是基本的 oh-my-zsh 就加入了約 3000 行設定,而且我常常發現,多了一層設定系統會讓出問題時更難除錯。我個人常常會忍不住用這個系統加入一堆額外的外掛,把系統弄得很慢,然後因為太慢而感到沮喪,最後乾脆全部刪掉、從頭寫一份新的設定。

實現「現代化」體驗的難題 2:文字編輯器

在我最近做的終端機調查中,最受歡迎的終端機文字編輯器毫無疑問是 vimemacsnano

我認為終端機文字編輯器的主要選擇有:

  • 使用 vim 或 emacs 並依喜好設定,只要肯下功夫,你大概可以擁有任何想要的功能
  • 使用 nano,並接受你將會擁有相當有限的體驗(例如我認為在 nano 裡你無法用滑鼠選取文字後再「剪下」)
  • 使用 microhelix,它們似乎提供了相當不錯的開箱即用體驗,但偶爾可能會因為使用較非主流的文字編輯器而遇到問題
  • 盡量避免使用終端機文字編輯器,或許改用 VS Code,將 VS Code 的終端機用於所有終端機需求,而且幾乎不在終端機中編輯檔案。或者我知道很多人會在終端機中將 code 設為他們的 EDITOR

難題 3:個別應用程式

最後一個問題是,有時我使用的個別程式有點惱人。舉例來說,在我的 Mac OS 電腦上,/usr/bin/sqlite3 不支援 Ctrl+Left Arrow 這個快速鍵組合。要修正這個問題以在 SQLite 中獲得合理的終端機體驗有點複雜,我必須:

  • 搞清楚為什麼會發生這種事(Mac OS 不會內建 GNU 工具,而「Ctrl-左方向鍵」的支援來自 GNU readline)
  • 找到變通方法(從 Homebrew 安裝 sqlite,它就有支援 readline)
  • 調整我的環境(把 Homebrew 的 sqlite3 放到我的 PATH 中)

我發現要除錯這類針對特定應用程式的問題真的很不容易,而且常常覺得「不值得」——很多時候我最後就只是忍受各種小小的不便,因為我不想花好幾個小時去研究它們。我之所以還能夠弄清楚這次的問題,完全是因為我最近花了大量時間在思考終端機相關的事。

要在使用終端機程式時擁有「現代化」體驗,很大一部分就是直接使用較新的終端機程式,例如我懶得去學在 top 中排序欄位的快速鍵,但在 htop 中我只要用滑鼠點擊欄位標題就能排序。所以我就改用 htop!不過要發掘新的、更「現代化」的命令列工具並不容易(雖然我在這裡整理了一份清單),要找到實際上喜歡用的工具需要時間,而且如果你是透過 SSH 連到另一台機器,它們不一定會在那裡。

每個環節都互相影響

在設定終端機以讓一切變得「美好」時,我覺得棘手的一點是,改變工作流程中看似微小的一件事,真的可能會影響到其他所有環節。舉例來說,我現在沒有使用 tmux。但如果我需要再次使用 tmux(例如因為我有很多工作需要透過 SSH 在另一台機器上完成),我就得考慮一些事情,像是:

  • 如果我想要 tmux 的複製功能透過 SSH 與系統剪貼簿同步,我就得確保我的終端機模擬器有支援 OSC 52 支援
  • 如果我想使用 iTerm 的 tmux 整合功能(它會把 tmux 分頁變成 iTerm 分頁),我就得改變我設定色彩的方式——目前我是用一個在 shell 啟動時執行的 shell 腳本來設定色彩,但這意味著在還原 tmux 連線階段時色彩會遺失。

還有更多我沒想到的事情。「使用 tmux 意味著我必須改變管理色彩的方式」聽起來不太可能,但這真的發生在我身上,而我的決定是「好吧,我現在不想改變管理色彩的方式,所以我想我就不使用那個功能了!」。

要記住自己依賴了哪些功能也很困難——例如,也許我目前的終端機確實有支援 OSC 52,而因為透過 SSH 從 tmux 複製一直都能正常運作,我甚至沒意識到那是我需要的功能,然後當我換了終端機時,它就莫名其妙地失效了。

慢慢改變

就我個人而言,雖然我認為自己的設定並沒有那麼複雜,但我花了 20 年才走到今天這一步!因為終端機設定的變動很容易帶來意想不到且難以理解的後果,我發現如果一次改變太多終端機設定,一旦出問題,就會更難搞清楚哪裡出了錯,這真的會讓人很無所適從。

所以我通常偏好做很小的更動,並接受自己可能需要非常久的時間才能習慣這些改變。舉例來說,我在一、兩年前從使用 ls 改為使用 eza,雖然我很喜歡它(因為 eza -l 預設就會印出人類可讀的檔案大小),但我還是不太確定是否完全適應。不過有時大幅度的改變也是值得的,就像我 10 年前從 bash 換成 fish,我很慶幸當時做了這個決定。

要擁有「現代化」終端機並沒那麼容易

試圖解釋設定終端機有多「容易」,反而讓我覺得這件事其實有點困難,而且我到現在有時還是會感到困惑。

我發現,在終端機中永遠沒有一種完美的設定方式能與其他所有東西完全相容。我只需要不斷嘗試,找出某種對我而言局部穩定、能運作的狀態,並接受如果我開始使用新工具,它可能會打亂整個系統,讓我需要重新思考。

原文由 Julia Evans 發布

本文章由 muse-spark-1.2-contributor 進行翻譯