- Avec la rechute des RSI et la nécessité de changer à nouveau de méthode de saisie pour coder, l’extension VS Code Cursorless est devenue l’outil central de l’édition de code par la voix
- Cursorless ajoute aux tokens du code des hats fondés sur des couleurs et des lettres, afin que l’utilisateur puisse désigner oralement une position à l’écran et effectuer des actions comme supprimer, déplacer ou insérer
- Plus puissant qu’un simple déplacement de curseur, l’outil combine des désignations de chemin comme
green urge past green batavec la compréhension de l’AST du langage pour manipuler des unités structurelles comme des fonctions, des lambdas ou le corps d’une définition - En écrivant directement des commandes Talon, il devient possible d’automatiser avec des commandes vocales plus courtes des insertions comme
async <destination>ou des saisies longues comme une déclaration de méthode Go - Le codage vocal ne supprime pas les mots qu’il faut prononcer, mais il permet de construire un système de commandes plus proche de la manière dont on comprend le code mentalement
Contexte : rechute des RSI et adoption de Cursorless
- Au moment de commencer un nouveau poste, les RSI ont rechuté, et il a fallu retrouver un moyen de programmer plutôt que de compter, comme auparavant, sur l’écriture technique
- Bien que l’auteur soit utilisateur d’Emacs, il utilise cette fois Visual Studio Code à cause d’une extension en particulier
- Cette extension est Cursorless, qui, combinée à un logiciel de contrôle vocal, permet une édition de code au niveau de l’AST
- Auparavant, Cursorless servait surtout à se déplacer à l’écran, mais l’objectif est cette fois de l’appliquer plus profondément à l’ensemble des tâches possibles
- Il y a aussi l’envie de disposer de ce mode de saisie dans les messages Slack et Discord
Dire une position avec les hats, les targets et les destinations
- Les unités de base de Cursorless sont les targets et les destinations
- Une target désigne une ancre individuelle dans le document
- Une destination correspond à une position relative par rapport à une target donnée
- Les tokens du document reçoivent des hats composés de couleurs et de lettres
- La position du hat détermine son nom
- La couleur du hat sert à lever les ambiguïtés
- Dans l’exemple de code JavaScript, s’il y a un hat vert au-dessus du
udu motfunction, on peut appeler ce motgreen urge - Il est ensuite possible de donner une commande pour supprimer ce mot ou le déplacer ailleurs
- À lui seul, ce mécanisme permet déjà une manipulation vocale proche des motions de Vim
Une édition structurelle rendue possible par la compréhension de l’AST
- La force de Cursorless ne se limite pas à la simple désignation de position : elle vient de l’usage combiné des chemins (paths) et de la compréhension de l’AST du langage
- Une expression comme
green urge past green batpermet de sélectionner la plagefunction fetchBlogvisible à l’écran - Comme l’outil comprend la structure AST du langage, il peut aussi supprimer une fonction entière ou la déplacer ailleurs
- La commande
visualize lambdasvisualise les lambdas à l’intérieur d’une fonction comme des unités structurelles distinctes - Comme les unités AST peuvent elles aussi devenir des targets, on peut sélectionner le corps d’une définition puis poursuivre un refactoring dans cette portée
- Dans l’exemple, cela simplifie le refactoring qui transforme une fonction en fonction asynchrone
Étendre le codage vocal avec les commandes Talon
- En utilisant Cursorless avec Talon, on peut écrire soi-même des commandes vocales
- L’exemple
async <user.cursorless_destination>est une commande qui insère"async"avant la destination désignée
[state] async <user.cursorless_destination>:
user.cursorless_insert(cursorless_destination, "async")
- Une commande Talon se divise globalement en deux parties
- le pattern : les mots prononcés par l’utilisateur
- la capture : l’élément extrait de ce qui a été dit
- Dans cet exemple, le pattern est
async, et la capture est la destination où insérerasync - La capture spéciale
<user.cursorless_destination>permet de désigner l’avant ou l’arrière d’une target - Des commandes plus complexes sont aussi possibles, et l’article donne en exemple une règle Talon qui génère une déclaration de méthode Go
(method|meth) <user.letter> [<user.go_pointer>] [<user.go_visibility>] <user.text> [over] [<user.go_visibility>] named <user.text> [over]:
user.go_method(go_pointer or "", letter, go_visibility_1 or "public", text_1, go_visibility_2 or "public", text_2)
Expérimentations autour des déclarations de méthodes Go et de l’expression des pointeurs
- En Go, une méthode prend la forme suivante
func (reciever *Type) MethodName() {
// function body here or something
}
- Le texte précise qu’en Go, il ne s’agit pas de méthodes au sens traditionnel, mais de fonctions qui reçoivent un receiver rattaché à un struct donné comme espace de noms
- Sans automatisation, saisir ce code à la voix obligerait à prononcer une longue suite de commandes
state funk args word reciever space star hammer type over go right space hammer method name args go right brack enter
- Avec une règle Talon, on peut le dire de manière plus courte
meth r raised type named method name over
- Il reste encore beaucoup de mots à prononcer, mais la saisie devient plus efficace et plus proche de la façon dont les concepts sont structurés mentalement
raisedest une expérimentation visant à exprimer autrement la notion de pointeur en Go- La syntaxe des pointeurs en Go est de style C, et l’interprétation proposée est que
*sert à abaisser une valeur pointeur vers une valeur ordinaire, tandis que&sert à élever une valeur ordinaire vers une valeur pointeur - En redessinant les bindings Talon pour Go, l’auteur expérimente une compréhension unifiée des valeurs pointeur à travers les notions de raising/lowering, pour voir si cela les rend plus intuitives
- La syntaxe des pointeurs en Go est de style C, et l’interprétation proposée est que
- L’auteur participe à la bêta de GitHub Copilot Voice beta et souhaite la comparer au codage vocal basé sur Talon
1 commentaires
Commentaires sur Hacker News
C’est l’auteur du billet, et je ne m’attendais pas à une réaction aussi positive ici
Si ça vous intéresse, j’ai mis ici mon dépôt de configuration Talon en cours d’expérimentation : https://github.com/Xe/invocations
Un jour, travailler de cette façon sera peut-être non seulement moins douloureux que le clavier, sans être strictement nécessaire, et je suis content de savoir qu’il existe une option pratique
Chaque fois que je vois ce type de configuration, je me rends compte que ma neurodiversité est assez différente de celle des autres. La quantité de contexte et d’abstractions qu’il faut garder en tête pour comprendre l’écran et s’y déplacer est énorme, et ça semble n’être possible qu’après des décennies de familiarité avec un langage et un IDE/CLI
La partie « avec le temps, ça devient une seconde nature comme les commandes Vim » donne vraiment l’impression qu’il faut l’apprendre ainsi. J’utilise des ordinateurs depuis 30 ans, mais ce niveau de maîtrise du code reste à la fois déroutant et impressionnant pour moi
J’aimerais savoir si tu l’as trouvée médiocre, ou si la solution côté VS Code te paraissait simplement bien meilleure
Cursorless ne m’intéresse pas particulièrement, parce que je n’utilise pas VSCode et que les objets texte de Vim/Evil sont tout aussi puissants tout en étant visuellement moins bruyants. Tout ce concept me paraît extrêmement prometteur
On dirait une façon d’utiliser le tree-sitter AST pour effectuer des opérations sur des « parties » du buffer
Donc quelque chose de très proche des objets texte de Vim/Evil, mais avec une dimension vocale en plus
Si on y ajoute une fonctionnalité du genre « enregistrer puis exécuter », ça semble offrir beaucoup de possibilités. Pendant qu’on fait l’opération X au clavier, si l’action Y à faire ensuite est visible à l’écran et simple, on pourrait prononcer la commande Y puis appuyer sur un bouton après la fin de X pour exécuter la commande vocale. C’est bien mieux que d’alterner entre taper et parler
Taper et parler mobilisent des zones cognitives différentes, et l’écriture logicielle, une fois la syntaxe comprise, n’est pas si linguistique que ça. Si on pouvait taper et parler en même temps, il serait sans doute plus facile d’entrer dans un état de flow, et ça ressemble à une version renforcée du rubber duck debugging. On pourrait aussi s’en servir pour prendre des notes
J’imagine bien qu’un paquet Emacs finira par sortir
Mais il lui faudra probablement du temps pour rattraper ce domaine. Le moteur d’affichage ne sait pas gérer les annotations à la Cursorless, et l’intégration de tree-sitter n’est pas encore assez mature. Je l’ai essayé moi-même
Cela dit, ce serait bien d’avoir une version native pour Emacs
Ce n’est pas Cursorless lui-même, mais voici une excellente présentation avec démonstration sur la programmation à la voix : https://youtu.be/GM_siEPD4Ws?si=99ZhC1P4irOyu1pH
C’est très agréable à regarder, et l’intervenant traite aussi très bien des problèmes communs actuels dans ce domaine
J’essaie encore de comprendre exactement comment ça fonctionne
Ça ressemble à avy utilisé à la voix à la place du clavier, avec en plus des commandes conscientes de l’AST : https://karthinks.com/software/avy-can-do-anything/
Ensuite, j’ai voulu faire en sorte que les overlays restent toujours visibles, mais je me suis retrouvé bloqué quelque part
La présentation Strange Loop de l’auteur de Cursorless : https://www.youtube.com/watch?v=NcUJnmBqHTY
Je me demande pourquoi utiliser « urge » et « bat »
On ne peut pas simplement prendre n’importe quel mot commençant par les bonnes lettres ?
Plus de détails ici : https://whalequench.club/blog/2019/09/03/learning-to-speak-c...
Quand on a déjà fait du codage vocal 6 à 8 heures par jour, on en vient à apprécier chacune de ces micro-optimisations
Avec les technologies de suivi du regard actuelles, ne suffirait-il pas de placer le curseur à l’endroit regardé pendant plus de 2 secondes ?
Ça me rappelle les études sur les points de fixation du regard en conduite ou devant une œuvre d’art
En codant, on s’arrête très souvent de cette manière
Il faudrait un dispositif de suivi du regard extrêmement réactif et précis, capable de détecter au moins 3 à 5 boutons : clic, appui, relâchement, déplacement à droite, déplacement à gauche
Ce style d’écriture rappelle beaucoup les dialogues entre la Tortue et Achille dans Gödel, Escher, Bach
J’ai 52 ans et je tape tous les jours dans des métiers techniques depuis 1995. Vers 2000, j’ai souffert de troubles musculosquelettiques liés aux gestes répétitifs et j’ai essayé des accessoires ergonomiques comme un repose-poignets rembourré devant le clavier ou un support coulissant pour les coudes, mais rien n’a marché
À la place, j’ai changé ma façon de taper. En gardant les mains et les poignets détendus, et en bougeant les bras au lieu d’étendre les doigts pour appuyer sur les touches, ça a fonctionné
Je tape encore beaucoup tous les jours, mais cela fait 20 ans que je n’ai plus mal. Cela dépend sans doute des personnes, mais changer sa manière d’utiliser ses bras et ses mains peut énormément aider
Si on peut transférer le mouvement à des groupes musculaires plus importants, il vaut généralement mieux le faire. Par exemple, utiliser les épaules/le dos plutôt que les bras, les bras plutôt que les mains, et les mains plutôt que les doigts
Cela varie selon les personnes, mais un trackball m’a énormément aidé. Pendant un temps, j’avais une souris à gauche et un trackball à droite, en alternance, mais je n’en ai plus besoin maintenant
Faire des pauses et faire attention à sa posture est aussi important. La position des poignets compte particulièrement : je n’appuie mes poignets ni mes bras sur rien, et seuls mes doigts touchent le clavier
Bien plus tard, j’ai commencé à faire du renforcement avec des kettlebells, et j’ai senti une nette amélioration de la force et de la circulation sanguine
Il y a une dizaine d’années, j’avais des douleurs au dos, au cou et des problèmes de gestes répétitifs. J’ai appris à m’asseoir le dos droit, corrigé la hauteur de mon bureau et réorganisé ce qui se trouvait dessus pour éviter de taper voûté comme une crevette. J’ai aussi réalisé qu’en pratique, je n’avais pas besoin de taper autant que ça
Depuis, je n’ai plus aucune douleur
Si vous voulez une vue d’ensemble de Cursorless et le voir réellement en action, la présentation de Strange Loop cette année était très bien : https://youtube.com/watch?v=NcUJnmBqHTY
J’aime beaucoup et je suis heureux que le développement continue, mais j’ai l’impression qu’il faut vraiment s’y plonger seulement si on s’est blessé au bras ou à la main, ou si on souffre de troubles graves liés aux gestes répétitifs
Le coût mental d’entrée semble élevé
Cela dit, la plus grande contrainte me semble être qu’on ne peut en pratique l’utiliser qu’en télétravail, seul chez soi. J’ai du mal à imaginer l’utiliser à l’extérieur ou au bureau
Si je perdais l’usage de mes mains, je l’utiliserais probablement