从 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),可以切换到想要的缓冲区。有一个拉取请求正在尝试实现类似 Neovim 的标签页。另外还有一个bufferline="multiple"设置,能在一定程度上起到标签页的作用,可以用gp、gn在上一个/下一个“标签页”之间切换,用: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 的图形界面版本,所以真正切换到在终端里使用编辑器,还是需要一点适应。
最后我定下了这样的工作方式:
- 每个项目单独开一个终端窗口,窗口里的所有标签页(基本上)都使用同一个工作目录
- 把 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 管理一台小服务器,对此依然很满意)。
随机一篇博客
评论
登录后参与讨论