打造「現代化」終端機環境需要做些什麼?
原文由 Julia Evans 于 發布,訂閱此部落格
嗨!最近我做了一份關於終端機的問卷調查,詢問大家覺得最困擾的是什麼。有一個人這樣留言:
要擁有現代化的終端機體驗,需要拼湊太多東西了。真希望它開箱即用就好。
我當下的第一反應是:「喔,要有現代化的終端機體驗也沒那麼難,你只要……就好了」,但越想就越發現,那個「只要……」的清單越列越長,而且還不斷冒出各種但書。
所以我想寫下一些筆記,談談對我個人而言,擁有「現代化」終端機體驗是什麼意思,以及為什麼我覺得要達到那個狀態對很多人來說並不容易。
什麼是「現代化的終端機體驗」?
以下是有幾個對我來說很重要的功能,以及是由系統的哪個部分負責的:
- 多行複製貼上的支援:如果你在 shell 裡一次貼上 3 個指令,它不應該馬上全部執行!那也太可怕了!(shell、terminal emulator)
- 無限的 shell 歷史紀錄:我在 shell 裡執行的指令應該要永遠被保存下來,而不是超過 500 筆之類的就被刪掉。而且我希望指令一執行就立刻寫入歷史紀錄,而不是等到結束 shell 連線時才儲存(shell)
- 實用的提示字元:我的 prompt 裡如果沒有目前所在的目錄和目前的 git 分支,我根本活不下去(shell)
- 24 位元色彩:這對我很重要,因為我覺得有 24 位元色彩支援時,要幫 neovim 設定主題比只有 256 色的終端機容易太多了(terminal emulator)
- 剪貼簿整合:讓 vim 和我的作業系統剪貼簿互通,這樣我在 Firefox 裡複製後,就能在 vim 裡直接按
p貼上(text editor,可能也跟 OS / terminal emulator 有關) - 好用的自動補全:例如 git 這類指令應該要有針對該指令的自動補全(shell)
- 讓
ls有顏色顯示(shell config) - 我喜歡的終端機主題:我花很多時間在終端機上,我希望它看起來漂亮,而且主題能跟我的終端機編輯器一致。(terminal emulator、text editor)
- 自動修復終端機:如果有程式印出奇怪的跳脫字元把我的終端機搞亂了,我希望它能自動重置,不要讓終端機就這樣壞掉(shell)
- 快捷鍵:我希望
Ctrl+left arrow能正常運作(shell 或 application) - 能在
less這類程式裡使用滾輪捲動:(terminal emulator 和 applications)
終端機還有成千上萬種其他便利功能,每個人重視的東西都不一樣,但以上這些是我缺少了會非常不開心的。
我是怎麼達到「現代化體驗」的
我的基本做法是:
- 使用
fishshell。基本上不太另外設定,除了:- 把
EDITOR環境變數設成我最愛的終端機編輯器 - 把
ls設為ls --color=auto的別名
- 把
- 使用任何支援 24 位元色彩的終端機模擬器。以前我用過 GNOME Terminal、Terminator 和 iTerm,但我對這個不太挑。除了選個字型之外,基本上不會特別設定。
- 使用
neovim,搭配我過去大約 9 年來慢慢累積出來的設定(上一次把 vim 設定全部刪掉重來就是 9 年前) - 使用 base16 framework 來統一所有主題
幾個影響我做法的因素:
- 我不太常 SSH 連到其他機器上工作
- 比起為了每件事都想出純鍵盤的操作方式,我寧願稍微用一下滑鼠
- 我手上大多是很多小專案,而不是單一大型專案
開箱即用的「現代化」體驗選項
如果你想要不錯的體驗,但又不想花很多時間設定呢?要把 vim 設定到讓我滿意的狀態,真的花了我大約十年的時間,真的很久!
我認為用最少設定就能獲得合理終端機體驗的最佳方法有:
- shell:用
fish或是搭配 oh-my-zsh 的zsh - terminal emulator:幾乎任何支援 24 位元色彩的都可以,例如以下這些都很熱門:
- linux:GNOME Terminal、Konsole、Terminator、xfce4-terminal
- mac:iTerm(Terminal.app 沒有支援 256 色)
- 跨平台:kitty、alacritty、wezterm 或 ghostty
- shell config:
- 把
EDITOR環境變數設成你最愛的終端機文字編輯器 - 或許把
ls設為ls --color=auto的別名
- 把
- text editor:這個就比較難選,或許是 micro 或 helix?我沒有認真用過這兩個,但它們看起來都是很棒的專案,而且我覺得很厲害的是,你在 micro 裡可以直接使用所有常見的圖形介面編輯器指令(
Ctrl-C複製、Ctrl-V貼上、Ctrl-A全選),而且表現就跟你預期的一樣。我本來可能會想試著換成 helix,但要重新訓練我的 vim 肌肉記憶感覺實在太難了。而且 helix 目前還沒有圖形介面或外掛系統。
我個人不會把 xterm、rxvt 或 Terminal.app 當作終端機模擬器來用,因為以我過去的經驗,它們缺少了一些核心功能(像 Terminal.app 就缺少 24 位元色彩),讓終端機變得比較難用。
不過我也不想假裝要獲得「現代化」的終端機體驗比實際上更容易——我覺得有兩個問題讓這件事變得困難。來聊聊吧!
邁向「現代化」體驗的難題一:shell
bash 和 zsh 是目前最熱門的兩個 shell,但它們的預設體驗都不是我開箱即用就會滿意的,例如:
- 你需要自己客製化 prompt
- 它們預設沒有附 git 的自動補全,你得自己去設定
- 預設情況下,bash 只會儲存 500(!)行的歷史紀錄,而 zsh(至少在 Mac OS 上)只設定儲存 2000 行,這其實也不多
- 我覺得 bash 的 Tab 補全非常惱人,如果有一個以上的符合項目,你沒辦法用 Tab 逐一切換
而且雖然我很愛 fish,但它不符合 POSIX 標準這點,確實讓很多人難以轉換過去。
當然,要學會如何在 bash 之類的 shell 裡客製化你的 prompt 是完全可行的,而且也不一定很複雜(在 bash 裡我大概會從像 export PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' 這樣的設定開始,或是直接用 starship)。但每一個這種「不複雜」的小事累積起來就很可觀了,尤其是當你需要在多台機器之間同步設定時,更是麻煩。
要獲得「現代化」shell 體驗的一個超熱門解法是 oh-my-zsh。它看起來是個很棒的專案,我也知道很多人用得很開心,但我過去在使用這類設定系統時常常遇到困難——目前看起來,oh-my-zsh 的基礎設定就加入了大約 3000 行設定,而且我常常發現,多了一層設定系統會讓出問題時更難除錯。我個人很容易會用這個系統加一大堆外掛,把系統搞得很慢,然後對速度變慢感到沮喪,最後整個刪掉、從頭寫一份新的設定。
邁向「現代化」體驗的難題二:文字編輯器
在我最近做的終端機問卷調查中,最受歡迎的終端機文字編輯器毫無疑問是 vim、emacs 和 nano。
我認為終端機文字編輯器的主要選項有:
- 使用 vim 或 emacs 並依喜好去設定,只要肯下功夫,你大概可以擁有任何想要的功能
- 使用 nano,然後接受你會得到相當陽春的體驗(例如我覺得在 nano 裡你好像沒辦法用滑鼠選取文字然後「剪下」)
- 使用
micro或helix,它們似乎提供了相當不錯的開箱即用體驗,但偶爾可能會因為使用比較小眾的文字編輯器而遇到一些問題 - 盡量避免使用終端機文字編輯器,或許改用 VSCode,用 VSCode 的終端機來滿足所有終端機需求,而且幾乎不在終端機裡編輯檔案。或者我知道很多人會在終端機裡把
code設為他們的EDITOR。
難題三:個別的應用程式
最後一個問題是,有時候我用的個別程式有點煩人。舉例來說,在我的 Mac OS 電腦上,/usr/bin/sqlite3 不支援 Ctrl+Left Arrow 這個快捷鍵。為了在 SQLite 裡獲得合理的終端機體驗而修好這個問題有點複雜,我必須:
- 搞清楚為什麼會這樣(Mac OS 不會內建 GNU 工具,而「Ctrl-Left arrow」的支援是來自 GNU readline)
- 找到變通方法(從 homebrew 安裝 sqlite,它就有支援 readline)
- 調整我的環境(把 Homebrew 的 sqlite3 放到我的 PATH 裡)
我發現要除錯這類針對特定應用程式的問題真的很不容易,而且常常會覺得「不值得」——很多時候我最後就只是忍受各種小小的不便,因為我不想花好幾個小時去研究它們。我之所以還能搞懂這次這個問題,純粹是因為我最近花了非常多時間在思考終端機的事。
使用終端機程式要獲得「現代化」體驗,很大一部分就是直接去用比較新的終端機程式,例如我懶得去學在 top 裡用快捷鍵排序欄位,但在 htop 裡我只要用滑鼠點擊欄位標題就能排序。所以我就改用 htop!但要發掘新的、更「現代化」的命令列工具並不容易(雖然我在這裡整理了一份清單),要找到實際上用起來喜歡的工具需要時間,而且如果你是 SSH 連到另一台機器上,那些工具也不一定會在。
什麼都會互相影響
我覺得把終端機設定到讓一切都「很美好」時,有個棘手的地方在於,改變工作流程中一個看似微小的環節,真的會影響到其他所有東西。舉例來說,我現在沒有在用 tmux。但如果我又需要開始用 tmux(例如因為我有大量工作需要 SSH 到另一台機器上),我就得考慮一些事情,像是:
- 如果我想要 tmux 的複製功能透過 SSH 跟我的系統剪貼簿同步,我就得確保我的終端機模擬器有 OSC 52 support
- 如果我想使用 iTerm 的 tmux 整合功能(它會把 tmux 的分頁變成 iTerm 的分頁),我就得改變我設定顏色的方式——現在我是用一個在 shell 啟動時執行的 shell script 來設定顏色,但這表示在還原 tmux 連線時顏色就會跑掉。
還有更多我沒想到的事情。「使用 tmux 意味著我得改變管理顏色的方式」聽起來不太可能,但這真的發生在我身上,而我的決定是:「好吧,我現在不想改變管理顏色的方式,所以我想我就不使用那個功能了!」。
要記住自己到底依賴了哪些功能也很困難——例如,也許我目前的終端機的確有支援 OSC 52,而因為從 tmux 透過 SSH 複製一直都能正常運作,我甚至沒意識到那是我需要的功能,然後當我換了終端機時,它就莫名其妙地失效了。
慢慢地改變
以我個人來說,雖然我覺得我的設定並沒有那麼複雜,但我也花了 20 年才走到現在這個樣子!因為終端機設定的更動非常容易帶來意想不到又難以理解的後果,我發現如果一次改動太多終端機設定,一旦出問題,就會更難搞清楚到底哪裡出錯,這真的會讓人很不知所措。
所以我通常偏好只做很小的更動,並且接受要習慣這些改變可能會花上非常非常久的時間。舉例來說,我在一兩年前從 ls 換成了 eza,雖然我很喜歡它(因為 eza -l 預設就會印出人類可讀的檔案大小),但我到現在還不是很確定。但有時候做個大更動也是值得的,像我 10 年前從 bash 換成 fish,就非常慶幸自己做了這個決定。
要擁有「現代化」的終端機並不容易
試著去解釋設定終端機有多「簡單」,反而讓我覺得這件事其實有點難,而且我到現在有時還是會感到困惑。
我發現,在終端機裡從來沒有一種完美的設定方式能跟其他所有東西都相容。我只能不斷嘗試,找出某種對我而言局部穩定的狀態,然後接受如果我開始使用新工具,它可能會打破這個平衡,讓我得重新思考一次。
隨機一篇部落格
留言
登入後參與討論