Notes on switching to Helix from vim

Julia Evans

从 vim 切换到 Helix 的一些笔记

大家好!今年夏天早些时候,我和一位朋友聊起我有多喜欢使用 fish(以及我有多喜欢不用配置它),他们说他们对 helix 文本编辑器也有同样的感受,于是我决定试一试。

到现在我已经用了 3 个月,下面是一些笔记。

为什么选 Helix:语言服务器

促使我尝试 Helix 的原因是我一直想搭好一套可用的语言服务器(language server)环境(这样就能用“跳转到定义”之类的功能),但要在 Vim 或 Neovim 里配出一套用起来舒服的环境实在太费劲了。

用了 Vim/Neovim 20 年之后,“从零搭建自己的自定义配置”和“使用别人做好的预置配置系统”这两种路子我都试过。虽然我很爱 Vim,但能有一个什么都不用配置、开箱即用的编辑器,还是让我很兴奋。

Helix 内置了语言服务器支持,能在任何语言里做“重命名这个符号”之类的事情,感觉很不错。

搜索功能很棒

我最喜欢 Helix 的地方之一就是它的搜索!当我在仓库的所有文件中搜索一个字符串时,它可以让我滚动浏览各个可能匹配的文件,并看到匹配处的完整上下文,就像这样:

作为对比,这是我一直在用的 vim ripgrep 插件的样子:

它看不到那一行周围的其他内容。

快捷参考很贴心

我喜欢 Helix 的另一点是:当我按下 g 时,会弹出一个小帮助窗口,告诉我可以跳转到哪些位置。这一点我非常感激,因为我不常用“跳转到定义”或“跳转到引用”功能,经常忘记对应的快捷键。

一些 vim 到 helix 的对应关系

  • Helix 没有 ma'a 这样的标记(marks),我一直改用 Ctrl+OCtrl+I 来回到(或前进到)上一个光标位置
  • 我想 Helix 应该有宏(macros),但在以前会用宏的场合,我现在都用多光标来代替。比起不停地写宏,我更喜欢多光标。如果我想批量修改文档中的某些内容,我的工作流程是按 %(全选),然后用 s 通过正则表达式选中要修改的内容,接着就可以随意编辑它们了。
  • Helix 没有 neovim 风格的标签页(tabs),而是有一个很好用的缓冲区切换器(<space>b),可以用它切换到我想要的缓冲区。这里有一个实现 neovim 风格标签页的pull request。另外还有一个设置项 bufferline="multiple",配合 gpgn 切换上一个/下一个“标签页”,:bc 关闭“标签页”,可以起到类似标签页的作用。

一些 Helix 的烦人之处

以下是目前为止 Helix 让我不爽的全部内容。

  • Helix 的 :reflow 远不如 vim 用 gq 重排文本的方式好用。它对列表的处理不太好。(github issue
  • 在写 Markdown 列表时,在列表项末尾按回车不会自动延续列表。对于无序列表有一个部分变通办法,但我不知道有序列表有没有类似办法。
  • 还没有持久化撤销(persistent undo)功能:在 vim 里我可以使用 undofile,这样即使退出后也能撤销更改。Helix 还没有这个功能。(github PR
  • 文件在磁盘上被修改后,Helix 不会自动重新加载,我得手动运行 :reload-all:ra<tab>)。不算什么大事。
  • 有时它会崩溃(panic),大概每周一次左右。我觉得可能是这个问题

崩溃时大概是这样:

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 不会)。

使用基于终端的文本编辑器

多年来我主要用的是 GUI 版的 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 发布

本文章由 stealth/ox-alpha 进行翻译