sim face à Vim, Neovim et Helix

Vim, Neovim et Helix sont des éditeurs matures et capables, et sim est nouveau. Ce tableau ne couvre que ce qui peut être vérifié dans une source primaire : la documentation des éditeurs eux-mêmes, les entrées CVE, les notes de version et les gestionnaires d’issues. Là où les sources ne disent rien, le tableau ne dit rien non plus.

Vérifié le 2026-10-17. Dernières versions à cette date : Vim 9.2.1202, Neovim 0.12.6, Helix 25.07.1.

SujetVimNeovimHelixsim
Système d’extensionsVim script et paquets.[1]Lua, et plugins Vim script.[2]Aucun système de plugins dans une version publiée. Un système de plugins Scheme (Steel) est une pull request ouverte, à l’état de brouillon (#8675, mise à jour le 2026-10-09). La dernière version est la 25.07.1 (juillet 2025).[3] [4]Aucun, par conception : les plugins figurent dans sa liste de ce qu’il ne construit pas.
Modelines (réglages dans un fichier)Activées par défaut (désactivées pour root). Depuis le patch 9.2.0350 (avril 2026), seule une courte liste d’options peut être définie depuis une modeline ('modelinestrict', activée par défaut). CVE passés : CVE-2019-12735, CVE-2026-34982.[5] [6] [7] [8]Activées par défaut (désactivées pour root) ; 'modelineexpr' est désactivée. Le manuel recommande de désactiver les modelines avant d’éditer du texte non fiable. CVE-2019-12735 a été corrigé dans la 0.3.6.[9] [7]N’analyse pas les modelines : la demande (#729) est ouverte, et une pull request (#7788) a été fermée sans fusion.[10] [11]Jamais lues. Les réglages et les commandes ne viennent pas du contenu des fichiers.
Configuration locale au projet'exrc' est désactivée par défaut. Le manuel qualifie son activation de « a potential security leak » (une faille de sécurité potentielle) et dit « BETTER NOT SET THIS OPTION! » (mieux vaut ne pas activer cette option !).[5]'exrc' est désactivée par défaut. Lorsqu’elle est activée, .nvim.lua, .nvimrc et .exrc ne s’exécutent que si le fichier figure dans la liste de confiance (:trust).[9]Charge un .helix/config.toml depuis l’espace de travail (documenté pour la 25.07.1). La confiance dans l’espace de travail (workspace trust), qui demande avant d’agir (PR #15177, fusionnée en mars 2026), se trouve sur la branche de développement et dans aucune version pour l’instant.[12] [13] [14] [3]Aucun fichier de configuration, et aucune configuration locale au projet à charger.
Caractères de contrôle bidirectionnels (U+202E et compagnie)Affiché <202e> : le manuel dit que les caractères Unicode non imprimables et de largeur nulle sont affichés sous la forme <xxxx>, et que la coloration SpecialKey est utilisée pour les caractères non imprimables.[5]Affichés <202e>, <2066> et ainsi de suite, avec la coloration SpecialKey (cyan dans le jeu de couleurs par défaut, dans notre test) : U+200B–200F, U+202A–202E, U+2060–206F et U+FEFF figurent dans sa table des caractères non imprimables.[9] [15]Aucun marqueur visible dans la version 25.07.1 (ils occupent une cellule vide dans notre test). Les caractères de largeur nulle font l’objet d’une issue ouverte (#11255), et les caractères de contrôle sont écrits tels quels dans le terminal (#16320, ouverte).[16] [17] [3]<U+202E> sur un bloc magenta dans tous les états, jamais envoyé tel quel. Le texte littéral <U+202E> ne reçoit aucun bloc.
Fichier modifié par un autre processusMémorise l’horodatage, le mode et la taille du fichier et avertit quand ils diffèrent (vérifié après les commandes shell, dans l’interface graphique à la prise de focus, et par :checktime) ; 'autoread' recharge un tampon que vous n’avez pas modifié.[18]Mêmes vérifications et mêmes avertissements ; 'autoread' recharge un tampon que vous n’avez pas modifié.[19]Une écriture est refusée avec le message « file modified by an external process, use :w! to overwrite » (« fichier modifié par un processus externe, utilisez :w! pour écraser », cité dans #6492). Le rechargement automatique est une demande ouverte (#1125).[20] [21]Surveille le fichier ouvert, signale ce qui a changé dans le texte, l’onglet et l’arborescence, et compare l’empreinte du fichier avant d’enregistrer ; n’écrit rien si le fichier a changé. Une écriture au même instant que cette vérification peut encore passer.

sim : la spécification du projet lui-même (README.md, SPEC.md, sim/SPEC.md, sim/CONCEPT.md).

Caractères invisibles, mesurés

Pour chaque type de caractère qui ne dessine rien ou qui agit sur le terminal, voici ce que Neovim 0.12.5 et sim ont montré quand un petit fichier qui le contient a été ouvert dans un terminal. Seul Neovim a été mesuré : c’est donc le seul autre éditeur de ce tableau.

Mesuré le 2026-10-18 : Neovim 0.12.5 (nvim --clean) et sim au commit d3caae2, qui est dans sim 0.2.0. Neovim 0.12.6, la dernière version publiée, n’a pas été mesuré.[22]

Type de caractèreNeovim 0.12.5sim
U+200B espace de largeur nulle<200b><U+200B>
U+200D liant de largeur nulle entre des lettresbrut<U+200D>
Trojan Source : U+202E, U+2066, U+2069<202e> <2066> <2069><U+202E> <U+2066> <U+2069>
caractères de balise (ASCII smuggling)brut<U+E0049> …
sélecteurs de variante après une lettre (U+FE00–FE03, U+E0155 et semblables)brut<U+FE00> … <U+E0155> …
un sélecteur de variante idéographique après un kanjibrut葛<U+E0100>
remplisseurs hangul U+3164, U+115F, U+FFA0brut<U+3164> <U+115F> <U+FFA0>
trait d’union conditionnel U+00AD et liant de graphèmes U+034Fbrut<U+00AD> <U+034F>
liant de mots U+2060<2060><U+2060>
séparateur de ligne U+2028brut<U+2028>
non attribué U+0378, non-caractère U+FDD0brut<U+0378> <U+FDD0>
non-caractère U+FFFF<ffff><U+FFFF>
U+FEFF au milieu d’un fichier<feff><U+FEFF>
ESC et DEL^[ ^?^[ ^?
contrôle C1 U+0085<85><U+0085>
usage privé (icônes de Nerd Font)tel queltel quel
émojis avec liants et sélecteurs, une touche à cadre, le drapeau de l’Angleterretel queltel quel

Sur les 15 types que sim montre, Neovim en a marqué 7 et en a dessiné 8 bruts.[23] [24] [25] [26]

« brut » : le terminal a reçu le caractère lui-même et l’éditeur n’a rien marqué. « tel quel » : laissé volontairement par les deux (les icônes d’une Nerd Font, les séquences d’émojis). Les autres cellules sont ce qui a été dessiné à la place du caractère.

La colonne sim est sim au commit d3caae2. Les fichiers, les commandes et chaque ligne sont consignés dans le NOTES.md de sim à ce commit.

sim montrant un petit fichier Rust. Une instruction cachée dans des caractères de balise, une charge dans des sélecteurs de variante, des contrôles bidirectionnels, un remplisseur hangul, un trait d’union conditionnel et une espace de largeur nulle sont chacun dessinés comme un code visible tel que <U+202E> sur un bloc magenta.
sim, le même fichier : chaque caractère caché est un <U+XXXX> visible sur un bloc magenta.
Neovim 0.12.5 montrant le même fichier. Les caractères de balise, les sélecteurs de variante, le remplisseur et le trait d’union conditionnel ne sont pas dessinés du tout ; seuls les contrôles bidirectionnels et l’espace de largeur nulle apparaissent, comme <202e> et <200b>.
Neovim 0.12.5, le même fichier : la ligne de la charge se lit "a"; et la première ligne se lit comme un commentaire inoffensif, parce que les caractères de balise et les sélecteurs ne sont pas dessinés. Seuls <202e>, <2066>, <2069> et <200b> le sont.

Ce que coûte la méthode de sim, d’après la même mesure : un caractère montré occupe les colonnes de sa forme (8 pour un code de quatre chiffres, 9 pour un de cinq), donc une ligne qui en contient beaucoup s’allonge ; un kanji avec un sélecteur de variante idéographique montre le sélecteur ; et l’affichage ne peut pas être désactivé.

Ce que les autres font encore mieux, pour l’instant

sim échange l’étendue contre un comportement fixe et vérifiable. Si vous avez besoin de l’un de ces éléments dès aujourd’hui, utilisez les autres.

  • Neovim et Helix intègrent un client de serveur de langage. sim n’en a pas encore ; un client dans un bac à sable est prévu.[27] [28]
  • Vim et Neovim peuvent être étendus par des paquets et des plugins. sim n’offrira pas de plugins.[1] [2]
  • Vim et Neovim enregistrent et rejouent des macros. sim n’a pas encore de macros ; elles sont prévues. Les registres et les marques sont dans sim 0.2.0.[1]

Comment cela a été vérifié

La documentation est épinglée sur le tag de la dernière version. Les issues et les pull requests sont citées dans l’état où elles se trouvaient à la date ci-dessus, et cet état peut changer. Quand une ligne dit « dans notre test », nous avons ouvert un fichier contenant un véritable U+202E dans la version nommée et regardé ce qui était dessiné ; les sources ne peuvent pas le dire à notre place. Si un élément est périmé ou erroné, il doit être corrigé.

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)