sim и Vim, Neovim, Helix

Vim, Neovim и Helix — зрелые, мощные редакторы, а sim — новый. В этой таблице только то, что можно проверить по первоисточнику: собственной документации редакторов, записям CVE, заметкам о релизах и трекерам задач. Если источники молчат, таблица тоже молчит.

Проверено 2026-10-17. Последние на тот момент релизы: Vim 9.2.1202, Neovim 0.12.6, Helix 25.07.1.

ТемаVimNeovimHelixsim
Система расширенийVim script и пакеты.[1]Lua и плагины на Vim script.[2]В релизах системы плагинов нет. Система плагинов на Scheme (Steel) — открытый черновой pull request (#8675, обновлён 2026-10-09). Последний релиз — 25.07.1 (июль 2025).[3] [4]Нет, намеренно: плагины входят в список того, что он не делает.
Строки режима (modeline; настройки внутри файла)Включены по умолчанию (для root выключены). С патча 9.2.0350 (апрель 2026) из 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) открыт, а pull request (#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), находится в ветке разработки и пока не вошло ни в один релиз.[12] [13] [14] [3]Файлов конфигурации нет, как и конфигурации проекта, которую можно было бы загрузить.
Двунаправленные управляющие символы (U+202E и родственные)Показываются как <202e>: в руководстве сказано, что непечатаемые символы Unicode и символы нулевой ширины отображаются как <xxxx>, а для непечатаемых символов используется подсветка SpecialKey.[5]Показываются как <202e>, <2066> и так далее подсветкой SpecialKey (в нашем тесте — бирюзовой в цветовой схеме по умолчанию): U+200B–200F, U+202A–202E, U+2060–206F и U+FEFF есть в его таблице непечатаемых символов.[9] [15]В релизе 25.07.1 видимой отметки нет (в нашем тесте они занимают пустую ячейку). Символы нулевой ширины — открытая задача (#11255), а управляющие символы записываются в терминал как есть (#16320, открыта).[16] [17] [3]<U+202E> на пурпурном блоке в любом состоянии, никогда не отправляется как есть. Буквальный текст <U+202E> блока не получает.
Файл, изменённый другим процессомЗапоминает время изменения, режим и размер файла и предупреждает, если они отличаются (проверяется после команд оболочки, в 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) и sim на коммите d3caae2, который входит в 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)без измененийбез изменений
эмодзи с соединителями и селекторами, кейкап, флаг Англиибез измененийбез изменений

Из 15 видов, которые показывает sim, Neovim отметил 7, а 8 вывел как есть.[23] [24] [25] [26]

«как есть»: терминалу отправили сам символ, и редактор ничего не отметил. «без изменений»: оба оставляют символ намеренно (значки Nerd Font, последовательности эмодзи). Остальные ячейки — то, что нарисовано на месте символа.

Столбец sim — это sim на коммите d3caae2. Файлы, команды и каждая строка записаны в NOTES.md у sim на этом коммите.

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]

Как это проверялось

Документация привязана к тегу последнего релиза. Задачи и pull request приводятся в том состоянии, в каком они были на указанную выше дату, и это состояние может измениться. Там, где в строке сказано «в нашем тесте», мы открыли файл с настоящим 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)