sim editor · Rust · Linux e macOS

O Vim de nova geração. Ele mostra o que está oculto.

O sim é o Vim de nova geração: escrito do zero em Rust, mantém a edição modal e as teclas básicas do Vim.

Ele não lê modelines, não carrega plugins e não abre conexões de rede, e coloca na tela o que normalmente fica oculto: caracteres invisíveis, escritas feitas de fora do editor, repositórios que executariam código.

Sem plugins. Sem modelines. Sem rede.

Gratuito e de código aberto (MIT OR Apache-2.0). Instale via Homebrew; também dá para compilar do código-fonte. Notas de versão: v0.2.0

O sim exibindo notes/access.py. As linhas com uma substituição da direita para a esquerda e caracteres de isolamento os mostram como <U+202E> e <U+2066> sobre blocos magenta. Um espaço no fim da linha aparece como três pontos, e um espaço não separável como uma pequena caixa.
Um U+202E real e o texto literal <U+202E> na mesma linha: só o caractere real recebe o bloco magenta. Abaixo, uma linha no estilo do Trojan Source, um espaço no fim da linha (·) e um espaço não separável (⍽). A árvore mostra o status do git; a margem mostra as mudanças em relação ao HEAD.

Uma regra: mostrar o que está oculto

A maioria dos ataques via editor funciona porque o editor mostra um arquivo como algo que ele não é. A aparência do sim (depth, a névoa, os diffs em vermelho e verde, o selo de alerta magenta) existe para uma única função: tornar visível o que está oculto. A cor segue uma regra fixa, então uma cor sempre significa a mesma coisa.

O que cada cor significa

  • CinzaCinzas neutros e o peso do traço indicam a estrutura: texto, números, ícones, bordas.
  • AzulA única cor de destaque significa “aqui, aja”: o modo, a aba em que você está, uma ocorrência da busca, um link.
  • Verde, âmbar, vermelhoVerde, âmbar e vermelho significam mudança, e nada mais.
  • MagentaMagenta significa apenas o que está oculto ou é perigoso: um caractere que não é mostrado como ele é, o git que deixou de rodar por segurança.

O que o sim coloca na tela

Cinco coisas que arquivos e repositórios escondem. O sim mostra todas.

  • Caracteres invisíveis e bidirecionais são mostrados

    Uma substituição da direita para a esquerda ou um espaço de largura zero é desenhado como <U+202E> ou <U+200B> sobre um bloco magenta, em qualquer estado, e nunca é enviado cru ao terminal. O texto literal <U+202E> não recebe bloco, então dá para distinguir os dois.

    Saiba mais: Caracteres invisíveis e bidirecionais são mostrados

  • Espaços que parecem não ser nada são marcados

    Espaços no fim da linha aparecem como ·, um espaço não separável como ⍽ e uma tabulação como »: marcas que nenhum código usa, desenhadas sobre o texto e nunca parte dele.

    Saiba mais: Espaços que parecem não ser nada são marcados

  • Escritas externas são marcadas

    Quando outro processo reescreve o arquivo aberto, o sim marca o que mudou no texto, na aba e na árvore, e um salvamento não grava nada se o arquivo mudou desde que você o leu.

    Saiba mais: Escritas externas são marcadas

  • Mudanças em relação ao git HEAD num relance

    Sinais na margem, uma letra de status para cada arquivo da árvore e +n ~n -n na linha de status, tudo vindo do git, executado em segundo plano.

    Saiba mais: Mudanças em relação ao git HEAD num relance

  • A configuração própria de um repositório não pode fazer o git executar um comando

    A configuração própria de um repositório não pode fazer o git executar um comando: monitor, hooks e filtros são desligados, e onde a configuração ainda poderia executar um (core.sshCommand, um include) o git não é executado. A moldura diz qual é o caso, e a linha de status indica a chave e o arquivo.

    Saiba mais: A configuração própria de um repositório não pode fazer o git executar um comando

O sim em um terminal

O sim exibindo store.py depois de uma escrita externa. Duas linhas alteradas estão sobre fundo verde, a borda superior traz um selo verde, 2 changes on disk, e a aba mostra ↯.
Outro processo reescreveu o arquivo aberto. As linhas alteradas estão marcadas, a caixa diz “2 changes on disk” (2 mudanças no disco), a aba mostra ↯ e nada se perdeu no buffer.
Uma janela flutuante chamada Live grep sobre a árvore do projeto, listando as linhas encontradas agrupadas por arquivo, com uma prévia colorida pela sintaxe logo abaixo.
Ctrl-f busca no conteúdo de todos os arquivos enquanto você digita, com uma prévia da linha selecionada.
O sim mostrando README.md com títulos sobre faixas, um bloco de código cercado, uma tabela alinhada com barras, uma lista de tarefas e uma barra de citação; a primeira linha, onde está o cursor, mostra o # como foi digitado.
Um README na visualização de leitura: títulos, uma tabela alinhada pela largura de exibição, uma lista de tarefas e uma citação, desenhados como se leem. A linha em que o cursor está é o texto do próprio arquivo.
O sim em um repositório cuja configuração define core.sshCommand. A borda superior da caixa da árvore tem um selo magenta, git not run, e a linha de status diz: git skipped: core.sshcommand in .git/config could run a command.
Em um repositório cujo .git/config define core.sshCommand, o sim não executa o git: a caixa da árvore diz git not run, e a linha de status indica a chave e o arquivo.

Rápido. Medido, não só afirmado.

No benchmark do próprio projeto (build de release, um arquivo de 100.000 linhas, painel aberto, realce de sintaxe ligado), uma tecla leva menos de 1 ms no p99. Em um repositório com 100 mil arquivos, o primeiro quadro é desenhado antes de a lista de arquivos ser lida: de 1,8 a 8,7 ms medidos.

Medido pelo projeto em um AMD Ryzen 9 9950X (SPEED-1, SPEED-2 na especificação). A sua máquina terá resultados diferentes.

Frente a Vim, Neovim e Helix

Uma tabela com fontes: plugins, modelines, configuração de projeto, caracteres ocultos e escritas externas. Ela diz também onde os outros ainda fazem melhor.

Ler a comparação

Roadmap

Planejado, ainda não lançado. Nada aqui está disponível hoje.

  • Macros

    Planejado

  • Integração com a área de transferência

    Planejado

  • Servidores de linguagem, em sandbox

    Planejado

  • Uma GUI com profundidade de verdade

    Planejado

  • Mais formas de instalar

    Planejado

Todos os recursos planejados

Rode o Vim de nova geração

Instale via Homebrew; também dá para compilar do código-fonte. Os pacotes para AUR e crates.io chegam em breve.