sim 与 Vim、Neovim、Helix 对比

Vim、Neovim 和 Helix 都是成熟而强大的编辑器,而 sim 是新的。这张表只涵盖能对照一手资料核实的内容:各编辑器自己的文档、CVE 条目、发布说明和 issue 跟踪器。来源没有说的,表里也不写。

核查于 2026-10-17。当时的最新版本:Vim 9.2.1202、Neovim 0.12.6、Helix 25.07.1。

主题VimNeovimHelixsim
扩展系统Vim script 和软件包(packages)。[1]Lua,以及 Vim script 插件。[2]已发布版本中没有插件系统。基于 Scheme(Steel)的插件系统是一个尚未关闭的草稿拉取请求(#8675,2026-10-09 更新)。最新版本是 25.07.1(2025 年 7 月)。[3] [4]没有,这是有意为之:插件在它“不会构建的东西”清单上。
modeline(文件中的设置)默认开启(root 下关闭)。自补丁 9.2.0350(2026 年 4 月)起,modeline 只能设置一小部分选项('modelinestrict',默认开启)。过去的 CVE:CVE-2019-12735、CVE-2026-34982。[5] [6] [7] [8]默认开启(root 下关闭);'modelineexpr' 为关闭。手册建议在编辑不受信任的文本之前禁用 modeline。CVE-2019-12735 在 0.3.6 中修复。[9] [7]不解析 modeline:相关请求(#729)尚未关闭,一个拉取请求(#7788)被关闭且未合并。[10] [11]从不读取。设置和命令不来自文件内容。
项目本地配置'exrc' 默认关闭。手册把开启它称为“a potential security leak”(潜在的安全泄露),并写道“BETTER NOT SET THIS OPTION!”(最好不要设置这个选项!)。[5]'exrc' 默认关闭。开启后,.nvim.lua、.nvimrc 和 .exrc 只有在文件位于信任列表中(:trust)时才会运行。[9]会从工作区加载 .helix/config.toml(25.07.1 的文档中有记载)。会先询问的工作区信任(PR #15177,2026 年 3 月合并)在开发分支上,尚未进入任何发布版本。[12] [13] [14] [3]没有配置文件,也没有可加载的项目本地配置。
双向控制字符(U+202E 等)显示为 <202e>:手册称不可打印字符和零宽 Unicode 字符显示为 <xxxx>,并且对不可打印字符使用 SpecialKey 高亮。[5]以 SpecialKey 高亮显示为 <202e>、<2066> 等(在我们的测试中,默认配色方案下为青色):U+200B–200F、U+202A–202E、U+2060–206F 和 U+FEFF 都在它的不可打印字符表中。[9] [15]25.07.1 版本中没有可见的标记(在我们的测试中,它们占一个空白单元格)。零宽字符是一个尚未关闭的 issue(#11255),控制字符会被原样写入终端(#16320,尚未关闭)。[16] [17] [3]在任何状态下都以品红色块显示 <U+202E>,绝不原样发送。字面文本 <U+202E> 没有色块。
被另一个进程改动的文件记住文件的时间戳、权限和大小,不一致时发出警告(在 shell 命令之后、在 GUI 获得焦点时,以及通过 :checktime 检查);'autoread' 会重新载入你没有改动过的缓冲区。[18]同样的检查和警告;'autoread' 会重新载入你没有改动过的缓冲区。[19]写入会被拒绝,并提示“file modified by an external process, use :w! to overwrite”(文件已被外部进程修改,请使用 :w! 覆盖)(在 #6492 中被引用)。自动重新载入是一个尚未关闭的请求(#1125)。[20] [21]监视打开的文件,在文本、标签页和文件树中标出改动之处,并在保存前比较文件的哈希;如果文件已变化,就不写入任何内容。在与该检查同一时刻发生的写入,仍可能漏过。

sim:项目自己的规格(README.md、SPEC.md、sim/SPEC.md、sim/CONCEPT.md)。

不可见字符的实测

对每一类什么也不画、或会作用于终端的字符,这里列出了用终端打开一个含有它的小文件时,Neovim 0.12.5 和 sim 各自显示了什么。只测了 Neovim,所以它是这张表里唯一的另一款编辑器。

测量日期 2026-10-18:Neovim 0.12.5(nvim --clean)和提交 d3caae2 的 sim,该提交包含在 sim 0.2.0 中。最新发布的 Neovim 0.12.6 没有测。[22]

字符类别Neovim 0.12.5sim
U+200B 零宽空格<200b><U+200B>
字母之间的 U+200D 零宽连接符无标记<U+200D>
Trojan Source:U+202E、U+2066、U+2069<202e> <2066> <2069><U+202E> <U+2066> <U+2069>
标签字符(ASCII smuggling)无标记<U+E0049> …
字母后的变体选择符(U+FE00–FE03、U+E0155 等)无标记<U+FE00> … <U+E0155> …
汉字后的表意文字变体选择符无标记葛<U+E0100>
谚文填充符 U+3164、U+115F、U+FFA0无标记<U+3164> <U+115F> <U+FFA0>
软连字符 U+00AD 和组合字素连接符 U+034F无标记<U+00AD> <U+034F>
单词连接符 U+2060<2060><U+2060>
行分隔符 U+2028无标记<U+2028>
未分配 U+0378、非字符 U+FDD0无标记<U+0378> <U+FDD0>
非字符 U+FFFF<ffff><U+FFFF>
文件中间的 U+FEFF<feff><U+FEFF>
ESC 和 DEL^[ ^?^[ ^?
C1 控制字符 U+0085<85><U+0085>
私用区(Nerd Font 图标)保持原样保持原样
带连接符和选择符的表情符号、键帽、英格兰旗保持原样保持原样

在 sim 会显示的 15 类字符中,Neovim 标记了 7 类,另有 8 类无标记。[23] [24] [25] [26]

“无标记”:终端收到的是字符本身,编辑器没有做任何标记。“保持原样”:两者都有意不处理(Nerd Font 的图标、表情符号序列)。其余单元格是在该字符位置画出的内容。

sim 一列是提交 d3caae2 的 sim。 文件、命令和每一行都记录在该提交的 sim 的 NOTES.md 中。

sim 打开的一个小 Rust 文件。标签字符里的隐藏指令、变体选择符里的载荷、双向控制字符、谚文填充符、软连字符和零宽空格,都被画成品红色块上可见的代码,如 <U+202E>。
sim,同一个文件:每个隐藏字符都是品红色块上可见的 <U+XXXX>。
Neovim 0.12.5 打开的同一个文件。标签字符、变体选择符、填充符和软连字符完全没有画出;只有双向控制字符和零宽空格显示为 <202e> 和 <200b>。
Neovim 0.12.5,同一个文件:因为标签字符和选择符没有画出,载荷那一行读起来是 "a";,第一行读起来是无害的注释。只画出了 <202e>、<2066>、<2069> 和 <200b>。

同一次测量显示的 sim 做法的代价:被显示的字符会占用其形式的列数(四位编码占 8 列,五位编码占 9 列),所以含有很多这类字符的行会变长;汉字后面的表意文字变体选择符会被显示;而且这种显示无法关闭。

其他编辑器目前仍做得更好的地方

sim 用广度换取固定的、可核查的行为。如果你现在就需要其中任何一项,请使用其他编辑器。

  • Neovim 和 Helix 自带语言服务器客户端。sim 目前没有,计划提供一个沙箱化的。[27] [28]
  • Vim 和 Neovim 可以用软件包和插件扩展。sim 不会提供插件。[1] [2]
  • Vim 和 Neovim 可以录制并回放宏。sim 目前没有宏,计划提供。寄存器和标记在 sim 0.2.0 中。[1]

核查方法

文档固定在最新的发布标签上。issue 和拉取请求引用的是上面所列日期当天的状态,这些状态之后可能变化。表中写有“在我们的测试中”的地方,是我们在所指定的版本中打开了一个含有真实 U+202E 的文件,并观察了它的绘制结果;这一点来源本身无法替我们说明。如果这里有任何过时或错误之处,应当予以更正。

来源

  1. Vim 9.2.1202, runtime/doc/repeat.txt (packages, recording)
  2. Neovim, Lua guide
  3. Helix 25.07.1 release (the latest, July 2025)
  4. Helix PR #8675: Add Steel as an optional plugin system (draft, open)
  5. Vim 9.2.1202, runtime/doc/options.txt ('modeline', 'modelinestrict', 'exrc', 'isprint', 'fsync')
  6. Vim patch 9.2.0350: Enabling modelines poses a risk ('modelinestrict')
  7. NVD: CVE-2019-12735 (Vim before 8.1.1365 and Neovim before 0.3.6, modeline)
  8. NVD: CVE-2026-34982 (Vim before 9.2.0276, modeline sandbox bypass)
  9. Neovim 0.12.6, runtime/doc/options.txt ('modeline', 'modelineexpr', 'exrc', 'isprint', 'fsync')
  10. Helix issue #729: Vim modeline parsing (open)
  11. Helix PR #7788: add basic modeline support (closed, not merged)
  12. Helix 25.07.1, book/src/configuration.md (a config.toml local to a project)
  13. Helix PR #15177: Add workspace trust support (merged 2026-03-26)
  14. Helix development branch, book/src/workspace-trust.md
  15. Neovim 0.12.6, src/nvim/mbyte.c (utf_printable)
  16. Helix issue #11255: Substitute unprintable characters in a buffer (open)
  17. Helix issue #16320: C0 control characters are written raw (open)
  18. Vim 9.2.1202, runtime/doc/editing.txt (timestamps)
  19. Neovim 0.12.6, runtime/doc/editing.txt (timestamps, 'autoread')
  20. Helix issue #6492: make the “file modified by an external process” message louder
  21. Helix issue #1125: automatic reload when file changes externally (open)
  22. sim, NOTES.md at commit d3caae2: “Hidden characters in Neovim 0.12.5, measured against sim” (2026-10-18)
  23. The Unicode Standard 18.0, chapter 23, Special Areas and Format Characters (§23.4 Variation Selectors, §23.9 Tag Characters)
  24. Unicode Technical Standard #51: Unicode Emoji, revision 31 (ZWJ sequences, emoji tag sequences, Annex C)
  25. Johann Rehberger, ASCII Smuggler Tool: Crafting Invisible Text and Decoding Hidden Codes (Embrace The Red, 14 January 2024)
  26. Endor Labs, Invisible Threats and the Blind Spots of Security (an analysis of GlassWorm)
  27. Neovim, LSP client
  28. Helix README (features)