3 points par GN⁺ 2023-11-11 | 1 commentaires | Partager sur WhatsApp
  • 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 bat avec 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 u du mot function, on peut appeler ce mot green 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 bat permet de sélectionner la plage function fetchBlog visible à 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 lambdas visualise 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érer async
  • 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
  • raised est 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
  • L’auteur participe à la bêta de GitHub Copilot Voice beta et souhaite la comparer au codage vocal basé sur Talon

1 commentaires

 
GN⁺ 2023-11-11
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

    • Mes poignets vont globalement bien, mais à cause d’une arthrose précoce héréditaire, les articulations de mes doigts ne vont pas toujours très bien
      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
    • Ça ressemble exactement au genre d’article taillé pour HN
      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
    • Je me demande si tu as aussi regardé la solution Emacs
      J’aimerais savoir si tu l’as trouvée médiocre, ou si la solution côté VS Code te paraissait simplement bien meilleure
    • Grâce à cet article, Talon m’a vraiment intrigué, alors je m’y suis mis immédiatement, j’ai déjà créé une couche applicative pour le terminal Warp et exposé à Talon un terminal Emacs qui n’était normalement pas détecté
      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

    • Emacs est plutôt bon dans la direction opposée grâce à Emacspeak, c’est-à-dire quand on peut taper mais pas voir l’écran
      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
    • Cette démo de programmation à la voix vaut le détour : https://youtu.be/GM_siEPD4Ws?si=f52wK3tqqJaCQPp7
    • Il existe bien un paquet Emacs pour piloter VSCode ou JetBrains via le plugin Cursorless
      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

    • Je me souviens de cette présentation. Il y a d’autres vidéos sur la chaîne du présentateur, mais malheureusement il semble ne plus faire de voice coding maintenant : https://www.youtube.com/@mccGoNZooo
  • 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/

    • Oui. En fait, quand j’ai essayé de le réimplémenter pour Emacs, la première étape a été de créer des hats dans le style d’avy
      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 ?

    • Non. Talon utilise un alphabet vocal composé de mots courts choisis pour être faciles à distinguer
      Plus de détails ici : https://whalequench.club/blog/2019/09/03/learning-to-speak-c...
    • Parce qu’ils sont faciles à prononcer et faciles à distinguer pour Talon
      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

    • C’est peut-être possible, mais un arrêt de plus de 2 secondes pour indiquer une position à l’écran, c’est bien trop long
      En codant, on s’arrête très souvent de cette manière
    • On peut voir sur YouTube des exemples d’utilisation d’eye trackers pour coder ou jouer et juger soi-même de la latence. Voici un exemple : https://youtu.be/FZRgBw8m34c?feature=shared&t=90
    • Il faut du suivi du regard avec clic par signal neuronal
      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

    • C’est aussi la plus grande révélation que j’ai eue au lycée en jouant de la basse
      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
    • J’ai souffert de graves troubles liés aux gestes répétitifs pendant quelques mois il y a presque 15 ans, puis ils ont disparu après plusieurs changements d’habitudes
      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
    • L’auteur l’a écrit ainsi intentionnellement. Si on regarde la page des personnages, on voit que c’est conçu pour refléter un dialogue entre Socrate et un élève. Je trouve ça assez malin
    • Le point clé, c’est de changer sa manière de taper
      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
    • Le reste du corps compte aussi. En particulier la tête et les épaules, ainsi que le tronc, les hanches et même les pieds méritent qu’on y prête attention
  • 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é

    • D’accord, mais des outils comme Emacs/Vim, Dvorak/Colemak ou les claviers chordés ont eux aussi un coût d’entrée é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
    • C’est bien que le développement soit actif
      Si je perdais l’usage de mes mains, je l’utiliserais probablement