- Éditeur structurel à curseurs multiples permettant de manipuler directement la structure du code, avec un fonctionnement centré sur l’arbre syntaxique (AST)
- Prend en charge une interaction au niveau des nœuds syntaxiques, ce qui réduit l’écart entre l’intention d’écriture du code et l’action d’édition réelle
- Grâce à la fonction de curseurs multiples, il est possible de modifier ou refactoriser plusieurs nœuds syntaxiques en même temps, ce qui améliore l’efficacité des modifications à grande échelle
- Redéfinit l’édition modale afin de permettre des déplacements cohérents entre différentes unités, comme les mots, les lignes ou les nœuds syntaxiques
- Renforce la précision et la cohérence de l’édition de code, en proposant un nouveau paradigme d’édition qui améliore la productivité des développeurs
Présentation de Ki Editor
- Ki Editor est un éditeur structurel à curseurs multiples (Multi-cursor structural editor) qui propose un environnement d’édition manipulant directement la structure syntaxique du code
- Contrairement à l’édition textuelle traditionnelle, il manipule les éléments du code à partir de l’arbre syntaxique (AST)
- Il permet une édition directe au niveau des nœuds syntaxiques sans combinaison complexe de clavier ni recours à la souris
Interaction avec les nœuds syntaxiques
- La fonctionnalité First-class syntax node interaction permet de manipuler directement la structure syntaxique du code
- Elle vise à réduire l’écart entre l’intention d’écriture du code et l’action d’édition réelle
- Elle permet des manipulations au niveau syntaxique sans déplacement de souris ni saisies clavier complexes
Fonction de curseurs multiples
- Les multiple cursors permettent d’éditer simultanément plusieurs nœuds syntaxiques
- La manipulation parallèle de nœuds syntaxiques améliore l’efficacité des modifications massives et du refactoring
- Les tâches répétitives de modification de code peuvent ainsi être traitées rapidement
Redéfinition de l’édition modale
- La fonctionnalité Redefine modal editing standardise le mode de sélection
- Elle prend en charge de manière cohérente les déplacements entre différentes unités comme les mots, les lignes et les nœuds syntaxiques
- Elle renforce la souplesse et la cohérence par rapport à l’édition modale classique
Importance
- Ki Editor propose une expérience d’édition centrée sur la structure syntaxique, ce qui améliore la précision lors de l’écriture et de la modification du code
- En combinant curseurs multiples et manipulation de nœuds syntaxiques, il présente une nouvelle approche de l’édition de code qui contribue à améliorer la productivité des développeurs
1 commentaires
Avis sur Hacker News
En voyant la fonctionnalité « First-class syntactic selection », j’ai tout de suite pensé aux raccourcis Expand / Shrink Selection que j’utilise souvent dans les IDE JetBrains
Avec
Ctrl + WetCtrl + Shift + W, on peut étendre ou réduire la sélection par unité syntaxiqueCette fonctionnalité a complètement changé ma façon de voir l’interaction avec le « texte » d’un fichier
VS Code et Zed ont des fonctions similaires, mais j’ai l’impression que l’extension/réduction y est trop grossière
Lien vers la documentation JetBrains
Avec Cmd+Shift+V, on ouvre le presse-papiers en pile pour rechercher ou choisir parmi les éléments copiés auparavant
Cmd+Shift+E affiche la liste des emplacements récents, et Cmd+Shift+A ouvre la palette d’actions pour faire une recherche floue sur toutes les commandes
Il y a aussi la fonction Local History, qui permet de suivre l’historique des modifications d’un fichier bien plus finement que Git
Ce genre de fonctions mène naturellement à l’idée de pouvoir « modifier directement depuis le buffer de résultats de recherche »
incremental selectionbasé sur tree-sitterUn double-clic sélectionnait un mot, un triple-clic l’ensemble des arguments d’une fonction, et quatre clics sélectionnaient tout
f(a,r,g,s): la taille de l’unité syntaxique augmentait selon le nombre de clicsJ’en ai encore la mémoire musculaire
J’expérimente l’idée de faire fonctionner les commits, diff et cherry-pick par unités syntaxiques, comme avec Ctrl+W
C’est résumé dans le projet librdx
L’édition consciente de l’AST rappelle la commodité des langages de la famille Lisp
En Lisp, des choses faisables par simple manipulation de listes demandent en JS un LSP ou un parseur séparé
Quand je repasse à TypeScript après avoir utilisé Clojure le week-end, les commandes paredit me manquent vraiment
J’ai déjà fabriqué moi-même un éditeur basé sur un arbre syntaxique
Comme on manipule uniquement l’arbre au lieu de saisir du texte, un programme syntaxiquement invalide ne peut tout simplement pas exister
En revanche, le grand défi était d’en faire un mode de saisie réellement utilisable
Je ne peux plus l’exécuter aujourd’hui faute du matériel d’affichage de l’époque, mais j’ai conservé une description du projet
Cela impose parfois des chemins peu intuitifs, voire l’obligation de tout réécrire depuis le début
Il peut même exister des structures valides dont aucun chemin de génération n’existe
C’était intéressant en théorie, mais j’ai eu l’impression d’une impasse peu pratique
Il est difficile de battre l’universalité et la simplicité d’une interface textuelle
Entre l’éditeur dédié, un nouveau système de versioning, la rupture avec l’écosystème, etc., les contraintes concrètes sont trop nombreuses
Comme les humains ne pensent pas en unités arborescentes, devoir coder uniquement dans un état syntaxiquement correct en permanence était une expérience extrêmement frustrante
Au final, ce sont les outils qui autorisent une rigueur flexible (par ex. le typage progressif de TypeScript) qui survivent réellement
Voir simh, mame, code VT11, documentation
Ce n’est pas encore un éditeur généraliste, mais l’orientation autour de l’extension de plage de sélection d’arbre semble prometteuse
Lien vers Pantograph
Il est construit sur un système de parsing capable de manipuler des arbres valides mais incomplets
Grâce à une représentation des trous comme
<//>, on peut manipuler en toute sécurité une syntaxe incomplèteExemple :
2 + ·peut être parsé en arbre<BinaryExpression>Si ça vous intéresse, on en discute sur la communauté Discord
Je ne suis pas habitué à l’édition AST
J’utilise tout au plus des objets texte pour manipuler les arguments de fonction ou les arglists
Côté LSP, je me limite surtout à aller à la définition et au renommage
Au final, ça me motive surtout à améliorer davantage ma maîtrise de l’éditeur
On peut écrire des motifs avec une syntaxe très proche du code et voir les transformations directement sous les yeux
Par exemple, on peut faire une transformation vers l’optional chaining avec
ast-grep -pattern '$A && $A.$B' --rewrite '$A?.$B' -lang tsLes métavariables comme
$X,$A, etc. imposent une correspondance sur le même nœudLes agents de codage IA n’utilisent pas encore très bien ce genre de motifs, mais l’outil lui-même est très solide
Le plus souvent, il suffit de sélectionner un nœud syntaxique puis le supprimer, le copier ou le remplacer
Je ne fais pas souvent de gros refactorings, donc je ne ressens pas vraiment le besoin de l’apprendre
Mais un développeur travaillant sur un grand service pourrait avoir un avis totalement différent
Apprendre à écrire des macros en Elixir m’a apporté beaucoup d’intuitions, et Lisp va dans le même sens
Les approches diffèrent selon les langages, mais au fond elles mènent toutes vers la même destination
Voici comment je classe les éditeurs
Ki appartient à la troisième catégorie, et je garde toujours ce type de projet à l’œil
Les nœuds de l’UI ressemblent à du texte ordinaire, mais ce sont en réalité des structures arborescentes
Si vous voulez donner un premier avis, contactez-moi à l’adresse mail de mon profil
La difficulté de l’édition AST, c’est la discoverability
On voit les nœuds à l’écran, mais on ne connaît souvent pas leur nom
Je réfléchis donc à un plugin qui entourerait la zone autour du curseur avec des couleurs pour visualiser chaque portée (scope)
L’idée serait de penser en termes de « aller au prochain bleu » plutôt que « aller à la fonction suivante »
d mpour afficher les labels de tous les nœuds syntaxiques actuellement visibles et s’y déplacer directementDes opérations comme sélectionner l’intérieur ou l’extérieur du nœud courant sont utiles
J’ai créé une intégration Ki pour VSCode
Je regrette de ne pas avoir pu y contribuer davantage ensuite, mais je pense que ce genre d’innovation dans les outils fondamentaux est très important
Lien vers l’extension Ki pour VSCode
Avant de voir les exemples, je ne voyais pas trop l’intérêt,
mais dans la « First-class syntactic modification », le fait que les virgules soient ajoutées/supprimées automatiquement m’a impressionné
La logique d’implémentation me semble même plutôt simple
Maintenant, j’aimerais essayer une intégration Ki dans Zed ou des rewrites basés sur l’AST
Il suffit de se référer au code du dépôt Ki
Je vais probablement l’essayer moi-même bientôt
J’aime bien le fait que ce soit indépendant de la disposition du clavier
Je trouve aussi intéressant que cela s’inspire de la philosophie d’Emacs selon laquelle « tout est un buffer modifiable »
Bien sûr, chaque éditeur implique de gros trade-offs, donc il faut l’essayer pour se faire une idée
Neovim est excellent, mais son modèle d’édition a ses limites
S’il avait eu une architecture totalement remplaçable, Helix ou Ki n’auraient peut-être jamais été nécessaires
En le lançant avec un clavier Dvorak, toutes les correspondances étaient complètement cassées
Quand un logiciel croit être plus intelligent que son utilisateur, cela finit au contraire par lui donner un sentiment d’impuissance
Bien sûr, Emacs l’a déjà
Le paquet combobulate en est un exemple
On peut supprimer un nœud avec M-k ou rechercher/modifier directement avec des requêtes tree-sitter
L’intégration est déjà excellente, mais un éditeur dédié à l’AST pourrait encore faire progresser l’UX
C’est une fonctionnalité qui colle vraiment très bien au workflow de Helix
On a l’impression que la dernière pièce du schéma classique déplacement → action vient enfin de se mettre en place