O que o sim faz hoje

O que o sim faz hoje, agrupado pela finalidade. Cada recurso lista os IDs de requisitos da especificação do projeto que o sustentam. Os recursos planejados ficam apenas no Roadmap.

Mostra o que está oculto

A ideia central: um arquivo é mostrado como ele realmente é.

  • Caracteres invisíveis e bidirecionais são mostrados

    Uma substituição da direita para a esquerda, um espaço de largura zero ou um caractere de controle é desenhado como <U+202E>, <U+200B> ou ^[ sobre um bloco magenta, em qualquer estado em que uma célula possa estar: selecionada, encontrada por uma busca, na linha do cursor, dentro de uma mudança vinda de fora, na névoa de uma linha distante. Nenhum deles é enviado cru ao terminal. O texto literal <U+202E> em um arquivo não recebe bloco, então dá para distinguir os dois.

    Especificação: SAFE-8, UI-15

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

    Espaços no fim da linha são desenhados 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. Não há marca para o fim de uma linha, e - e % não são usados, porque são caracteres comuns de código.

    Especificação: UI-6

  • Escritas externas são marcadas

    O sim observa o arquivo aberto. Quando outro processo o reescreve (uma compilação, um formatador, uma ferramenta), as linhas alteradas são marcadas no texto, a caixa indica quantas mudanças estão no disco, a aba mostra ↯ e a árvore marca o arquivo. Um salvamento compara primeiro o hash do arquivo e não grava nada se ele mudou desde que você o leu. Uma escrita no mesmo instante exato dessa verificação ainda pode passar (veja Segurança).

    Especificação: DISK-1, DISK-2, DISK-6, SAFE-5, UI-4, MARK-1

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

    Sinais na margem para linhas adicionadas, alteradas e removidas, uma letra de status em cada arquivo da árvore (M, A, U, D, R) e, em uma pasta, a letra do status mais forte que há abaixo dela, a branch e +n ~n -n na linha de status. Tudo vem do git, executado em segundo plano e nunca no caminho de uma tecla.

    Especificação: UI-3, UI-5, UI-10

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

    Antes de executar o git, o sim pergunta ao git a configuração própria do repositório. O que uma linha de comando consegue impedir é desligado: um monitor do sistema de arquivos, hooks, filtros, um diff externo e uma conversão de texto não executam nada, e a árvore diz quantas configurações foram desligadas (2 git settings off). Se a configuração ainda puder executar um comando que nada impede (core.sshCommand, um include que poderia trazer um, e mais), o git não é executado: a árvore não mostra marcas do git e diz git not run, e a linha de status indica a chave e o arquivo. O git roda sem shell, sem bloqueios opcionais e sem como buscar nada.

    Especificação: MARK-1, GIT-1, GIT-2, GIT-3, GIT-5

  • Tudo o que não se desenha é mostrado

    Além da substituição da direita para a esquerda e do espaço de largura zero, o sim mostra os caracteres de etiqueta (o jeito de passar uma instrução escondida a um assistente de IA), os seletores de variação (o jeito de esconder código em extensões publicadas), os preenchimentos hangul, os hifens suaves, os separadores de linha e todo ponto de código não atribuído como <U+E0041>, em qualquer lugar onde desenha texto: o arquivo, a linha de status, as mensagens e os nomes na árvore e nas abas. Sequências de emoji, teclas com moldura, as bandeiras da Inglaterra, da Escócia e do País de Gales e os ícones da Nerd Font ficam como estão. Um kanji seguido de um seletor de variação ideográfica mostra o seletor.

    Especificação: SAFE-10, SAFE-11

  • O bloco de alerta marca mais do que caracteres

    O magenta significa que algo merece uma segunda olhada. Além dos caracteres ocultos, um link de Markdown cujo texto parece um endereço que o destino não é ([https://good.example](https://evil.example)) tem o destino desenhado sobre o bloco, e a árvore diz git not run sobre ele num repositório em que o git não foi executado por segurança.

    Especificação: UI-15, MD-10, GIT-5

Recusa o que deve recusar e preserva o seu texto

Nenhum texto se perde sem uma ação explícita, e os arquivos não conseguem reconfigurar o editor.

  • Sem modelines, sem arquivos de configuração, sem plugins

    Configurações e comandos nunca são lidos do conteúdo de um arquivo, então um arquivo não consegue reconfigurar o editor. Não há arquivo de configuração para carregar de um repositório, nem API de plugins, e o sim não abre conexões de rede. As únicas coisas que ele memoriza são a sua aparência, a sua escolha de ícones e a sua visualização de Markdown, uma palavra para cada.

    Especificação: SAFE-9

  • Salvamentos que não gravam pela metade

    Um salvamento grava um arquivo temporário ao lado do original (criado com modo 0600 e O_EXCL), executa fsync nele, o renomeia sobre o original e executa fsync no diretório, de modo que você vê o arquivo antigo ou o novo, nunca uma mistura. Um arquivo que pertence a outro usuário, que tem hard links ou que está em um diretório somente leitura é salvo no próprio lugar, depois de uma cópia de recuperação. O sim se recusa a gravar através de um link que pertença a outro usuário. Abrir e salvar sem editar produz uma saída idêntica byte a byte.

    Especificação: SAFE-1, SAFE-2, SAFE-3, SAFE-5

  • Nada se perde em uma falha

    As mudanças não salvas ganham um snapshot no máximo uma vez por segundo, em um diretório de estado privado (0700). Depois de uma falha, de um kill -9 ou de um terminal fechado, abrir o arquivo de novo oferece essas mudanças de volta como um único passo de desfazer. No máximo um segundo de trabalho é perdido.

    Especificação: SAFE-6

  • A busca nunca executa o que o repositório controla

    O sim encontra o ripgrep sozinho nas entradas absolutas do PATH e o executa com um ambiente vazio e --no-config, nunca com --pre, então um repositório não consegue fazer uma busca executar o código dele. Uma busca nunca grava nada e nunca segue um link simbólico para fora do projeto.

    Especificação: GREP-7, GREP-8

  • Arquivos que não são texto abrem somente para leitura

    Um arquivo que não é UTF-8 válido, ou que tem um NUL nos primeiros 8 KB, abre somente para leitura, com o motivo à mostra, e os bytes inválidos são desenhados como U+FFFD. Edições e gravações são recusadas, porque o texto na tela não seria o arquivo.

    Especificação: SAFE-4

  • Um salvamento em conflito mantém as duas versões

    Quando um salvamento encontra o arquivo alterado no disco, nada se perde de nenhum dos lados. :w! mantém a sua versão depois de copiar a versão do disco para o diretório de estado, e :e! adota a do disco depois de um snapshot da sua.

    Especificação:

  • --plain: sem processos externos

    sim --plain é só o núcleo, com a aparência calm, um só arquivo, nenhum painel e nenhum programa externo: sem git, sem ripgrep, sem filtro, sem hook. É o padrão como root e como o editor do sudoedit, e a linha de status mostra plain.

    Especificação:

Alcance e velocidade

O menor número de passos entre “aquele arquivo” e a leitura dele.

  • Uma árvore de projeto que nunca se mexe

    O sim abre com a árvore do diretório atual. Os diretórios vêm primeiro, depois os arquivos, cada grupo por nome, sempre na mesma ordem, e a expansão fica como você a deixou, então você encontra os arquivos pela posição em vez de ler. Os diretórios são lidos em segundo plano: as entradas aparecem conforme chegam, sem mover nada acima delas.

    Especificação: TREE-1, TREE-3, TREE-4, TREE-5

  • Encontre arquivos e texto em uma janela flutuante

    Ctrl-p encontra arquivos por correspondência aproximada no caminho, ordenados pela qualidade da correspondência e pela chance de você abrir cada um. Ctrl-f busca no conteúdo de todos os arquivos enquanto você digita (com o ripgrep, se ele estiver no PATH), com os resultados agrupados por arquivo e uma prévia da linha selecionada. Esc devolve tudo como estava.

    Especificação: FIND-2, FIND-4, GREP-1, GREP-5, PICK-1

  • Os arquivos prováveis são marcados onde estão

    O sim memoriza quais arquivos você abre e os ordena por recência e frequência combinadas. Os cinco mais prováveis são marcados com • na árvore. Uma tecla, ., restringe a árvore aos arquivos que mudaram, estão abertos ou foram abertos recentemente.

    Especificação: MARK-2, MARK-3

  • Vários arquivos, um editor completo para cada um

    Cada arquivo aberto tem o próprio desfazer, os próprios snapshots, o próprio observador e os próprios salvamentos. Uma barra de abas os mostra, com um ● em negrito para mudanças não salvas. Tab e Shift-Tab alternam entre eles.

    Especificação: BUF-1, BUF-2, UI-4

  • Rápido o bastante para você nem notar

    No benchmark do projeto (build de release, um arquivo de 100 mil linhas, painel aberto, realce de sintaxe ligado), uma tecla leva no máximo 1 ms no p99, em telas de 80×24 a 240×60. 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, para um requisito de 20 ms. Tudo o que é lento (percorrer uma árvore, consultar o git, analisar o código para o realce) roda em uma thread em segundo plano.

    Especificação: SPEED-1, SPEED-2

  • Um só binário: sim

    O binário separado si foi incorporado ao sim: um comando para instalar e um para executar. O núcleo é uma biblioteca, sim-editor-core, sobre a qual o sim é construído. sim --version e sim --help imprimem o resultado e saem sem tocar no terminal.

    Especificação:

  • Escolha uma aba por letra

    <Space>bp põe uma letra em cada aba, e a letra leva direto ao seu arquivo. <Space>bc faz o mesmo para fechar uma, e nunca fecha um arquivo modificado. Uma dica cita Tab e Shift-Tab na primeira vez que um segundo arquivo é aberto, até você usá-las três vezes.

    Especificação:

  • Uma árvore de mudanças em relação ao git HEAD

    <Space>ge mostra a árvore só com os arquivos que diferem de HEAD, preparados, não preparados e não rastreados, cada um com sua letra de status e +n −n, e cada pasta com as somas. Enter abre a versão de HEAD de um arquivo, somente leitura.

    Especificação: GIT-1, GIT-2, GIT-3, GIT-4, DIFF-1, DIFF-3, DIFF-4

Leitura confortável

Cores e layout calculados, não adivinhados.

  • Cores de sintaxe tiradas da sua própria paleta

    As cores vêm da paleta do seu terminal (lida com OSC 4). Elas mantêm o matiz, mas variam em luminosidade até o texto atingir |Lc| 75 em relação ao fundo. Palavras-chave são vermelhas, strings e números verdes, tipos amarelos, funções ciano e comentários cinza em itálico; azul e magenta nunca são usados em código. A linguagem vem do nome do arquivo, da extensão ou da primeira linha, usando o conjunto de sintaxes do bat. zh desliga as cores.

    Especificação: SYN-1, SYN-2, SYN-4

  • Uma visualização de leitura de Markdown

    Num arquivo Markdown, todas as linhas, exceto a do cursor, são desenhadas como se lê: os marcadores de ênfase e de código não são desenhados, as tabelas são alinhadas pela largura de exibição e os avisos (> [!NOTE]) mostram a palavra do seu tipo. Só esses marcadores são ocultados, nunca um #, um colchete, uma URL ou um caractere do texto, e <Space>um mostra o texto bruto.

    Especificação: UI-8, MD-1, MD-10, MD-11

  • Três aparências

    Calm é a mais sóbria: quatro estilos e um fundo cromático. Flat mostra um diff em verde e vermelho, com linhas tingidas. Depth, a padrão, acrescenta caixas, uma régua de visão geral e uma névoa que esmaece o texto conforme a distância até o cursor. zl alterna entre elas. Calm é a aparência para quem não distingue vermelho de verde.

    Especificação: LOOK-1, LOOK-2, LOOK-3

  • Legível por medição

    O texto tem |Lc| 90 e o texto secundário |Lc| 60 (APCA), calculados a partir do fundo do seu terminal. No calm, a única cor de mudança continua distinguível com visão de cores protan, deutan e tritan. Um matiz significa uma só coisa em toda a interface: cinza para a estrutura, azul para onde você age, verde, âmbar e vermelho para mudança, magenta apenas para o que está oculto ou é perigoso.

    Especificação: VIS-4, VIS-5, COLOR-1, UI-12

  • Um editor para morar dentro

    Ícones na árvore (é preciso uma Nerd Font; zi os desliga), uma barra de abas, uma trilha de navegação como título do editor (src › sim.rs › leader_key), uma linha de status com o modo, a branch, as mudanças em relação ao HEAD e a posição (a codificação e o fim de linha só aparecem quando não são UTF-8 ou LF), números de linha relativos, guias de indentação, uma barra de rolagem com marcas e um clarão rápido sobre o que você acabou de copiar com yank.

    Especificação: UI-2, UI-5, UI-6, UI-10, UI-11

  • Texto em japonês e em outros idiomas CJK

    Caracteres largos ocupam duas colunas, a prosa quebra linhas segundo as regras kinsoku do japonês, os movimentos por palavra dividem o texto CJK onde a escrita muda e, com um IME ativo, as teclas de largura total funcionam como comandos.

    Especificação: VIS-7, VI-10

  • Funciona sem cor, e nunca só pela cor

    NO_COLOR e terminais com menos de 8 cores desenham só com peso, sublinhado e vídeo inverso, e o sim não pede nenhuma cor ao terminal. O significado nunca depende só da cor: uma linha alterada é ┆ na coluna de sinais, as pastas mostram a letra do status do git mais forte e uma aba mostra ↯ para um arquivo alterado no disco. Com os ícones desligados, nenhum glifo de uso privado é desenhado.

    Especificação:

  • Os ícones começam ligados onde uma Nerd Font é provável

    Os ícones exigem uma Nerd Font, e um terminal não consegue dizer se tem uma. Eles começam ligados no Ghostty, no kitty e no WezTerm e desligados nos demais, com uma dica exibida uma única vez na linha de status: zi: icons (needs a Nerd Font). O que o zi escolheu por último sempre vale.

    Especificação:

  • O que se copia acende, em qualquer aparência

    O que você acabou de copiar com yank acende por 150 ms. O calm, a aparência sóbria, agora também acende: no cinza de uma seleção, ou sublinhado onde não há nenhuma. Uma linha que outro processo acabou de escrever no arquivo aberto acende por 400 ms.

    Especificação: UI-13, UI-19

Teclas

A gramática do vi, sem as esquisitices do vi.

  • As teclas do vi que suas mãos já conhecem

    Movimentos, operadores, objetos de texto, contadores, ., modo Visual, busca com smartcase, :s e intervalos, sem as esquisitices do vi: Y copia até o fim da linha, U refaz, Ctrl-s salva e q sai. Setas, Home, End e Delete funcionam em todo lugar.

    Especificação: VI-1, VI-2, VI-3, VI-4, VI-5, VI-6, VI-7

  • Os yanks chegam à área de transferência do sistema

    Todo yank sem nome de registrador também vai para a área de transferência do sistema por meio do OSC 52, inclusive dentro do tmux. Exclusões e alterações preenchem apenas o registrador, então x e dd nunca sobrescrevem o que você copiou.

    Especificação: VI-8

  • O mouse, sem surpresas

    Clique para abrir um arquivo ou posicionar o cursor, use a roda para rolar a tela, arraste para selecionar. O mouse nunca edita, salva nem cria snapshots por conta própria.

    Especificação: PTR-1, PTR-2

  • Space é a tecla líder, com uma janela which-key

    Uma pausa em um prefixo (Space, g, z, Z, [, ] ou um operador como d) abre uma pequena janela que lista as teclas que podem vir em seguida. Continuar digitando funciona exatamente como sem a janela.

    Especificação:

  • A busca diz onde você está

    Enquanto as ocorrências de uma busca estão destacadas, a linha de status diz em qual delas o cursor está e quantas existem: [3/12].

    Especificação:

  • Registradores do Vim

    "a a "z guardam texto e "A a "Z acrescentam a ele; "0 é o último yank, "1 a "9 as últimas exclusões e "_ aceita qualquer coisa e não guarda nada. :registers lista todos. Eles vivem só na memória e todos os arquivos abertos os compartilham. Um yank sem nome continua indo para a área de transferência do sistema por meio do OSC 52; uma exclusão, não.

    Especificação: VI-15

  • Marcas

    ma a mz põem uma marca no arquivo; 'a vai para a linha dela e a tecla de crase (acento grave) para o lugar exato, também com um operador (d'a). '' volta para onde o cursor estava antes do último salto. Uma marca acompanha o seu texto por edições, desfazer e mudanças vindas de fora, e :marks lista todas. As marcas vivem só na memória.

    Especificação: VI-17

  • :tutor

    Cerca de quinze minutos de lições curtas em um buffer temporário, no idioma da sua localidade (English, 日本語, 简体中文, 繁體中文, 한국어, Español, Português, Français, Deutsch ou Русский; English para qualquer outra). Os exercícios se marcam sozinhos com ✗ e ✓ enquanto você digita.

    Especificação: TUTOR-1, TUTOR-2, TUTOR-3, TUTOR-4

Roadmap

Planejado, ainda não lançado. Nada desta lista está disponível ainda, e a ordem não é uma promessa.

  • Macros

    Planejado

    Gravar e reproduzir teclas. Hoje o sim não tem nenhuma.

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

    Planejado

    Mais do que o yank de hoje por meio do OSC 52.

  • Servidores de linguagem, em sandbox

    Planejado

    Um cliente de servidor de linguagem cujo servidor roda em um sandbox e, na linha de status, um indicador de se a raiz do projeto é confiável.

  • Uma GUI com profundidade de verdade

    Planejado

    Uma interface gráfica com sombras e elevação reais. Ela começou como protótipo; não há nada para instalar.

  • Mais formas de instalar

    Planejado

    Os pacotes para AUR e crates.io chegam em breve.