sim vs Vim, Neovim and Helix

Vim, Neovim and Helix are mature, capable editors, and sim is new. This table covers only what can be checked against a primary source: the editors' own docs, CVE entries, release notes and issue trackers. Where the sources do not say, the table says nothing.

Checked on 2026-10-17. Latest releases then: Vim 9.2.1202, Neovim 0.12.6, Helix 25.07.1.

TopicVimNeovimHelixsim
Extension systemVim script and packages.[1]Lua, and Vim script plugins.[2]No plugin system in a release. A Scheme (Steel) plugin system is an open draft pull request (#8675, updated 2026-10-09). The latest release is 25.07.1 (July 2025).[3] [4]None, by design: plugins are on its list of things it does not build.
Modelines (settings in a file)On by default (off for root). Since patch 9.2.0350 (April 2026) only a short list of options may be set from a modeline ('modelinestrict', on by default). Past CVEs: CVE-2019-12735, CVE-2026-34982.[5] [6] [7] [8]On by default (off for root); 'modelineexpr' is off. The manual says to disable modelines before editing untrusted text. CVE-2019-12735 was fixed in 0.3.6.[9] [7]Does not parse modelines: the request (#729) is open, and a pull request (#7788) was closed without merging.[10] [11]Never read. Settings and commands do not come from file contents.
Project-local configuration'exrc' is off by default. The manual calls turning it on “a potential security leak” and says “BETTER NOT SET THIS OPTION!”.[5]'exrc' is off by default. When on, .nvim.lua, .nvimrc and .exrc run only if the file is in the trust list (:trust).[9]Loads a .helix/config.toml from the workspace (documented for 25.07.1). Workspace trust, which asks first (PR #15177, merged March 2026), is on the development branch and in no release yet.[12] [13] [14] [3]No config files, and no project-local configuration to load.
Bidirectional control characters (U+202E and friends)Shown as <202e>: the manual says unprintable and zero-width Unicode characters are displayed as <xxxx>, and that SpecialKey highlighting is used for unprintable characters.[5]Shown as <202e>, <2066> and so on, in the SpecialKey highlight (cyan in the default color scheme, in our test): U+200B–200F, U+202A–202E, U+2060–206F and U+FEFF are in its unprintable table.[9] [15]No visible marker in release 25.07.1 (they take a blank cell in our test). Zero-width characters are an open issue (#11255), and control characters are written raw to the terminal (#16320, open).[16] [17] [3]<U+202E> on a magenta block in every state, never sent raw. The literal text <U+202E> gets no block.
A file changed by another processRemembers the file's timestamp, mode and size and warns when they differ (checked after shell commands, in the GUI on focus, and by :checktime); 'autoread' reloads a buffer you have not changed.[18]The same checks and warnings; 'autoread' reloads a buffer you have not changed.[19]A write is refused with “file modified by an external process, use :w! to overwrite” (quoted in #6492). Automatic reload is an open request (#1125).[20] [21]Watches the open file, marks what changed in text, tab and tree, and compares the file's hash before it saves; it writes nothing if the file changed. A write in the same instant as that check can still slip through.

sim: the project's own spec (README.md, SPEC.md, sim/SPEC.md, sim/CONCEPT.md).

Invisible characters, measured

For each kind of character that draws nothing or acts on the terminal, this is what Neovim 0.12.5 and sim showed when a small file with it was opened in a terminal. Only Neovim was measured, so it is the only other editor in this table.

Measured on 2026-10-18: Neovim 0.12.5 (nvim --clean) and sim at commit d3caae2, which is in sim 0.2.0. Neovim 0.12.6, the latest release, was not measured.[22]

Kind of characterNeovim 0.12.5sim
U+200B zero-width space<200b><U+200B>
U+200D zero-width joiner between lettersraw<U+200D>
Trojan Source: U+202E, U+2066, U+2069<202e> <2066> <2069><U+202E> <U+2066> <U+2069>
tag characters (ASCII smuggling)raw<U+E0049> …
variation selectors behind a letter (U+FE00–FE03, U+E0155 and the like)raw<U+FE00> … <U+E0155> …
an ideographic variation selector behind a kanjiraw葛<U+E0100>
Hangul fillers U+3164, U+115F, U+FFA0raw<U+3164> <U+115F> <U+FFA0>
soft hyphen U+00AD and grapheme joiner U+034Fraw<U+00AD> <U+034F>
word joiner U+2060<2060><U+2060>
line separator U+2028raw<U+2028>
unassigned U+0378, noncharacter U+FDD0raw<U+0378> <U+FDD0>
noncharacter U+FFFF<ffff><U+FFFF>
U+FEFF in the middle of a file<feff><U+FEFF>
ESC and DEL^[ ^?^[ ^?
C1 control U+0085<85><U+0085>
private use (Nerd Font icons)as it isas it is
emoji with joiners and selectors, a keycap, the flag of Englandas it isas it is

Of the 15 kinds that sim shows, Neovim marked 7 and drew 8 raw.[23] [24] [25] [26]

“raw”: the terminal was sent the character itself and the editor marked nothing. “as it is”: left alone on purpose by both (the icons of a Nerd Font, emoji sequences). The other cells are what was drawn in the character's place.

The sim column is sim at commit d3caae2. The files, the commands and every row are written down in sim's NOTES.md at that commit.

sim showing a small Rust file. A hidden instruction in tag characters, a payload in variation selectors, bidirectional controls, a Hangul filler, a soft hyphen and a zero-width space are each drawn as a visible code such as <U+202E> on a magenta block.
sim, the same file: every hidden character is a visible <U+XXXX> on a magenta block.
Neovim 0.12.5 showing the same file. The tag characters, the variation selectors, the filler and the soft hyphen are not drawn at all; only the bidirectional controls and the zero-width space appear, as <202e> and <200b>.
Neovim 0.12.5, the same file: the payload line reads "a"; and the first line reads as a harmless comment, because the tag characters and selectors are not drawn. Only <202e>, <2066>, <2069> and <200b> are.

What sim's way costs, from the same measurement: a shown character takes the columns of its form (8 for a four-digit code, 9 for a five-digit one), so a line with many of them gets long; a kanji with an ideographic variation selector shows the selector; and the display cannot be turned off.

What the others still do better, for now

sim trades breadth for a fixed, checkable behavior. If you need any of these today, use the others.

  • Neovim and Helix ship a language-server client. sim has none yet; a sandboxed one is planned.[27] [28]
  • Vim and Neovim can be extended with packages and plugins. sim will not offer plugins.[1] [2]
  • Vim and Neovim record and replay macros. sim has no macros yet; they are planned. Registers and marks are in sim 0.2.0.[1]

How this was checked

Docs are pinned to the latest release tag. Issues and pull requests are cited with the state they had on the date above, and that state can change. Where a row says “in our test”, we opened a file with a real U+202E in the named release and looked at what it drew; the sources cannot say it for us. If something here is out of date or wrong, it should be corrected.

Sources

  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)