從 Vim 切換到 Helix 的筆記
原文由 Julia Evans 于 發布,訂閱此部落格
哈囉!今年夏天初,我跟朋友聊到我有多喜歡用 fish,喜歡它完全不需要設定就能直接使用。他們說對於Helix 文字編輯器也有同樣的感覺,所以我就決定試試看。
我已經用了三個月,以下是一些筆記。
為什麼選擇 Helix:語言伺服器
我想讓我決定嘗試 Helix 的原因是,我一直想把語言伺服器設定好(這樣才能做到像「跳至定義」這類功能),但在 Vim 或 Neovim 上要弄出一套用起來順手、感覺良好的設定,實在太費工了。
用了 Vim/Neovim 二十年,我試過「從零開始打造自己的客製化設定」和「使用別人做好的現成設定系統」兩種方式,雖然我很愛 Vim,但對於完全不用費心調整設定、一切就能直接運作這件事,還是感到很期待。
Helix 內建了語言伺服器支援,能在任何語言中直接使用「重新命名這個符號」之類的功能,感覺很不錯。
搜尋功能很棒
我最喜歡 Helix 的其中一點就是搜尋功能!當我在整個專案的所有檔案中搜尋某個字串時,它可以讓我捲動瀏覽所有可能符合的檔案,並看到符合處的完整上下文,像這樣:

作為對比,這是我之前在 Vim 上用的 ripgrep 外掛,長這樣:

完全看不到那一行前後的其他內容。
快速提示很貼心
我喜歡 Helix 的一點是,當我按下 g 時,會跳出一個小小的說明視窗,告訴我可以跳去哪些地方。我很喜歡這個設計,因為我不常使用「跳至定義」或「跳至參照」這類功能,常常會忘記快速鍵是什麼。

一些從 Vim 到 Helix 的對應轉換
- Helix 沒有像
ma、'a這樣的標記功能,取而代之,我一直都是用Ctrl+O和Ctrl+I來回到(或前進到)上一個游標位置 - 我想 Helix 應該也有巨集功能,不過我之前會用巨集的情況,現在都改用多重游標了。我覺得多重游標比一直寫巨集好用多了。如果想批次修改文件中的某些內容,我的做法是先按
%(選取全部),然後按s用正則表達式選出想修改的對象,接著就能一次編輯全部 - Helix 沒有像 Neovim 那樣的分頁,不過它有一個很好用的緩衝區切換器(
<space>b),可以讓我切換到想要的緩衝區。這裡有一個 pull request 正在實作類似 Neovim 的分頁功能。另外也有一個設定bufferline="multiple",可以讓它表現得有點像分頁,用gp、gn來切換上一個/下一個「分頁」,用:bc來關閉「分頁」
一些讓人困擾的 Helix 小問題
以下是目前為止讓我覺得困擾的所有地方。
- 比起 Vim 用
gq重排文字的方式,我覺得 Helix 的:reflow難用多了。它在處理清單時效果不太好。(GitHub issue) - 在編輯 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,所以想來也沒有真的那麼惱人。
轉換比想像中容易
我本來很擔心,要重新學習累積了二十年的 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 的文章,但大概八個月後我就又換回 Homebrew 了(不過我還是用 NixOS 來管理一台小伺服器,對此也還算滿意)。
隨機一篇部落格
留言
登入後參與討論