Notes on switching to Helix from vim

Julia Evans

從 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+OCtrl+I 來回到(或前進到)上一個游標位置
  • 我想 Helix 應該也有巨集功能,不過我之前會用巨集的情況,現在都改用多重游標了。我覺得多重游標比一直寫巨集好用多了。如果想批次修改文件中的某些內容,我的做法是先按 %(選取全部),然後按 s 用正則表達式選出想修改的對象,接著就能一次編輯全部
  • Helix 沒有像 Neovim 那樣的分頁,不過它有一個很好用的緩衝區切換器(<space>b),可以讓我切換到想要的緩衝區。這裡有一個 pull request 正在實作類似 Neovim 的分頁功能。另外也有一個設定 bufferline="multiple",可以讓它表現得有點像分頁,用 gpgn 來切換上一個/下一個「分頁」,用 :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 的圖形介面版本,所以真的切換到在終端機裡使用編輯器,還需要一點時間適應。

最後我決定這樣做:

  1. 每個專案都用一個獨立的終端機視窗,該視窗中的所有分頁(大致上)都使用同一個工作目錄
  2. 我把 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 來管理一台小伺服器,對此也還算滿意)。

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

留言