sim vs Vim, Neovim e Helix

Vim, Neovim e Helix são editores maduros e capazes, e o sim é novo. Esta tabela cobre apenas o que pode ser conferido em uma fonte primária: a documentação dos próprios editores, registros de CVE, notas de versão e rastreadores de issues. Onde as fontes não dizem nada, a tabela também não diz.

Verificado em 2026-10-17. Últimas versões na época: Vim 9.2.1202, Neovim 0.12.6, Helix 25.07.1.

TópicoVimNeovimHelixsim
Sistema de extensõesVim script e pacotes.[1]Lua e plugins em Vim script.[2]Nenhum sistema de plugins em uma versão lançada. Um sistema de plugins em Scheme (Steel) é um pull request em rascunho ainda aberto (#8675, atualizado em 2026-10-09). A versão mais recente é a 25.07.1 (julho de 2025).[3] [4]Nenhum, por decisão de projeto: plugins estão na lista do que ele não constrói.
Modelines (configurações dentro de um arquivo)Ativadas por padrão (desativadas para root). Desde o patch 9.2.0350 (abril de 2026), apenas uma lista curta de opções pode ser definida por uma modeline ('modelinestrict', ativada por padrão). CVEs anteriores: CVE-2019-12735, CVE-2026-34982.[5] [6] [7] [8]Ativadas por padrão (desativadas para root); 'modelineexpr' está desativada. O manual diz para desativar as modelines antes de editar texto não confiável. O CVE-2019-12735 foi corrigido na 0.3.6.[9] [7]Não interpreta modelines: o pedido (#729) está aberto, e um pull request (#7788) foi fechado sem merge.[10] [11]Nunca lidas. Configurações e comandos não vêm do conteúdo dos arquivos.
Configuração local do projeto'exrc' vem desativada por padrão. O manual chama ativá-la de “a potential security leak” (uma possível brecha de segurança) e diz “BETTER NOT SET THIS OPTION!” (é melhor não definir esta opção!).[5]'exrc' vem desativada por padrão. Quando ativada, .nvim.lua, .nvimrc e .exrc só são executados se o arquivo estiver na lista de confiança (:trust).[9]Carrega um .helix/config.toml do workspace (documentado na 25.07.1). O recurso de confiança no workspace, que pergunta antes (PR #15177, mesclado em março de 2026), está na branch de desenvolvimento e ainda não está em nenhuma versão.[12] [13] [14] [3]Sem arquivos de configuração e sem configuração local de projeto para carregar.
Caracteres de controle bidirecionais (U+202E e companhia)Mostrado como <202e>: o manual diz que caracteres Unicode não imprimíveis e de largura zero são exibidos como <xxxx>, e que o destaque SpecialKey é usado para caracteres não imprimíveis.[5]Mostrados como <202e>, <2066> e assim por diante, no destaque SpecialKey (ciano no esquema de cores padrão, no nosso teste): U+200B–200F, U+202A–202E, U+2060–206F e U+FEFF estão na tabela de caracteres não imprimíveis dele.[9] [15]Nenhum marcador visível na versão 25.07.1 (eles ocupam uma célula em branco no nosso teste). Os caracteres de largura zero são uma issue aberta (#11255), e os caracteres de controle são gravados crus no terminal (#16320, aberta).[16] [17] [3]<U+202E> sobre um bloco magenta em qualquer estado, nunca enviado cru. O texto literal <U+202E> não recebe bloco.
Arquivo alterado por outro processoMemoriza o carimbo de data e hora, o modo e o tamanho do arquivo e avisa quando eles mudam (verificado depois de comandos de shell, na GUI ao receber o foco e por :checktime); 'autoread' recarrega um buffer que você não alterou.[18]As mesmas verificações e avisos; 'autoread' recarrega um buffer que você não alterou.[19]Uma gravação é recusada com a mensagem “file modified by an external process, use :w! to overwrite” (“arquivo modificado por um processo externo, use :w! para sobrescrever”; citada em #6492). O recarregamento automático é um pedido aberto (#1125).[20] [21]Observa o arquivo aberto, marca o que mudou no texto, na aba e na árvore, e compara o hash do arquivo antes de salvar; não grava nada se o arquivo mudou. Uma escrita no mesmo instante dessa verificação ainda pode passar.

sim: a especificação do próprio projeto (README.md, SPEC.md, sim/SPEC.md, sim/CONCEPT.md).

Caracteres invisíveis, medidos

Para cada tipo de caractere que não desenha nada ou que age sobre o terminal, isto é o que o Neovim 0.12.5 e o sim mostraram ao abrir num terminal um arquivo pequeno com ele. Só o Neovim foi medido, então ele é o único outro editor desta tabela.

Medido em 2026-10-18: Neovim 0.12.5 (nvim --clean) e sim no commit d3caae2, que está no sim 0.2.0. O Neovim 0.12.6, a última versão lançada, não foi medido.[22]

Tipo de caractereNeovim 0.12.5sim
U+200B espaço de largura zero<200b><U+200B>
U+200D união de largura zero entre letrascru<U+200D>
Trojan Source: U+202E, U+2066, U+2069<202e> <2066> <2069><U+202E> <U+2066> <U+2069>
caracteres de etiqueta (ASCII smuggling)cru<U+E0049> …
seletores de variação depois de uma letra (U+FE00–FE03, U+E0155 e semelhantes)cru<U+FE00> … <U+E0155> …
um seletor de variação ideográfica depois de um kanjicru葛<U+E0100>
preenchimentos hangul U+3164, U+115F, U+FFA0cru<U+3164> <U+115F> <U+FFA0>
hífen suave U+00AD e unidor de grafemas U+034Fcru<U+00AD> <U+034F>
unidor de palavras U+2060<2060><U+2060>
separador de linha U+2028cru<U+2028>
não atribuído U+0378, não caractere U+FDD0cru<U+0378> <U+FDD0>
não caractere U+FFFF<ffff><U+FFFF>
U+FEFF no meio de um arquivo<feff><U+FEFF>
ESC e DEL^[ ^?^[ ^?
controle C1 U+0085<85><U+0085>
uso privado (ícones da Nerd Font)como estácomo está
emoji com uniões e seletores, uma tecla com moldura, a bandeira da Inglaterracomo estácomo está

Dos 15 tipos que o sim mostra, o Neovim marcou 7 e desenhou 8 crus.[23] [24] [25] [26]

“cru”: o terminal recebeu o próprio caractere e o editor não marcou nada. “como está”: ambos deixam assim de propósito (os ícones de uma Nerd Font, as sequências de emoji). As demais células são o que foi desenhado no lugar do caractere.

A coluna do sim é o sim no commit d3caae2. Os arquivos, os comandos e cada linha estão anotados no NOTES.md do sim nesse commit.

O sim mostrando um pequeno arquivo Rust. Uma instrução escondida em caracteres de etiqueta, uma carga em seletores de variação, controles bidirecionais, um preenchimento hangul, um hífen suave e um espaço de largura zero são desenhados cada um como um código visível como <U+202E> sobre um bloco magenta.
sim, o mesmo arquivo: cada caractere oculto é um <U+XXXX> visível sobre um bloco magenta.
O Neovim 0.12.5 mostrando o mesmo arquivo. Os caracteres de etiqueta, os seletores de variação, o preenchimento e o hífen suave não são desenhados de modo algum; só os controles bidirecionais e o espaço de largura zero aparecem, como <202e> e <200b>.
Neovim 0.12.5, o mesmo arquivo: a linha da carga se lê "a"; e a primeira linha se lê como um comentário inofensivo, porque os caracteres de etiqueta e os seletores não são desenhados. Só <202e>, <2066>, <2069> e <200b> são.

O que o jeito do sim custa, segundo a mesma medição: um caractere mostrado ocupa as colunas da sua forma (8 para um código de quatro dígitos, 9 para um de cinco), então uma linha com muitos fica longa; um kanji com um seletor de variação ideográfica mostra o seletor; e a exibição não pode ser desligada.

O que os outros ainda fazem melhor, por enquanto

O sim troca amplitude por um comportamento fixo e verificável. Se você precisa de qualquer um destes recursos hoje, use os outros.

  • Neovim e Helix incluem um cliente de servidor de linguagem. O sim ainda não tem; um cliente em sandbox está planejado.[27] [28]
  • Vim e Neovim podem ser estendidos com pacotes e plugins. O sim não oferecerá plugins.[1] [2]
  • Vim e Neovim gravam e reproduzem macros. O sim ainda não tem macros; elas estão planejadas. Registradores e marcas estão no sim 0.2.0.[1]

Como isto foi verificado

A documentação é fixada na tag da versão mais recente. Issues e pull requests são citados com o estado que tinham na data acima, e esse estado pode mudar. Quando uma linha diz “no nosso teste”, abrimos um arquivo com um U+202E de verdade na versão indicada e olhamos o que foi desenhado; as fontes não conseguem dizer isso por nós. Se algo aqui estiver desatualizado ou errado, deve ser corrigido.

Fontes

  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)