ADRIANOLAUREANO← Artigos
SÉRIE OFICINA · 01/03EDITORUNICODE

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?

ARTIGO 30 · OFICINA 0.1 · TEXTO E EDIÇÃO

4modelos comparados

1piece table

undo e redo

OFICINA · DA TECLA À FERRAMENTA INTELIGENTE
main.pulsofunção soma(a, b) {
··retorne a + b
}
mostre(so▌)
OFICINA 0.1editar · entender · agir
FERRAMENTAS

Crivo: sem erros

soma(a, b)

Vigia disponível

VOCABULÁRIO VISUAL

As peças desta etapa da Oficina.

01Byteunidade física no UTF-8
02Graphemeo que percebemos como caractere
03Piece tabletexto original e inserções por intervalos
04Seleçãoâncora fixa e cursor móvel
05Viewportsomente as linhas visíveis
06Tokentrecho classificado pelo lexer
Uma IDE não adivinha: ela conserva versões, consulta modelos e transforma respostas em ações visíveis.
01
Editor, editor de código e IDE não são sinônimos.
Começaremos pela fundação
FerramentaResponsabilidade acrescentada
Editor de textoabre, altera e salva texto
Editor de códigorepresenta linhas, tokens e comandos
IDEcoordena 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.

02
Uma tecla não escreve diretamente na tela.
Evento, comando, documento, layout e pintura
tecla “ç” → InsertText("ç") → documento v18→v19
→ piece table insere 2 bytes UTF-8
→ layout invalida linha 42 → viewport repinta
A interface traduz eventos; somente o documento altera conteúdo.

Assim testamos edição sem Wayland. O comando conhece intenção; o modelo conhece bytes e intervalos; a pintura observa um snapshot.

03
Byte, caractere e posição visual são medidas diferentes.
Por que String não aceita um índice qualquer
A = 1 byte · ç = 2 bytes · 👨‍💻 = vários code points
linha 3, coluna visual 8 ≠ byte 8
Um grapheme pode reunir vários pontos Unicode; nunca o corte no meio.

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.

04
Editar o meio não deveria copiar o arquivo inteiro.
Buffer simples, gap buffer, rope e piece table
ModeloDecisão
Stringsimples, mas desloca o sufixo
Gap bufferrápido perto do gap
Ropeescala melhor, árvore mais complexa
Piece tableintervalos e histórico natural
ORIGINAL [função soma() { retorne 1 }]
ADD      [42]
PIECES   original[0..24] → add[0..2] → original[25..]
O original fica imutável; inserções moram num segundo buffer.

Escolhemos piece table. Cada peça registra origem, início e comprimento; remover ajusta descritores em vez de apagar o original.

05
Uma seleção são duas posições com papéis diferentes.
Âncora fixa, cursor móvel
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.

06
Undo guarda operações, não fotografias gigantes.
Intenção reversível e agrupamento
digitar “oficina” em 700 ms
└─ Insert { at: 120, text: "oficina" }
undo → Delete → REDO
redo → Insert → UNDO
Mover o cursor ou pausar encerra o grupo de digitação.
07
Cem mil linhas não exigem cem mil desenhos.
Viewport, gutter e invalidação
primeira = 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.

08
Colorir tokens ainda não é compreender código.
Destaque lexical incremental

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.

09
Salvar com segurança é uma pequena transação.
Versão de disco e substituição
abrir → guardar tamanho + mtime + hash
salvar → conferir versão → escrever temporário
→ flush + sync → rename atômico → atualizar versão
Se mudou fora da Oficina, mostramos conflito em vez de sobrescrever.

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.

Resposta do capítulo

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.

Baixar Oficina 0.1 (.zip)Linux + Wayland · Rust · fixtures isoladas

O que este artigo fez você pensar?

Dúvidas, experiências e contrapontos ajudam a próxima pessoa a enxergar o assunto por outro ângulo.

Todos passam por moderação. Ao enviar, você concorda com a política de privacidade.

Receba os próximos artigos.

Uma mensagem quando uma nova investigação estiver pronta. Só isso.