3 puntos por GN⁺ 2023-11-11 | 1 comentarios | Compartir por WhatsApp
  • Tras una recaída de RSI y la necesidad de volver a cambiar la forma de ingresar código, la extensión Cursorless de VS Code se convirtió en la herramienta central para la edición de código basada en voz
  • Cursorless agrega hats basados en colores y letras a los tokens del código, lo que permite al usuario referirse verbalmente a ubicaciones en pantalla y realizar acciones como borrar, mover e insertar
  • Lo que lo hace más potente que el simple movimiento del cursor es que combina especificaciones de ruta como green urge past green bat con reconocimiento del AST del lenguaje para manipular unidades estructurales como funciones, lambdas y cuerpos de definiciones
  • Al escribir comandos de Talon propios, se pueden automatizar entradas como async <destination> o declaraciones largas, como métodos de Go, con comandos de voz más breves
  • La codificación por voz no elimina las palabras que hay que decir, pero permite construir un sistema de comandos más cercano a la forma en que uno entiende el código mentalmente

Contexto de la recaída de RSI y el uso de Cursorless

  • Al empezar un nuevo trabajo, tuve una recaída de RSI y, en vez de apoyarme en la escritura técnica como antes, necesitaba encontrar una forma de volver a programar
  • Aunque soy usuario de Emacs, esta vez estoy usando Visual Studio Code por una extensión en particular
  • Esa extensión es Cursorless, que combinada con software de control por voz permite la edición de código a nivel de AST
  • Antes usaba Cursorless principalmente para moverme por la pantalla, pero esta vez quiero aplicarlo más a fondo a todo lo que sea posible hacer
  • Me gustaría que Slack y los mensajes de Discord también tuvieran este tipo de método de entrada

Cómo indicar ubicaciones con hats, targets y destinations

  • Las unidades básicas de Cursorless son target y destination
    • target apunta a un ancla individual dentro del documento
    • destination significa una posición relativa con respecto a un target específico
  • A los tokens del documento se les agrega un hat compuesto por un color y una letra
    • La posición del hat determina el nombre
    • El color del hat resuelve ambigüedades
  • Por ejemplo, en código JavaScript, si hay un hat verde sobre la u de la palabra function, esa palabra se puede llamar green urge
  • Se pueden dar comandos para borrar esa palabra o moverla a otra posición usando ese target
  • Solo con este método ya es posible hacer por voz operaciones cercanas a los Vim motions

Edición estructural mediante reconocimiento del AST

  • La potencia de Cursorless no se limita a indicar posiciones: viene de combinar rutas (path) con reconocimiento del AST del lenguaje
  • Con expresiones como green urge past green bat, se puede seleccionar el rango function fetchBlog en la pantalla
  • Como entiende la estructura AST del lenguaje, también permite borrar una función completa o moverla a otra ubicación
  • El comando visualize lambdas visualiza las lambdas dentro de una función como unidades estructurales separadas
  • Como las unidades del AST también pueden ser targets, después de seleccionar el cuerpo de una definición se puede continuar refactorizando dentro de ese rango
  • En el ejemplo, se vuelve sencillo refactorizar una función para convertirla en una función asíncrona

Codificación por voz extendida con comandos de Talon

  • Al usar Cursorless junto con Talon, se pueden escribir comandos de voz propios
  • El ejemplo async <user.cursorless_destination> es un comando que inserta "async" antes de la destination indicada
[state] async <user.cursorless_destination>:
    user.cursorless_insert(cursorless_destination, "async")
  • Un comando de Talon se divide principalmente en dos partes
    • pattern: las palabras que dice el usuario
    • capture: el objetivo extraído de lo que se dijo
  • En este ejemplo, el pattern es async y el capture es el destino donde se insertará async
  • El capture <user.cursorless_destination> es un capture especial que permite indicar antes o después de algún target
  • También son posibles comandos más complejos; se usa como ejemplo una regla de Talon que crea una declaración de método en 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)

Declaraciones de métodos en Go y experimento con la expresión de punteros

  • En Go, los métodos tienen la siguiente forma
func (reciever *Type) MethodName() {
    // function body here or something
}
  • Se explica que en Go no hay métodos en el sentido tradicional, sino funciones que reciben un receiver namespaced a un struct específico
  • Sin automatización, para ingresar este código por voz habría que decir un comando largo

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

  • Con la regla de Talon, se puede decir algo más breve

meth r raised type named method name over

  • Todavía son muchas palabras por decir, pero la entrada se vuelve más eficiente y más cercana a la forma en que se conceptualiza mentalmente
  • raised es un experimento para expresar de otra manera el concepto de punteros en Go
    • La sintaxis de punteros de Go es de estilo C, y se usa la interpretación de que * sirve para bajar (lower) un valor de puntero a un valor normal, mientras que & sirve para subir (raise) un valor normal a un valor de puntero
    • Al rediseñar los bindings de Talon para Go, se está experimentando con si entender los valores de puntero mediante los conceptos de raising/lowering resulta más fácil
  • Quiere participar en la beta de GitHub Copilot Voice para compararla con la codificación por voz basada en Talon

1 comentarios

 
GN⁺ 2023-11-11
Opiniones de Hacker News
  • Soy el autor, y no esperaba que esto tuviera tan buena recepción aquí.
    Si les interesa, dejé aquí mi repositorio de configuración experimental de Talon: https://github.com/Xe/invocations

    • Mis muñecas en general están bien, pero por osteoartritis temprana heredada en la familia, las articulaciones de mis dedos no siempre lo están.
      Siento que algún día trabajar de esta manera, en lugar de con teclado, no será necesariamente imprescindible, pero sí mucho menos doloroso; y me alegra saber que existe una opción práctica.
    • Parece un texto hecho a la medida del gusto de HN.
      Cada vez que veo una configuración así, siento que mi neurodiversidad es bastante distinta de la de otras personas. El contexto y las abstracciones que hay que mantener en la cabeza para entender la pantalla y moverse por ella son enormes, y parece algo posible solo después de décadas de familiaridad con lenguajes e IDE/CLI.
      La parte de que “con el tiempo se vuelve una segunda naturaleza, como los comandos de Vim” también parece algo que de verdad habría que aprender así. Llevo 30 años usando computadoras, pero este nivel de dominio de programación todavía me resulta desconcertante y admirable.
    • Me pregunto si también revisaste la solución de Emacs.
      Quisiera saber si no te convenció, o si la solución del lado de VS Code te pareció mucho mejor.
    • Gracias a este texto me dio mucha curiosidad Talon y me lancé de inmediato; ya hice una capa de aplicación para la terminal Warp y también expuse a Talon el Emacs de terminal, que normalmente no se detectaba.
      No me interesa mucho Cursorless, porque no uso VSCode y los objetos de texto de Vim/Evil mode son igual de potentes y visualmente menos ruidosos. Todo este concepto me entusiasma mucho.
  • Esto parece una forma de realizar acciones sobre “partes” del buffer usando el AST de tree-sitter.
    Si es así, se parece mucho a los objetos de texto de Vim/Evil, pero con un componente de voz.
    Si a esto se le agrega algo como “grabar y luego ejecutar”, le veo mucho potencial. Mientras haces la tarea X con el teclado, si en pantalla se ve la siguiente tarea Y y es algo simple, podrías dictar el comando Y y, cuando termine X, presionar un botón para ejecutar el comando de voz. Mucho mejor que alternar entre teclear y hablar.
    Teclear y hablar usan áreas cognitivas distintas, y escribir software después de entender la sintaxis no es tan lingüístico. Si se puede teclear y hablar al mismo tiempo, creo que sería más fácil entrar en estado de flujo, y se ve como una especie de rubber duck debugging potenciado. También serviría para tomar notas.
    Creo que saldrá un paquete para Emacs.

    • Emacs, gracias a Emacspeak, es bastante bueno en la dirección opuesta: cuando puedes teclear, pero no puedes ver la pantalla.
      Pero creo que le tomará tiempo ponerse al día en esta área. El motor de visualización no puede manejar las anotaciones al estilo de Cursorless, y la integración con tree-sitter todavía no está madura. Lo intenté personalmente.
    • Vale la pena ver esta demostración de programación por voz: https://youtu.be/GM_siEPD4Ws?si=f52wK3tqqJaCQPp7
    • Existe un paquete de Emacs que controla VSCode o JetBrains con el plugin de Cursorless.
      Aun así, sería bueno tener uno nativo para Emacs.
  • No es Cursorless en sí, pero aquí hay una excelente charla y demostración sobre programación por voz: https://youtu.be/GM_siEPD4Ws?si=99ZhC1P4irOyu1pH
    Es disfrutable de ver, y el ponente también cubre bien los problemas comunes actuales en esta área.

  • Todavía estoy tratando de entender por completo cómo funciona.
    Suena parecido a avy usando voz en lugar del teclado, con comandos conscientes del AST agregados: https://karthinks.com/software/avy-can-do-anything/

    • Sí. De hecho, cuando intenté reimplementarlo para Emacs, el primer paso fue crear hats al estilo de avy.
      Luego intenté que las superposiciones estuvieran siempre visibles, pero en algún punto me quedé atorado.
  • La charla en Strange Loop del autor de Cursorless: https://www.youtube.com/watch?v=NcUJnmBqHTY

  • Me pregunto por qué usan “urge” y “bat”.
    ¿No se puede usar cualquier palabra que empiece con la letra correspondiente?

    • No. Talon tiene un alfabeto fonético elegido para que sea corto y fácil de distinguir.
      Hay más detalles aquí: https://whalequench.club/blog/2019/09/03/learning-to-speak-c...
    • Porque son fáciles de pronunciar y fáciles de distinguir para Talon.
      Cuando has probado programar por voz 6 a 8 horas al día, se agradece cada una de estas microoptimizaciones.
  • Con la tecnología de seguimiento ocular actual, ¿no sería suficiente poner el cursor donde miras durante más de 2 segundos?
    Me vienen a la mente estudios sobre dónde se detiene la mirada al conducir o al ver obras de arte.

    • Tal vez sea posible, pero una pausa de más de 2 segundos para señalar una ubicación en pantalla es demasiado larga.
      Al programar, hay muchísimas pausas de ese tipo.
    • En YouTube puedes ver casos de uso de rastreadores oculares para programar o jugar, y juzgar la latencia por tu cuenta. Aquí hay un ejemplo: https://youtu.be/FZRgBw8m34c?feature=shared&t=90
    • Hace falta seguimiento ocular con clic por señales neuronales.
      Se necesita un dispositivo de seguimiento ocular extremadamente reactivo y preciso, capaz de detectar al menos 3 a 5 botones: clic, presionar, soltar, mover a la derecha, mover a la izquierda.
  • Este estilo de escritura se siente muy parecido a las partes de diálogo entre la tortuga y Aquiles en Gödel, Escher, Bach
    Tengo 52 años y trabajo en tecnología desde 1995, escribiendo todos los días. Alrededor del 2000 sufrí lesiones por esfuerzo repetitivo, y probé ayudas ergonómicas como almohadillas acolchadas para apoyar las muñecas frente al teclado o dispositivos deslizantes para apoyar los codos, pero nada funcionó
    En cambio, cambié mi forma de teclear. Dejé las manos y muñecas relajadas y, en vez de estirar los dedos para presionar las teclas, empecé a mover los brazos, y eso funcionó
    Todavía escribo mucho todos los días, pero llevo 20 años sin dolor. Cada persona es distinta, pero cambiar la forma en que usas los brazos y las manos puede ayudar muchísimo

    • En la preparatoria, la mayor lección que aprendí al tocar bajo eléctrico fue justamente esa
      Si puedes transferir el movimiento a grupos musculares más grandes, por lo general conviene hacerlo. Usar hombros/espalda en vez de brazos, brazos en vez de manos, manos en vez de dedos
    • Hace casi 15 años tuve lesiones por esfuerzo repetitivo graves durante varios meses y desaparecieron después de cambiar varios hábitos
      Cada persona es distinta, pero el trackball me ayudó mucho. Durante un tiempo tuve un mouse a la izquierda y un trackball a la derecha y los alternaba, pero ya no lo necesito
      También es importante descansar y cuidar la postura. En especial la postura de las muñecas: no apoyo las muñecas ni los brazos en ningún lado, y solo los dedos tocan el teclado
      Mucho después empecé a hacer entrenamiento de fuerza con kettlebells, y sentí una mejora considerable en fuerza y circulación
    • El autor lo escribió así a propósito. Si miras la página de personajes, está pensado para reflejar un diálogo entre Sócrates y un estudiante. Me parece bastante ingenioso
    • La clave es cambiar la forma de teclear
      Hace unos 10 años tenía problemas de dolor de espalda, dolor de cuello y lesiones por esfuerzo repetitivo. Aprendí a sentarme con la espalda recta, ajusté la altura del escritorio y reorganicé las cosas sobre la mesa para no teclear encorvado como camarón. Y también me di cuenta de que, en realidad, no necesito teclear tanto
      Desde entonces no he tenido nada de dolor
    • El resto del cuerpo también importa. En especial vale la pena prestar atención a la cabeza y los hombros, además del core, las caderas y los pies
  • Si quieres ver una visión general de Cursorless y cómo se usa en la práctica, la charla de Strange Loop de este año estuvo buena: https://youtube.com/watch?v=NcUJnmBqHTY

  • Me gusta mucho y me alegra que siga en desarrollo, pero para meterse de lleno en esto parece que tendrías que lesionarte un brazo o una mano, o tener una lesión por esfuerzo repetitivo severa
    La barrera mental de entrada parece alta

    • Estoy de acuerdo, pero herramientas como Emacs/Vim, Dvorak/Colemak y los teclados con acordes también tienen una barrera de entrada alta
      Aunque la mayor limitación parece ser que, en la práctica, solo puedes usar esto cuando trabajas desde casa y solo. Me cuesta imaginar usarlo afuera o en una oficina
    • Me alegra que esté en desarrollo activo
      Creo que lo usaría si perdiera el uso de las manos