O que existe por trás de um editor de código? Da tecla ao texto na tela
Você pressiona uma tecla no meio de um arquivo grande. Em poucos milissegundos, texto, cursor, cores, linhas e histórico mudam. Que máquina existe entre o teclado e esse novo pixel?
função soma(a, b) {
··retorne a + b
}
mostre(so▌)✓ Crivo: sem erros
→ soma(a, b)
● Vigia disponível
VOCABULÁRIO VISUAL
As peças desta etapa da Oficina.
| Ferramenta | Responsabilidade acrescentada |
|---|---|
| Editor de texto | abre, altera e salva texto |
| Editor de código | representa linhas, tokens e comandos |
| IDE | coordena linguagem, projeto, build e depuração |
A Janela UI já nos deu superfície, eventos, foco, layout e pintura. A Oficina reaproveita essa base; aqui construímos o modelo que uma caixa de texto comum não entrega.
tecla “ç” → InsertText("ç") → documento v18→v19
→ piece table insere 2 bytes UTF-8
→ layout invalida linha 42 → viewport repintaAssim testamos edição sem Wayland. O comando conhece intenção; o modelo conhece bytes e intervalos; a pintura observa um snapshot.
A = 1 byte · ç = 2 bytes · 👨💻 = vários code points linha 3, coluna visual 8 ≠ byte 8
A Oficina conserva offsets em bytes, como o parser da Pulso. A movimentação usa limites de grapheme e uma tabela de linhas converte byte em linha e coluna.
| Modelo | Decisão |
|---|---|
| String | simples, mas desloca o sufixo |
| Gap buffer | rápido perto do gap |
| Rope | escala melhor, árvore mais complexa |
| Piece table | intervalos e histórico natural |
ORIGINAL [função soma() { retorne 1 }]
ADD [42]
PIECES original[0..24] → add[0..2] → original[25..]Escolhemos piece table. Cada peça registra origem, início e comprimento; remover ajusta descritores em vez de apagar o original.
struct Selection {
anchor: ByteOffset,
active: ByteOffset,
}Setas atravessam graphemes; Shift preserva a âncora. Inserir sobre uma seleção remove o intervalo primeiro. Copiar, colar, quebra de linha e remoção são comandos testáveis.
digitar “oficina” em 700 ms
└─ Insert { at: 120, text: "oficina" }
undo → Delete → REDO
redo → Insert → UNDOprimeira = floor(scroll_y / altura_linha)
última = ceil((scroll_y + altura_viewport) / altura_linha)Renderizamos apenas linhas visíveis e pequena margem. Gutter, seleção e cursor são camadas; uma edição invalida somente a região afetada.
Reutilizamos o lexer da Pulso. Depois de editar, o lexer volta a uma linha de estado conhecido e avança até o estado convergir. A cor classifica formas; não prova significado ou validade.
abrir → guardar tamanho + mtime + hash salvar → conferir versão → escrever temporário → flush + sync → rename atômico → atualizar versão
Testes cobrem Unicode, edições, seleção multilinha, undo/redo e falha antes do rename. A Oficina 0.1 edita, destaca e salva Pulso de modo verificável.
Entre tecla e pixel há uma cadeia de intenções e representações. O editor permanece correto porque nunca confunde posição visual com endereço de byte.
PROJETO COMPLETO · ESTADO EXATO DESTE CAPÍTULO
Baixe a Oficina 0.1.
Pacote exclusivo com código Rust, fixtures Pulso, testes e limites documentados. Nenhum arquivo externo é aberto ou executado automaticamente.