Magia alienígena vinda do futuro, "Cursorless"
(xeiaso.net)- Com a recorrência de RSI e a necessidade de mudar novamente a forma de inserir código, a extensão Cursorless para VS Code se tornou a ferramenta central para edição de código por voz
- O Cursorless adiciona hats baseados em cores e letras aos tokens do código, permitindo que o usuário indique posições na tela por fala e execute ações como excluir, mover e inserir
- O ponto em que ele vai além da simples movimentação de cursor é combinar especificação de caminho, como
green urge past green bat, com reconhecimento de AST da linguagem para lidar com unidades estruturais como funções, lambdas e corpos de definições - Ao escrever comandos do Talon diretamente, é possível automatizar inserções como
async <destination>ou entradas longas como declarações de método em Go com comandos de voz mais curtos - Programar por voz não elimina as palavras que precisam ser ditas, mas pode criar um sistema de comandos mais próximo da forma como o código é compreendido mentalmente
Contexto da recorrência de RSI e do uso do Cursorless
- No momento de começar um novo emprego, a RSI voltou, e surgiu a necessidade de encontrar uma forma de voltar a programar em vez de depender, como antes, mais da escrita técnica
- Embora seja usuário de Emacs, desta vez está usando Visual Studio Code por causa de uma extensão específica
- Essa extensão é o Cursorless, que, combinado com software de controle por voz, permite edição de código em nível de AST
- Antes, o Cursorless era usado principalmente para navegação na tela, mas agora a intenção é aplicá-lo de forma mais profunda ao conjunto de tarefas possíveis
- Há o desejo de que esse tipo de método de entrada também existisse para mensagens no Slack e no Discord
Como falar posições com hat, target e destination
- As unidades básicas do Cursorless são target e destination
- target aponta para uma âncora individual dentro do documento
- destination significa uma posição relativa com base em um target específico
- Os tokens do documento recebem um hat composto por cor e letra
- a posição do hat determina seu nome
- a cor do hat resolve ambiguidades
- No código JavaScript de exemplo, se houver um hat verde sobre o
uda palavrafunction, essa palavra pode ser chamada degreen urge - É possível emitir comandos tendo esse target como referência para excluir a palavra ou movê-la para outro lugar
- Só isso já permite, por voz, uma manipulação próxima aos motions do Vim
Edição estrutural gerada por reconhecimento de AST
- A força do Cursorless não está apenas em apontar posições, mas em usar caminhos (path) junto com reconhecimento de AST da linguagem
- Com uma expressão como
green urge past green bat, é possível selecionar o intervalofunction fetchBlogvisível na tela - Como ele entende a estrutura AST da linguagem, também é possível apagar a função inteira ou movê-la para outra posição
- O comando
visualize lambdasvisualiza as lambdas dentro da função como unidades estruturais separadas - Como unidades de AST também podem ser targets, é possível selecionar o corpo de uma definição e continuar o refactoring dentro desse intervalo
- No exemplo, um refactoring para transformar a função em assíncrona fica simples
Expandindo a programação por voz com comandos do Talon
- Usando Cursorless com Talon, é possível escrever comandos de voz personalizados
- O exemplo
async <user.cursorless_destination>é um comando que insere"async"antes do destination especificado
[state] async <user.cursorless_destination>:
user.cursorless_insert(cursorless_destination, "async")
- Os comandos do Talon se dividem em duas grandes partes
- pattern: as palavras que o usuário fala
- capture: o alvo extraído do que foi dito
- Nesse exemplo, o pattern é
async, e o capture é o destino ondeasyncserá inserido - O capture
<user.cursorless_destination>é um capture especial que permite especificar antes ou depois de algum target - Comandos mais complexos também são possíveis, e uma regra do Talon para criar declarações de método em Go é usada como exemplo
(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)
Experimentos com declaração de método em Go e representação de ponteiros
- Em Go, métodos têm a seguinte forma
func (reciever *Type) MethodName() {
// function body here or something
}
- A explicação acrescenta que, em Go, não há métodos no sentido tradicional, mas sim funções que recebem um receiver com namespace em uma struct específica
- Sem automação, para inserir esse código por voz seria preciso dizer um comando longo
state funk args word reciever space star hammer type over go right space hammer method name args go right brack enter
- Com a regra do Talon, dá para falar de forma mais curta
meth r raised type named method name over
- Ainda há muitas palavras a dizer, mas a entrada fica mais eficiente e mais próxima da forma como os conceitos são organizados mentalmente
raisedé um experimento para expressar o conceito de ponteiro em Go de outra forma- A sintaxe de ponteiros em Go é ao estilo C, e a interpretação usada é que
*serve para baixar (lower) um valor de ponteiro para um valor comum, enquanto&serve para elevar (raise) um valor comum para um valor de ponteiro - Ao redesenhar os bindings do Talon para Go, está sendo testado se é mais fácil entender valores de ponteiro com o conceito de raising/lowering integrado
- A sintaxe de ponteiros em Go é ao estilo C, e a interpretação usada é que
- Há interesse em participar do GitHub Copilot Voice beta para comparar com a programação por voz baseada em Talon
1 comentários
Opiniões no Hacker News
Sou o autor do post, e não esperava que a reação aqui fosse tão positiva
Se tiverem interesse, deixei aqui meu repositório experimental de configurações do Talon: https://github.com/Xe/invocations
Acho que algum dia trabalhar desse jeito, em vez de usar o teclado, talvez não seja estritamente necessário, mas será muito menos doloroso; é bom saber que existe uma opção prática
Sempre que vejo esse tipo de configuração, sinto que minha neurodiversidade é bem diferente da de outras pessoas. O contexto e as abstrações que é preciso manter na cabeça para entender a tela e se mover por ela são enormes, e isso parece algo só possível depois de décadas de familiaridade com linguagens e IDE/CLI
A parte de que “com o tempo, isso vira uma segunda natureza como comandos do Vim” também parece algo que realmente precisa ser aprendido desse jeito. Uso computadores há 30 anos, mas esse nível de proficiência em programação ainda me deixa confuso e admirado
Queria saber se ela não foi boa, ou se a solução do lado do VS Code pareceu muito melhor
Não tenho muito interesse no Cursorless, porque não uso VSCode e porque os text objects do Vim/Evil mode são igualmente poderosos e visualmente menos barulhentos. Estou muito empolgado com esse conceito todo
Isto parece uma forma de usar a AST do tree-sitter para executar ações em “partes” do buffer
Se for isso, é muito parecido com os text objects do Vim/Evil, mas com um componente de voz acoplado
Se isso ganhar algo como “gravar e executar depois”, parece ter muito potencial. Enquanto você faz a tarefa X no teclado, se a próxima tarefa Y está visível na tela e é simples, você pode falar o comando de Y e, depois que X terminar, apertar um botão para executar o comando de voz. É muito melhor do que alternar entre digitar e falar
Digitar e falar usam áreas cognitivas diferentes, e escrever software depois de entender a sintaxe não é algo tão linguístico assim. Se for possível digitar e falar ao mesmo tempo, acho que ficaria mais fácil entrar em estado de fluxo, e isso parece uma espécie de debugging com pato de borracha turbinado. Também daria para fazer anotações
Acho que vai aparecer um pacote para Emacs
Mas acho que vai levar tempo para alcançar esta área. O mecanismo de exibição não consegue lidar com a notação no estilo do Cursorless, e a integração com tree-sitter ainda não está madura. Eu mesmo tentei
Mesmo assim, seria bom ter algo nativo para Emacs
Não é o Cursorless em si, mas há uma ótima apresentação e demonstração sobre programação por voz aqui: https://youtu.be/GM_siEPD4Ws?si=99ZhC1P4irOyu1pH
É gostoso de assistir, e o palestrante também aborda bem os problemas comuns atuais dessa área
Ainda estou tentando entender completamente como funciona
Soa parecido com o avy usando voz em vez de teclado, com comandos cientes da AST por cima: https://karthinks.com/software/avy-can-do-anything/
Depois tentei fazer os overlays ficarem sempre visíveis, mas travei em algum ponto
Apresentação na Strange Loop do autor do Cursorless: https://www.youtube.com/watch?v=NcUJnmBqHTY
Fico me perguntando por que usam “urge” e “bat”
Não poderia ser qualquer palavra que comece com a letra relacionada?
Há mais detalhes aqui: https://whalequench.club/blog/2019/09/03/learning-to-speak-c...
Depois de fazer programação por voz de 6 a 8 horas por dia por um tempo, você passa a valorizar cada uma dessas micro-otimizações
Com a tecnologia de rastreamento ocular de hoje, não bastaria colocar o cursor no ponto para onde a pessoa está olhando por mais de 2 segundos?
Isso me faz lembrar estudos sobre onde o olhar permanece ao dirigir ou ao observar obras de arte
Durante a programação, você para desse jeito o tempo todo
Seria necessário um dispositivo de rastreamento ocular extremamente responsivo e preciso, capaz de detectar pelo menos 3 a 5 botões: clicar, pressionar, soltar, mover para a direita, mover para a esquerda
Este estilo de escrita lembra muito as partes de diálogo entre a tartaruga e Aquiles em Gödel, Escher, Bach
Tenho 52 anos e digito todos os dias em cargos de tecnologia desde 1995. Por volta de 2000, tive lesão por esforço repetitivo e experimentei acessórios ergonômicos, como apoios acolchoados para apoiar os punhos em frente ao teclado ou dispositivos deslizantes para apoiar os cotovelos, mas nada funcionou
Em vez disso, mudei minha forma de digitar. Mantive mãos e punhos relaxados e passei a mover os braços, em vez de estender os dedos para pressionar as teclas; isso funcionou
Ainda digito bastante todos os dias, mas estou há 20 anos sem dor. Cada pessoa é diferente, mas mudar a forma como se usam os braços e as mãos pode ajudar muito
Se você consegue transferir o movimento para grupos musculares maiores, em geral é melhor fazer isso. Usar ombros/costas em vez dos braços, braços em vez das mãos, mãos em vez dos dedos
Cada pessoa é diferente, mas um trackball ajudou muito. Por um tempo, deixei um mouse à esquerda e um trackball à direita e alternava entre eles, mas agora isso não é mais necessário
Fazer pausas e prestar atenção à postura também é importante. A postura dos punhos é especialmente importante: não apoio os punhos nem os braços em lugar nenhum, deixando apenas os dedos tocarem o teclado
Muito depois, comecei a fazer treino de força com kettlebell e senti uma melhora considerável na força e na circulação sanguínea
Uns 10 anos atrás, eu tinha problemas de dor nas costas, dor no pescoço e lesão por esforço repetitivo. Aprendi a sentar com a coluna ereta, corrigi a altura da mesa e reorganizei os objetos sobre a mesa para não digitar curvado como um camarão. E também percebi que, na prática, não precisava digitar tanto assim
Desde então, não sinto dor nenhuma
Se você quiser uma visão geral do Cursorless e vê-lo em uso real, a palestra da Strange Loop deste ano foi boa: https://youtube.com/watch?v=NcUJnmBqHTY
Gostei muito e fico feliz que o desenvolvimento continue, mas, para realmente se aprofundar, parece que seria preciso ter machucado os braços ou as mãos, ou ter uma lesão por esforço repetitivo severa
O custo mental inicial de entrada parece alto
Só que a maior limitação parece ser que, na prática, isso só dá para usar trabalhando de casa e sozinho. É difícil imaginar alguém usando isso fora de casa ou no escritório
Acho que eu usaria se perdesse o uso das mãos