Como o vimgolf grava todas as teclas digitadas?

10

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.

Mike
fonte
11
Acabei de descobrir que temos uma pergunta bem parecida aqui
statox

Respostas:

10

Eles provavelmente usam o parâmetro interno -w, consulte :h -w:

-w {scriptout}  All the characters that you type are recorded in the file
        "scriptout", until you exit Vim.  This is useful if you want
        to create a script file to be used with "vim -s" or
        ":source!".  When the "scriptout" file already exists, new
        characters are appended.  See also |complex-repeat|.
        {scriptout} cannot start with a digit.
        {not in Vi}

Editar Como a Camada @B apontou, o código real usa o -Wparâmetro que é basicamente o mesmo, -wmas o arquivo de log é substituído em vez de acrescentar as teclas nele ( :h -W):

-W {scriptout}  Like -w, but do not append, overwrite an existing file.
        {not in Vi}
statox
fonte
Bom palpite! É -Wnão -w(ver minha resposta), mas ainda assim ...
B Camada de
@ Blayer Bem jogado, fiquei com preguiça de olhar para o código deles :-) Vou atualizar com o documento para o -Wqual é basicamente o mesmo.
statox
11
Sim. Basta acrescentar vs escrever.
Camada B
Um palpite (bom) supera e é aceito por uma resposta bem pesquisada e baseada em fatos? Uma grave injustiça foi feita. :( ... LOL
Camada B
11
É um gesto nobre. Aceito humildemente o seu voto, bom senhor ou senhora. Dilly friamente.
Camada B
14

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 vimno 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 -Warquivo 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 0ou 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.

Camada B
fonte