Magia alienígena del futuro: "Cursorless"
(xeiaso.net)- 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 batcon 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
ude la palabrafunction, esa palabra se puede llamargreen 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 rangofunction fetchBlogen 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 lambdasvisualiza 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
asyncy 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
raisedes 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
- La sintaxis de punteros de Go es de estilo C, y se usa la interpretación de que
- Quiere participar en la beta de GitHub Copilot Voice para compararla con la codificación por voz basada en Talon
1 comentarios
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
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.
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.
Quisiera saber si no te convenció, o si la solución del lado de VS Code te pareció mucho mejor.
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.
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.
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/
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?
Hay más detalles aquí: https://whalequench.club/blog/2019/09/03/learning-to-speak-c...
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.
Al programar, hay muchísimas pausas de ese tipo.
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
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
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
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
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
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
Creo que lo usaría si perdiera el uso de las manos