3 pontos por GN⁺ 2023-11-11 | 1 comentários | Compartilhar no WhatsApp
  • 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 u da palavra function, essa palavra pode ser chamada de green 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 intervalo function fetchBlog visí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 lambdas visualiza 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 onde async será 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
  • Há interesse em participar do GitHub Copilot Voice beta para comparar com a programação por voz baseada em Talon

1 comentários

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

    • Meus punhos, em geral, estão bem, mas por causa de um histórico familiar de osteoartrite precoce, as articulações dos meus dedos nem sempre ficam bem
      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
    • Parece um texto feito sob medida para o gosto do HN
      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
    • Fiquei curioso se você também olhou a solução para Emacs
      Queria saber se ela não foi boa, ou se a solução do lado do VS Code pareceu muito melhor
    • Por causa deste post, fiquei muito curioso sobre o Talon e mergulhei direto; já criei uma camada de app para o terminal Warp e também expus ao Talon meu Emacs no terminal, que normalmente não era detectado
      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

    • O Emacs, graças ao Emacspeak, é bem bom no sentido oposto: quando a pessoa consegue digitar, mas não consegue ver a tela
      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
    • Vale ver esta demonstração de programação por voz: https://youtu.be/GM_siEPD4Ws?si=f52wK3tqqJaCQPp7
    • Existe um pacote de Emacs para controlar VSCode ou JetBrains com o plugin Cursorless
      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/

    • Isso mesmo. Na verdade, quando tentei reimplementá-lo para Emacs, o primeiro passo foi criar hats no estilo do avy
      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?

    • Não. O Talon tem um alfabeto fonético curto e escolhido para ser fácil de distinguir
      Há mais detalhes aqui: https://whalequench.club/blog/2019/09/03/learning-to-speak-c...
    • Porque é fácil de falar e fácil para o Talon distinguir
      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

    • Pode até ser possível, mas uma pausa de mais de 2 segundos para especificar uma posição na tela é longa demais
      Durante a programação, você para desse jeito o tempo todo
    • Dá para ver no YouTube casos de uso de eye trackers para programar ou jogar e julgar a latência por conta própria. Um exemplo está aqui: https://youtu.be/FZRgBw8m34c?feature=shared&t=90
    • É preciso rastreamento ocular com clique por sinais neurais
      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

    • A maior percepção que tive ao tocar baixo no ensino médio também foi essa
      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
    • Há quase 15 anos, sofri por alguns meses com uma lesão por esforço repetitivo severa e ela desapareceu depois que mudei vários hábitos
      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
    • O autor escreveu assim de propósito. Ao olhar a página de personagens, ela foi feita para refletir um diálogo entre Sócrates e um estudante. Acho bem inteligente
    • O ponto central é mudar a forma de digitar
      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
    • O restante do corpo também importa. Vale prestar atenção especialmente à cabeça e aos ombros, além do core, quadris e pés
  • 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

    • Concordo, mas ferramentas como Emacs/Vim, Dvorak/Colemak e teclados chorded também têm um custo inicial de entrada 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
    • É bom ver que está em desenvolvimento ativo
      Acho que eu usaria se perdesse o uso das mãos