從 Vim 切換到 Helix 的筆記
哈囉!今年夏天初,我和一位朋友聊到我有多麼喜歡使用 fish,以及我有多喜歡它不需要任何設定就能用。他說他對helix 文字編輯器也有同樣的感覺,所以我決定試試看。
我已經用了 3 個月了,以下是一些心得筆記。
為什麼選擇 Helix:language servers(語言伺服器)
我想促使我嘗試 Helix 的原因是,我一直想弄好 language server 的設定(這樣我就能做像是「跳至定義」這類的事),但要在 Vim 或 Neovim 裡弄出一套用起來順手的設定,感覺實在太費工了。
用了 Vim/Neovim 20 年之後,我既嘗試過「從零開始打造自己的客製化設定」,也試過「使用別人寫好的現成設定系統」,雖然我很愛 Vim,但對於完全不用調整設定、開箱即用的體驗,我感到非常期待。
Helix 內建了 language server 支援,能夠在任何語言中執行像是「重新命名這個符號」之類的操作,感覺很棒。
搜尋功能很棒
我最喜歡 Helix 的其中一點就是搜尋功能!如果我在儲存庫的所有檔案中搜尋某個字串,它會讓我捲動瀏覽所有可能符合的檔案,並看到符合處的完整上下文,就像這樣:

作為對比,這是我之前在 Vim 裡使用的 ripgrep 外掛的樣子:

它不會顯示該行周圍的其他內容。
快速參考很實用
我喜歡 Helix 的一點是,當我按下 g 時,會跳出一個小小的說明視窗,告訴我可以前往哪些地方。我非常喜歡這個功能,因為我不常使用「跳至定義」或「跳至參照」這類功能,常常忘記快捷鍵怎麼按。

一些 Vim 對應到 Helix 的轉換對照
- Helix 沒有像
ma、'a這樣的標記功能,取而代之,我一直使用Ctrl+O和Ctrl+I來回到(或前進到)上一個游標位置 - 我想 Helix 應該也有巨集功能,但在過去會使用巨集的每個場合,我現在都改用多重游標。我比起一直寫巨集,更喜歡多重游標得多。如果我想批次修改文件中的某些內容,我的工作流程是按下
%(選取全部),然後按s透過正規表示式選取我想修改的內容,接著就能一次編輯所有選取處。 - Helix 沒有像 Neovim 那樣的分頁,而是提供了一個好用的緩衝區切換器(
<space>b),讓我可以切換到想要的緩衝區。這裡有一個合併請求正在實作類似 Neovim 的分頁功能。另外也有一個設定bufferline="multiple",可以讓它有點像分頁一樣運作,搭配gp、gn來切換上一個/下一個「分頁」,並用:bc來關閉「分頁」。
一些讓人不滿意的 Helix 問題
以下是目前為止讓我覺得困擾的 Helix 問題。
- 我覺得 Helix 的
:reflow運作方式遠不如 Vim 用gq重新排版來得好。它處理清單的效果不太好。(GitHub 議題) - 如果我在編寫 Markdown 清單時,在清單項目的結尾按下 Enter,不會自動延續清單。對於項目符號清單有一個部分變通方法,但我不知道編號清單的解決辦法。
- 還沒有持續復原功能:在 Vim 中我可以使用 undofile,讓我在結束程式後仍能復原變更。Helix 目前還沒有這個功能。(GitHub PR)
- Helix 不會在磁碟上的檔案變更後自動重新載入,我必須執行
:reload-all(:ra<tab>)來手動重新載入。不是什麼大問題。 - 有時候它會當機,大概每週一次左右。我想可能是這個問題。
當機的樣子大概像這樣:
thread 'main' panicked at helix-core/src/transaction.rs:499:9:
Positions [(2959, AfterSticky), (2959, AfterSticky)] are out of range for changeset len 2945!
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
「Markdown 清單」和重新排版的問題對我來說很常出現,因為我花很多時間編輯 Markdown 清單,但我還是繼續使用 Helix,所以我想這些問題應該沒有真的讓我那麼生氣。
切換比想像中容易
我本來擔心要重新學習累積了 20 年的 Vim 肌肉記憶會非常困難。
結果比我預期的容易多了,我是在休假期間開始在一個小型的、低風險的業餘寫程式專案中使用 Helix,一兩週後就不再感到那麼手忙腳亂。我想在 Vim 和 Helix 之間來回切換可能會很困難,但我最近都沒有需要用到 Vim,所以不知道這對我來說是否會成為問題。
第一次嘗試 Helix 時,我試圖強迫它使用更接近 Vim 的按鍵綁定,但對我來說行不通。直接學習「Helix 的方式」反而容易得多。
還是有一些地方會讓我混淆:例如 Vim 中的 w 和 Helix 中的 w 對於「單字」是什麼有不同的定義(Helix 的版本會包含單字後面的空白,Vim 的則不會)。
使用以終端機為基礎的文字編輯器
好多年來我大多使用 Vim/Neovim 的圖形介面版本,所以轉換到真正在終端機中使用編輯器,需要一點時間適應。
最後我決定這樣做:
- 每個專案都使用獨立的終端機視窗,而該視窗中的所有分頁(大部分)都使用相同的工作目錄
- 我把 Helix 的分頁設為終端機視窗中的第一個分頁
運作得相當不錯,我甚至可能比以前的工作流程更喜歡這樣。
我的設定
我很喜歡我的設定非常簡單,相較於長達數百行的 Neovim 設定,這裡大多只是 4 個快捷鍵。
theme = "solarized_light"
[editor]
# Sync clipboard with system clipboard
default-yank-register = "+"
[keys.normal]
# I didn't like that Ctrl+C was the default "toggle comments" shortcut
"#" = "toggle_comments"
# I didn't feel like learning a different way
# to go to the beginning/end of a line so
# I remapped ^ and $
"^" = "goto_first_nonwhitespace"
"$" = "goto_line_end"
[keys.select]
"^" = "goto_first_nonwhitespace"
"$" = "goto_line_end"
[keys.normal.space]
# I write a lot of text so I need to constantly reflow,
# and missed vim's `gq` shortcut
l = ":reflow"
還有一個獨立的 languages.toml 設定檔,讓我可以設定一些語言偏好,例如關閉自動格式化。舉例來說,這是我的 Python 設定:
[[language]]
name = "python"
formatter = { command = "black", args = ["--stdin-filename", "%{buffer_name}", "-"] }
language-servers = ["pyright"]
auto-format = false
之後再看看情況如何
三個月並不算長,我有可能在某個時候決定回到 Vim。舉例來說,我之前寫過一篇關於切換到 Nix 的文章,但大概 8 個月後我又切回 Homebrew 了(不過我還是用 NixOS 來管理一台小伺服器,對此依然很滿意)。
隨機一篇部落格