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 :
vimcmd = GOLFVIM.shellsplit + %W{-Z -n --noplugin --nofork -i NONE +0
-u #{challenge.vimrc_path} -U NONE -W #{challenge.log_path} #{challenge.work_path}}
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:
GI0. ý`gvgý`ZZ
Vários caracteres não imprimíveis foram "perdidos na tradução".
-W
saída como aparece na tela:
^VGI0. ^[<80>ý`gvg^A<80>ý`ZZ
Bem, isso é meio feio.
saída exibida / carregada pelo vimgolf:
<C-V>GI0. <Esc>gvg<C-A>ZZ
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
ou g
. 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
set t_RV=
resulta no log correto. O exemplo "aparece na tela" acima seria realmente assim:
^VGI0. ^[gvg^AZZ
Agora pode-se ver a linha reta dessa string "bruta" para a forma renderizada do VimGolf.