- Um editor estrutural baseado em múltiplos cursores que permite manipular diretamente a estrutura do código, funcionando em torno da árvore sintática (AST)
- Oferece interação no nível de nós de sintaxe, reduzindo a distância entre a intenção ao escrever código e a ação real de edição
- Com o recurso de múltiplos cursores, é possível modificar ou refatorar vários nós de sintaxe ao mesmo tempo, aumentando a eficiência em edições em massa
- Redefine a edição modal, permitindo mover-se de forma consistente entre diferentes unidades, como palavras, linhas e nós de sintaxe
- Reforça a precisão e a consistência na edição de código, propondo um novo paradigma de edição que aumenta a produtividade do desenvolvedor
Visão geral do Ki Editor
- O Ki Editor é um editor estrutural com múltiplos cursores (Multi-cursor structural editor) que oferece um ambiente de edição voltado a lidar diretamente com a estrutura sintática do código
- Diferentemente da edição tradicional baseada em texto, ele manipula elementos do código com base na árvore sintática (AST)
- Permite edição direta no nível de nós de sintaxe sem depender de mouse ou combinações de teclado
Interação com nós de sintaxe
- Por meio do recurso First-class syntax node interaction, lida diretamente com a estrutura sintática do código
- O foco está em reduzir a distância entre a intenção ao escrever código e a ação real de edição
- Executa manipulação em nível sintático sem movimento de mouse ou entradas complexas de teclado
Recurso de múltiplos cursores
- Com Multiple cursors, é possível editar vários nós de sintaxe simultaneamente
- A manipulação paralela de nós de sintaxe melhora a eficiência em edições em massa e refatoração
- Permite processar rapidamente tarefas repetitivas de modificação de código
Redefinição da edição modal
- Com o recurso Redefine modal editing, o modo de seleção é padronizado
- Dá suporte, de forma consistente, ao deslocamento entre diferentes unidades, como palavras, linhas e nós de sintaxe
- Reforça a flexibilidade e a consistência em relação à edição modal tradicional
Significado
- O Ki Editor oferece uma experiência de edição centrada na estrutura sintática, aumentando a precisão ao escrever e modificar código
- Ao combinar múltiplos cursores com manipulação de nós de sintaxe, apresenta uma nova abordagem de edição de código que contribui para o aumento da produtividade do desenvolvedor
1 comentários
Comentários do Hacker News
Ao ver o recurso de "seleção sintática de primeira classe", lembrei do atalho Expand / Shrink Selection que uso com frequência nas IDEs da JetBrains
Com
Ctrl + WeCtrl + Shift + W, dá para expandir ou reduzir a seleção por unidades sintáticasEsse recurso mudou completamente minha forma de pensar sobre como interagir com o "texto" de um arquivo
O VS Code e o Zed também têm algo parecido, mas a sensação é de que a expansão/redução é bruta demais
Link para a documentação da JetBrains
Com Cmd+Shift+V, abro a pilha da área de transferência para pesquisar ou escolher algo copiado anteriormente
Cmd+Shift+E mostra a lista de locais recentes, e Cmd+Shift+A abre a paleta de ações para fazer busca difusa em todos os comandos
Além disso, o recurso Local History permite rastrear o histórico de alterações de arquivos com muito mais granularidade do que o Git
Esses recursos levam naturalmente à ideia de poder editar direto no buffer de resultados de busca
incremental selectionbaseado em tree-sitterClique duplo selecionava uma palavra, clique triplo selecionava todos os argumentos da função, e quatro cliques selecionavam
f(a,r,g,s)inteiro — uma estrutura em que a unidade sintática cresce conforme o número de cliquesAté hoje essa memória muscular ficou comigo
Estou experimentando a ideia de fazer commit, diff e cherry-pick também funcionarem em unidades sintáticas, como o Ctrl+W
Há mais detalhes no projeto librdx
Edição com reconhecimento de AST lembra a praticidade das linguagens da família Lisp
Em Lisp, coisas que são possíveis com simples manipulação de listas exigem LSP ou um parser separado em JS
Quando passo o fim de semana usando Clojure e volto para TypeScript, sinto muita falta dos comandos do paredit
Já cheguei a criar um editor baseado em árvore sintática
Como ele manipulava apenas a árvore em vez de texto, não podia existir um programa sintaticamente incorreto
Mas o grande desafio era transformar isso em uma forma de entrada realmente utilizável
Hoje não consigo mais executá-lo por falta do hardware de display da época, mas deixei a descrição do projeto
Como resultado, às vezes é preciso seguir caminhos nada intuitivos, ou até reescrever tudo do zero
É até possível haver estruturas válidas para as quais simplesmente não existe caminho de construção
Em teoria é interessante, mas me pareceu um beco sem saída pouco prático
É difícil vencer a universalidade e simplicidade de uma interface baseada em texto
Editor dedicado, novo sistema de versionamento, ruptura de ecossistema e outras limitações reais pesam demais
Como as pessoas não pensam em termos de árvores, programar apenas em estados sempre sintaticamente corretos era uma experiência extremamente frustrante
No fim, são as ferramentas que permitem uma rigidez flexível (por exemplo, a tipagem gradual do TypeScript) que acabam sobrevivendo
Veja simh, mame, código do VT11 e a documentação
Ainda não é um editor de uso geral, mas a direção de expandir o escopo de seleção da árvore parece promissora
Link do Pantograph
Ele é construído sobre um sistema de parser que lida com árvores válidas, porém incompletas
Com uma representação de lacuna como
<//>, é possível tratar sintaxe incompleta com segurançaEx.:
2 + ·pode ser analisado como uma árvore<BinaryExpression>Se tiver interesse, estamos discutindo isso na comunidade do Discord
Não estou acostumado com edição de AST
Uso no máximo objetos de texto para lidar com argumentos de função ou arglists
Das funções de LSP, uso só ir para definição e renomear
No fim, isso me dá vontade de melhorar mais minhas habilidades no editor
Você escreve padrões com uma sintaxe quase igual à do código e consegue ver a transformação na sua frente
Por exemplo,
ast-grep -pattern '$A && $A.$B' --rewrite '$A?.$B' -lang tspermite fazer uma transformação para optional chainingMetavariáveis como
$X,$Aetc. forçam a correspondência do mesmo nóAgentes de programação com IA ainda não usam bem esse tipo de padrão, mas a ferramenta em si é muito sólida
Na maioria dos casos, basta selecionar por unidade sintática e então apagar, copiar ou substituir
Eu não faço grandes refatorações com frequência, então não sinto tanta necessidade de aprender isso
Mas para quem desenvolve serviços grandes, a opinião pode ser completamente diferente
Aprender a escrever macros em Elixir me trouxe muitos insights, e com Lisp é a mesma lógica
As abordagens variam de linguagem para linguagem, mas no fim todas apontam para o mesmo destino
A classificação de editores que eu faço é a seguinte
O Ki entra na terceira categoria, e eu acompanho esse tipo de projeto de perto
Os nós da UI parecem texto comum, mas na prática são uma estrutura em árvore
Se quiser dar feedback inicial, entre em contato pelo e-mail que está no meu perfil
A dificuldade da edição de AST é a descoberta (discoverability)
Está tudo visível na tela, mas muitas vezes você não sabe o nome daquele nó
Por isso estou pensando em um plugin que pinte com cores os escopos ao redor do cursor para visualizá-los
A ideia é pensar em termos de “ir para o próximo azul” em vez de “ir para a próxima função”
d mpara mostrar os rótulos de todos os nós sintáticos visíveis e ir direto até elesOperações como selecionar a parte interna ou externa do nó atual são úteis
Eu criei uma integração do Ki para VSCode
Depois não consegui contribuir tanto quanto queria, mas acho esse tipo de inovação em ferramentas fundamentais muito importante
Link da extensão Ki para VSCode
Antes de ver os exemplos, eu não tinha entendido tão bem,
mas em "modificação sintática de primeira classe" fiquei impressionado ao ver vírgulas sendo adicionadas e removidas automaticamente
A lógica de implementação até parece ser simples
Agora quero tentar fazer integração do Ki ou até rewrites baseados em AST no Zed
É só consultar o código no repositório do Ki
Pretendo testar em breve
Gosto da ideia de ser independente de layout de teclado
Também acho interessante a inspiração na filosofia do Emacs de que “tudo é um buffer editável”
Claro que cada editor tem seus próprios trade-offs, então só testando para saber
O Neovim é excelente, mas o modelo de edição tem limites
Se a estrutura fosse totalmente substituível, talvez Helix ou Ki nem fossem necessários
Quando executei com um teclado Dvorak, os mapeamentos quebraram completamente
Quando o software acha que é mais inteligente que o usuário, o resultado é que o usuário se sente impotente
Claro, no Emacs isso já existe
O pacote combobulate é um exemplo
Você pode apagar nós com M-k ou pesquisar/editar diretamente com consultas tree-sitter
A integração já é excelente, mas um editor dedicado a AST ainda teria espaço para evoluir bastante na UX
É um recurso que combina muito bem com o fluxo de trabalho do Helix
Dá a sensação de que a peça final do padrão clássico de movimento → ação finalmente se encaixou