3 Punkte von GN⁺ 2023-11-11 | 1 Kommentare | Auf WhatsApp teilen
  • Durch das Wiederauftreten von RSI musste die Art der Code-Eingabe erneut geändert werden, und die VS-Code-Erweiterung Cursorless wurde zum zentralen Werkzeug für sprachbasiertes Code-Editing
  • Cursorless versieht Code-Tokens mit farb- und buchstabenbasierten hat-Markierungen, sodass Nutzer Positionen auf dem Bildschirm per Sprache benennen und Aktionen wie Löschen, Verschieben und Einfügen ausführen können
  • Leistungsstärker als eine bloße Cursorbewegung ist die Kombination aus Pfadangaben wie green urge past green bat und Sprach-AST-Erkennung, mit der sich Struktureinheiten wie Funktionen, Lambdas und Definitionskörper bearbeiten lassen
  • Wer Talon-Befehle direkt schreibt, kann Einfügungen wie async <destination> oder lange Eingaben wie Go-Methodendeklarationen zu kürzeren Sprachbefehlen automatisieren
  • Sprachbasiertes Coden beseitigt die zu sprechenden Wörter nicht, kann aber ein Befehlssystem schaffen, das der Art näherkommt, wie man Code im Kopf versteht

Kontext: Wiederauftretendes RSI und der Einsatz von Cursorless

  • Zum Start in einen neuen Job trat RSI erneut auf, und statt sich wie zuvor auf technisches Schreiben zu stützen, wurde wieder eine Möglichkeit gebraucht, tatsächlich zu programmieren
  • Obwohl eigentlich Emacs genutzt wird, kommt diesmal wegen einer bestimmten Erweiterung Visual Studio Code zum Einsatz
  • Diese Erweiterung ist Cursorless, das in Verbindung mit Sprachsteuerungssoftware Code-Editing auf AST-Ebene ermöglicht
  • Zuvor wurde Cursorless hauptsächlich nur für die Navigation auf dem Bildschirm verwendet, diesmal soll es tiefer auf möglichst viele Arbeitsabläufe angewendet werden
  • Es gibt den Wunsch, eine solche Eingabemethode auch für Nachrichten in Slack und Discord zu haben

Mit hat, target und destination Positionen per Sprache benennen

  • Die Grundeinheiten von Cursorless sind target und destination
    • target bezeichnet einen einzelnen Anker im Dokument
    • destination meint eine relative Position bezogen auf ein bestimmtes target
  • Die Tokens im Dokument erhalten einen hat, der aus Farbe und Buchstaben besteht
    • Die Position des hat bestimmt seinen Namen
    • Die Farbe des hat löst Mehrdeutigkeiten auf
  • Befindet sich im JavaScript-Beispiel ein grüner hat über dem u im Wort function, kann dieses Wort als green urge bezeichnet werden
  • Für dieses target lassen sich dann Befehle erteilen, um das Wort zu löschen oder an eine andere Position zu verschieben
  • Schon allein damit sind per Sprache Operationen möglich, die Vim-Motions nahekommen

Strukturelles Editing durch AST-Erkennung

  • Die Stärke von Cursorless liegt darin, nicht bei bloßer Positionsangabe stehenzubleiben, sondern Pfade (path) und Sprach-AST-Erkennung gemeinsam zu nutzen
  • Mit Ausdrücken wie green urge past green bat lässt sich der Bereich function fetchBlog auf dem Bildschirm auswählen
  • Weil die AST-Struktur der Sprache verstanden wird, können auch ganze Funktionen gelöscht oder an andere Stellen verschoben werden
  • Der Befehl visualize lambdas visualisiert die Lambdas innerhalb einer Funktion als eigene Struktureinheiten
  • Da auch AST-Einheiten zu targets werden, lässt sich etwa der Body einer Definition auswählen und das Refactoring in diesem Bereich fortsetzen
  • Im Beispiel wird so das Refactoring zu einer asynchronen Funktion vereinfacht

Sprachbasiertes Coden mit Talon erweitern

  • Mit Talon zusammen lässt sich Cursorless durch selbst geschriebene Sprachbefehle erweitern
  • Das Beispiel async <user.cursorless_destination> ist ein Befehl, der "async" vor der angegebenen destination einfügt
[state] async <user.cursorless_destination>:
    user.cursorless_insert(cursorless_destination, "async")
  • Talon-Befehle bestehen im Wesentlichen aus zwei Teilen
    • pattern: die Wörter, die der Nutzer spricht
    • capture: das Ziel, das aus dem Gesagten extrahiert wird
  • In diesem Beispiel ist pattern async, und capture ist das Ziel, an dem async eingefügt werden soll
  • Das Capture <user.cursorless_destination> ist ein spezielles Capture, mit dem sich vor oder hinter einem beliebigen target eine Position angeben lässt
  • Auch komplexere Befehle sind möglich; als Beispiel dient eine Talon-Regel zum Erstellen einer Go-Methodendeklaration
(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)

Experimente mit Go-Methodendeklarationen und der Darstellung von Pointern

  • In Go haben Methoden die folgende Form
func (reciever *Type) MethodName() {
    // function body here or something
}
  • Dazu wird erklärt, dass Go keine Methoden im traditionellen Sinn hat, sondern Funktionen mit einem receiver, der in einem bestimmten Namespace einer struct zugeordnet ist
  • Ohne Automatisierung müsste man für die sprachbasierte Eingabe dieses Codes einen langen Befehl sprechen

state funk args word reciever space star hammer type over go right space hammer method name args go right brack enter

  • Mit der Talon-Regel lässt sich das deutlich kürzer sagen

meth r raised type named method name over

  • Es müssen zwar weiterhin viele Wörter gesprochen werden, doch die Eingabe wird effizienter und kommt der gedanklichen Konzeptualisierung näher
  • raised ist ein Experiment, um das Go-Pointer-Konzept anders auszudrücken
    • Die Pointer-Syntax in Go folgt dem C-Stil; dabei wird * als Operator interpretiert, der einen Pointer-Wert zu einem normalen Wert herunterstuft (lower), und & als Operator, der einen normalen Wert zu einem Pointer-Wert heraufstuft (raise)
    • Beim Neuentwurf der Talon-Bindings für Go wird experimentiert, Pointer-Werte über die Konzepte raising/lowering zusammenzufassen, um zu prüfen, ob das leichter verständlich ist
  • Es besteht Interesse daran, an der GitHub Copilot Voice beta teilzunehmen, um sie mit Talon-basiertem Sprach-Coding zu vergleichen

1 Kommentare

 
GN⁺ 2023-11-11
Meinungen auf Hacker News
  • Ich bin der Autor und hätte nicht erwartet, dass die Reaktion hier so positiv ausfällt.
    Falls es euch interessiert: Mein experimentelles Talon-Konfigurations-Repository habe ich hier abgelegt: https://github.com/Xe/invocations

    • Meine Handgelenke sind größtenteils in Ordnung, aber wegen früh einsetzender Arthrose in der Familie sind meine Fingergelenke nicht immer okay.
      Ich glaube, irgendwann wird es Tage geben, an denen diese Arbeitsweise gegenüber der Tastatur nicht unbedingt notwendig, aber deutlich weniger schmerzhaft ist, und ich bin froh zu wissen, dass es eine praktikable Option gibt.
    • Das wirkt wie ein Artikel, der genau den HN-Geschmack trifft.
      Jedes Mal, wenn ich so eine Konfiguration sehe, merke ich, dass meine Neurodiversität sich ziemlich von der anderer Menschen unterscheidet. Der Kontext und die Abstraktionen, die man im Kopf behalten muss, um den Bildschirm zu verstehen und sich darin zu bewegen, sind enorm, und es wirkt, als sei das nur möglich, wenn man über Jahrzehnte mit Sprache und IDE/CLI vertraut geworden ist.
      Auch der Teil „mit der Zeit wird es wie Vim-Befehle zur zweiten Natur“ scheint etwas zu sein, das man wirklich so verinnerlichen muss. Ich arbeite seit 30 Jahren mit Computern, aber dieses Maß an Coding-Routine ist für mich immer noch verwirrend und zugleich beeindruckend.
    • Ich frage mich, ob du dir auch die Emacs-Lösung angesehen hast.
      Mich würde interessieren, ob sie nicht so gut war oder ob die VS-Code-Lösung einfach deutlich besser wirkte.
    • Durch diesen Artikel wurde ich richtig neugierig auf Talon und bin direkt eingestiegen; ich habe schon eine App-Ebene für das Warp-Terminal gebaut und auch Terminal-Emacs, das normalerweise nicht erkannt wurde, für Talon sichtbar gemacht.
      An Cursorless selbst bin ich nicht besonders interessiert, weil ich VSCode nicht nutze und die Textobjekte im Vim/Evil-Modus genauso mächtig und visuell weniger laut sind. Das ganze Konzept finde ich sehr vielversprechend.
  • Das sieht nach einer Methode aus, mit einer tree-sitter-AST Operationen auf „Teilen“ des Buffers auszuführen.
    Wenn ja, ist es den Textobjekten von Vim/Evil sehr ähnlich, nur mit einer Sprachkomponente.
    Mit Funktionen wie „aufzeichnen und später ausführen“ hätte das großes Potenzial. Während man X mit der Tastatur erledigt, sieht man als Nächstes Y auf dem Bildschirm, und wenn es eine einfache Aufgabe ist, könnte man den Y-Befehl schon aussprechen und nach Abschluss von X per Knopfdruck den Sprachbefehl ausführen. Das wäre deutlich besser, als ständig zwischen Tippen und Sprechen zu wechseln.
    Tippen und Sprechen nutzen unterschiedliche kognitive Bereiche, und Software zu schreiben, nachdem man die Grammatik verstanden hat, ist gar nicht so sprachlich. Wenn man gleichzeitig tippen und sprechen kann, käme man vermutlich leichter in den Flow; das wirkt wie eine Art verstärktes Rubber-Duck-Debugging. Notizen wären auch möglich.
    Ich könnte mir vorstellen, dass ein Emacs-Paket erscheint.

    • Emacs ist dank Emacspeak in der Gegenrichtung ziemlich gut, also wenn man tippen kann, aber den Bildschirm nicht sieht.
      Aber es dürfte dauern, bis es in diesem Bereich aufholt. Die Rendering-Engine kann Cursorless-artige Markierungen nicht verarbeiten, und die tree-sitter-Integration ist noch nicht ausgereift. Ich habe es selbst ausprobiert.
    • Diese Demo zum Programmieren per Sprache ist sehenswert: https://youtu.be/GM_siEPD4Ws?si=f52wK3tqqJaCQPp7
    • Es gibt ein Emacs-Paket, das VSCode oder JetBrains über das Cursorless-Plugin steuert.
      Trotzdem wäre eine native Version für Emacs schön.
  • Es geht zwar nicht direkt um Cursorless, aber hier gibt es einen hervorragenden Vortrag samt Demo zu Sprachprogrammierung: https://youtu.be/GM_siEPD4Ws?si=99ZhC1P4irOyu1pH
    Macht Spaß anzusehen, und der Vortragende behandelt auch die aktuellen gemeinsamen Probleme dieses Bereichs gut.

    • An den Vortrag erinnere ich mich. Auf dem Kanal des Vortragenden gibt es weitere Videos, aber leider scheint er inzwischen nicht mehr per Sprache zu coden: https://www.youtube.com/@mccGoNZooo
  • Ich versuche noch, die Funktionsweise vollständig zu verstehen.
    Es klingt ähnlich wie avy mit Sprache statt Tastatur, plus AST-bewussten Befehlen: https://karthinks.com/software/avy-can-do-anything/

    • Genau. Als ich versucht habe, es für Emacs neu zu implementieren, war der erste Schritt tatsächlich, hats im avy-Stil zu bauen.
      Danach wollte ich die Overlays dauerhaft sichtbar machen, bin aber irgendwo steckengeblieben.
  • Strange-Loop-Vortrag des Cursorless-Autors: https://www.youtube.com/watch?v=NcUJnmBqHTY

  • Ich frage mich, warum „urge“ und „bat“ verwendet werden.
    Könnte man nicht einfach beliebige Wörter nehmen, die mit den jeweiligen Buchstaben beginnen?

    • Nein. Talon hat ein phonetisches Alphabet, das so ausgewählt ist, dass es kurz und leicht unterscheidbar ist.
      Mehr dazu hier: https://whalequench.club/blog/2019/09/03/learning-to-speak-c...
    • Weil sie leicht auszusprechen sind und Talon sie gut unterscheiden kann.
      Wenn man früher 6–8 Stunden am Tag per Sprache codiert hat, weiß man jede einzelne dieser Mikro-Optimierungen zu schätzen.
  • Würde es mit heutiger Eye-Tracking-Technik nicht reichen, den Cursor an die Stelle zu setzen, auf die man länger als 2 Sekunden schaut?
    Ich denke da an Studien dazu, wo der Blick beim Autofahren oder beim Betrachten von Kunstwerken verweilt.

    • Möglich wäre es vielleicht, aber ein Stillhalten von mehr als 2 Sekunden, nur um eine Bildschirmposition anzugeben, ist viel zu lang.
      Beim Coden hält man auf diese Weise sehr oft inne.
    • Auf YouTube kann man sich Beispiele ansehen, in denen Eye-Tracker fürs Coden oder Gaming genutzt werden, und die Latenz selbst beurteilen. Ein Beispiel ist hier: https://youtu.be/FZRgBw8m34c?feature=shared&t=90
    • Man bräuchte Eye-Tracking mit Klicks per Nervensignal.
      Nötig wäre ein extrem reaktionsschnelles und präzises Eye-Tracking-Gerät, das mindestens 3–5 Buttons erkennen kann: Klicken, Drücken, Loslassen, nach rechts bewegen, nach links bewegen.
  • Dieser Schreibstil erinnert mich stark an die Dialoge zwischen der Schildkröte und Achilles in Gödel, Escher, Bach.
    Ich bin 52 und tippe seit 1995 täglich in technischen Berufen. Um 2000 herum hatte ich Repetitive Strain Injury, und ich habe ergonomische Hilfsmittel ausprobiert, etwa weiche Polster, auf die man die Handgelenke vor der Tastatur legt, oder ausziehbare Vorrichtungen zum Ablegen der Ellbogen, aber nichts davon hat geholfen.
    Stattdessen habe ich meine Art zu tippen geändert. Ich ließ Hände und Handgelenke entspannt und bewegte die Arme, statt die Finger auszustrecken, um Tasten zu drücken — das hat funktioniert.
    Ich tippe auch heute noch jeden Tag viel, bin aber seit 20 Jahren schmerzfrei. Das ist von Person zu Person verschieden, aber es kann sehr helfen, die Art zu ändern, wie man Arme und Hände benutzt.

    • Die wichtigste Erkenntnis, die ich in der Highschool beim Bassgitarre-Spielen gewonnen habe, war genau das.
      Wenn man Bewegung auf größere Muskelgruppen verlagern kann, ist das meistens besser: Schulter/Rücken statt Arme, Arme statt Hände, Hände statt Finger.
    • Vor fast 15 Jahren hatte ich mehrere Monate lang eine starke Repetitive Strain Injury, und nachdem ich verschiedene Gewohnheiten geändert hatte, verschwand sie.
      Das ist je nach Person unterschiedlich, aber ein Trackball hat mir sehr geholfen. Eine Zeit lang hatte ich links eine Maus und rechts einen Trackball und habe abwechselnd beide benutzt, aber inzwischen ist das nicht mehr nötig.
      Pausen zu machen und auf die Haltung zu achten ist ebenfalls wichtig. Besonders wichtig ist die Haltung der Handgelenke: Ich stütze Handgelenke oder Arme nirgends ab und lasse nur die Finger die Tastatur berühren.
      Viel später habe ich mit Krafttraining mit Kettlebells angefangen und gemerkt, dass Kraft und Durchblutung sich ziemlich verbessert haben.
    • Der Autor hat das absichtlich so geschrieben. Wenn man sich die Charakterseite ansieht, soll sie einen Dialog zwischen Sokrates und einem Schüler widerspiegeln. Ich finde das ziemlich clever.
    • Entscheidend ist, die Art zu tippen zu ändern.
      Vor etwa 10 Jahren hatte ich Probleme mit Rückenschmerzen, Nackenschmerzen und Repetitive Strain Injury. Ich habe gelernt, mit geradem Rücken zu sitzen, die Schreibtischhöhe angepasst und die Dinge auf dem Schreibtisch so umgestellt, dass ich nicht mehr wie eine Garnele gekrümmt tippe. Außerdem wurde mir klar, dass ich tatsächlich gar nicht so viel tippen muss.
      Seitdem habe ich überhaupt keine Schmerzen mehr.
    • Auch der Rest des Körpers ist wichtig. Besonders Kopf und Schultern, aber auch Core, Hüften und Füße sind es wert, beachtet zu werden.
  • Wenn man einen allgemeinen Überblick über Cursorless und seinen Einsatz in der Praxis sehen möchte, war der diesjährige Strange-Loop-Vortrag gut: https://youtube.com/watch?v=NcUJnmBqHTY

  • Ich mag es sehr und freue mich, dass die Entwicklung weitergeht, aber um wirklich tief einzusteigen, müsste man sich wohl die Arme oder Hände verletzen oder eine schwere Repetitive Strain Injury haben.
    Die mentale Einstiegshürde wirkt hoch.

    • Zustimmung, aber Tools wie Emacs/Vim, Dvorak/Colemak oder Chorded Keyboards haben ebenfalls hohe Einstiegshürden.
      Die größte Einschränkung scheint mir allerdings zu sein, dass man das praktisch nur allein im Homeoffice verwenden kann. Ich kann mir schwer vorstellen, es draußen oder im Büro zu benutzen.
    • Schön, dass es aktiv weiterentwickelt wird.
      Wenn ich meine Hände nicht mehr benutzen könnte, würde ich es wohl verwenden.