最近衝浪發現了一個新的 terminal 專案,試用了一下感覺很棒,寫篇文章安利一下:
Github Repo not found
The embedded github repo could not be found…
特性#
下面這張圖來自開發者的博客:
可以去開發者的原始博文中查看他對其中每條專案的說明。
簡單來說,作者認為當前主流的 terminal 程式在速度、功能豐富度和平台原生 GUI 三個方面做了不必要的取捨,這三者本應該是可以同時達成的。
I felt that the existing terminal emulators pushed an unnecessary choice between speed, features, and platform-native GUIs.
Ghostty 這個專案便是作者給出的答卷。
-
快速
Ghostty 和公認極快的 Alacritty 具有相近的性能,處於第一梯隊。 -
功能豐富
支持幾乎所有的現代終端規範,內建支持分屏、多 Tab 等功能,此外還包含超多的可配置項。 -
平台原生的 GUI 體驗
和其它主流終端程式對比,Ghostty 使用了更加原生的方式編寫應用。不同平台間共享大部分的核心代碼,但對於每個平台使用平台原生的 GUI 工具包開發。
具體來說,它在 MacOS 上使用 Swift,在 Linux 上使用 GTK。這允許 Ghostty 更好地利用平台原生功能,如更好的擴展塭集成、輸入法支持、桌面通知,甚至 macOS 安全輸入模式等。
我的經歷#
自從我使用 MacOS 以來,一直在嘗試尋找一個快速、可定制性強的終端。
在很長一段時間裡,我使用的是大家推薦的 Iterm2,它的體驗基本令人滿意,可主要問題是太慢了。在我個人的實際體驗中,Iterm2 的性能甚至不如 Vscode 的內建終端來得好,在 cat 大文本,甚至快速打字時都能感受到明顯的延遲。
正因如此,在尋求切換時我的第一選擇便是以性能聞名的 Alacritty:
它的整體體驗相當令人滿意,可不清楚是配置錯誤還是程式 bug,日常使用中總有一些讓我不舒適的點。
對 MacOS 的透明標題支持較差#
Mac 上比較主流的外觀是將交通燈按鈕與窗口融合到一起,在 terminal 方面則是標題欄與文本背景同色。這在 Iterm2 有著非常良好的支持,但 Alacritty 則不然。
Alacritty 支持將標題欄配置為透明,這可以實現我上述描述的外觀,但奇怪的點在於它對透明標題欄的實現似乎僅僅是在一個無標題欄的窗口上強行安上三個按鈕。這意味著:
- 明明屬於標題欄的部分卻能夠顯示內容,且會被交通燈遮擋
- 鼠標懸停在標題欄上,鼠標光標仍然是文本的樣式
- 拖動標題欄移動窗口的同時,鼠標事件還能透傳到終端中選擇文本導致閃爍
如果看描述沒有畫面,可以查看我下面的 GIF:
沒辦法我只能將標題設置為 buttonless,並使用 MacOS 中的 cmd + ctrl + 鼠標左鍵點擊窗口任意位置
的方式拖動窗口來規避這些問題。
窗口調整大小時的抖動和閃爍#
Alacritty 調整大小時字符會不斷抖動,現存文本會逐漸向上移動到窗口外,就像我在不斷換行一樣,同時會伴有偶發的白色閃爍。
可以查看我的如下 GIF(實際發生了一次閃爍,但似乎錄製不出來):
偶發的啟動卡死#
這個我在文章編寫過程中沒有復現,但發生的次數絕對不少,推測是在 cmd + Q
退出程式後快速重新打開窗口導致的衝突。
Ghostty 的體驗與配置過程#
正因上述問題,我在看到 Ghostty 後立馬萌生了體驗的想法。
簡單體驗後,我並沒有發現與 Alacritty 類似的 bug,也沒感覺出速度和 Alacritty 有差異。正如作者在 1.0 前瞻中說的那樣:
In short, Ghostty 1.0 aims to be the best drop-in replacement for your current terminal emulator on macOS and Linux.
至少對 MacOS 而言,一個性能不輸 Alacritty 的原生應用程式確實稱得上 “the best drop-in replacement for your current terminal emulator” 了。
哪怕拋開性能不談,也可以看出 Ghostty 比起 Alacritty 更重視對 MacOS 的支持。不論是單獨為 MacOS 適配原生的 Metal API 做渲染,還是使用 Swift 單獨編寫 MacOS 的 GUI,都能看得出這個專案是將 MacOS 作為第一平台開發的。
因此最終我決定切換過來。Ghostty 的官方文檔寫得很詳細,對照官方文檔可以很容易將現有的 Alacritty 外觀遷移到 Ghostty。
下面是我的配置成果圖與配置項參考。
成果圖#
左邊是 Alacritty,右邊是 Ghostty,經過配置後主體部分基本看不出任何區別。
配置項#
font-family = "ZedMono NFM Extd"
font-style-bold = "Medium"
font-style-bold-italic = "Medium Italic"
font-size = 13.4
font-thicken = true
grapheme-width-method = "unicode"
adjust-cell-width = -5%
palette = 0=#212733
palette = 1=#f08778
palette = 2=#53bf97
palette = 3=#fdcc60
palette = 4=#60b8d6
palette = 5=#ec7171
palette = 6=#98e6ca
palette = 7=#fafafa
palette = 8=#686868
palette = 9=#f58c7d
palette = 10=#58c49c
palette = 11=#ffd165
palette = 12=#65bddb
palette = 13=#f17676
palette = 14=#9debcf
palette = 15=#ffffff
background = #1f2430
foreground = #cbccc6
selection-invert-fg-bg = true
cursor-style = "bar"
cursor-style-blink = true
scrollback-limit = 100000
window-padding-x = 20
window-padding-y = 2,10
window-save-state = "always"