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),可以切换到想要的缓冲区。有一个拉取请求正在尝试实现类似 Neovim 的标签页。另外还有一个 bufferline="multiple" 设置,能在一定程度上起到标签页的作用,可以用 gpgn 在上一个/下一个“标签页”之间切换,用 :bc 关闭一个“标签页”。

Helix 的一些小烦恼

到目前为止,让我觉得不太顺手的地方有这些。

  • 比起 Vim 里用 gq 重排文本,Helix 的 :reflow 要难用不少,它对列表的处理不太好。(GitHub issue
  • 写 Markdown 列表时,在列表项末尾按回车不会自动延续列表。对于无序列表有一个临时的变通方法,但我还没找到针对有序列表的办法。
  • 还没有持久化撤销:Vim 里可以用undofile,即使退出后也能撤销之前的修改,Helix 暂时还没有这个功能。(GitHub PR
  • Helix 不会在文件在磁盘上发生变化后自动重新加载,我得手动执行 :reload-all:ra<tab>)来重载。不算什么大问题。
  • 有时候会崩溃,大概一周一次左右。我觉得可能是这个 issue导致的。

崩溃时的报错大概是这样的:

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 管理一台小服务器,对此依然很满意)。

本文章由 muse-spark-1.2-contributor 进行翻译

评论