De vez em quando eu gosto de participar de uma rodada de vimgolf . Pode ser esclarecedor.
Como eles são capazes de gravar todas as teclas digitadas? Esse deve ser um recurso do vim. Alguém tem alguma idéia de como fazer isso. Pode ser útil gravar tudo em determinadas circunstâncias.
key-bindings
user-input
Mike
fonte
fonte
Respostas:
Eles provavelmente usam o parâmetro interno
-w
, consulte:h -w
:Editar Como a Camada @B apontou, o código real usa o
-W
parâmetro que é basicamente o mesmo,-w
mas o arquivo de log é substituído em vez de acrescentar as teclas nele (:h -W
):fonte
-W
não-w
(ver minha resposta), mas ainda assim ...-W
qual é basicamente o mesmo.Eu não acho tão simples assim, mas você pode olhar o código Ruby aqui:
https://github.com/igrigorik/vimgolf/tree/master/lib/vimgolf
Eu vejo uma classe para keylogging, por um.
Aqui está o comando usado para iniciar
vim
no lib / vimgolf / cli.rb :O @statox estava (quase) certo sobre
-w outfile
...-W outfile
, na verdade, que substitui o arquivo para o qual os caracteres digitados são enviados, em vez de anexá-lo. Mas como eu disse, não é tão simples assim ... compare o conteúdo de um desses arquivos e o que é gerado pela ferramenta vimgolf. Isto é de um problema real de vimgolf ...-W
saída quando copiada e colada aqui:Vários caracteres não imprimíveis foram "perdidos na tradução".
-W
saída como aparece na tela:Bem, isso é meio feio.
saída exibida / carregada pelo vimgolf:
Ahh, isso é melhor.
Atualização: passei alguns minutos olhando um pouco mais de perto as coisas e tenho algumas informações novas.
Primeiro, a classe keylogger keylog.rb que mencionei acima é realmente uma peça importante do quebra-cabeça, mas na verdade é bastante direta. Os códigos-chave que o Vim emite e salvos no
-W
arquivo de log são de um byte ou três bytes (indicado por um valor de primeiro byte de 0x80) e existe um mapa de hash para cada um dos dois conjuntos.A versão de um byte mapeia o valor do byte para uma representação de string do código-chave, como
0
oug
. A versão de três bytes mapeia de maneira semelhante a uma string (por exemplo,<Esc>
ou<C-V>
), mas usando como chave os valores combinados dos bytes dois e três. Existem algumas exceções / casos de canto que são tratados de maneira diferente, mas a grande maioria dos códigos de chave é resolvida através de pesquisas simples nesses dois mapas.Vendo quão básico era o código do key logger, eu poderia dizer que havia algo errado com o que estava vendo nos arquivos de log do keycode (como o exemplo colado acima). Acontece que eu deveria ter usado o arquivo vimrc exigido pelas regras do VimGolf. Em particular esta linha
resulta no log correto. O exemplo "aparece na tela" acima seria realmente assim:
Agora pode-se ver a linha reta dessa string "bruta" para a forma renderizada do VimGolf.
fonte