Notes on switching to Helix from vim

Julia Evans

從 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+OCtrl+I 來回到(或前進到)上一個游標位置
  • 我想 Helix 應該也有巨集功能,但在過去會使用巨集的每個場合,我現在都改用多重游標。我比起一直寫巨集,更喜歡多重游標得多。如果我想批次修改文件中的某些內容,我的工作流程是按下 %(選取全部),然後按 s 透過正規表示式選取我想修改的內容,接著就能一次編輯所有選取處。
  • Helix 沒有像 Neovim 那樣的分頁,而是提供了一個好用的緩衝區切換器(<space>b),讓我可以切換到想要的緩衝區。這裡有一個合併請求正在實作類似 Neovim 的分頁功能。另外也有一個設定 bufferline="multiple",可以讓它有點像分頁一樣運作,搭配 gpgn 來切換上一個/下一個「分頁」,並用 :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 的圖形介面版本,所以轉換到真正在終端機中使用編輯器,需要一點時間適應。

最後我決定這樣做:

  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 的文章,但大概 8 個月後我又切回 Homebrew 了(不過我還是用 NixOS 來管理一台小伺服器,對此依然很滿意)。

原文由 Julia Evans 發布

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