¿Cómo registra vimgolf todas las pulsaciones de teclas?

10

De vez en cuando me gusta participar en una ronda de vimgolf . Puede ser esclarecedor.

¿Cómo pueden grabar todas las pulsaciones de teclas? Esa debe ser una característica vim. Alguien alguna idea de cómo hacer eso. Podría ser útil grabar todo en ciertas circunstancias.

Miguel
fuente
1
Me acabo de
enterar de

Respuestas:

10

Probablemente usan el parámetro incorporado -w, ver :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 @B Layer señaló que el código real usa el -Wparámetro que es básicamente el mismo -wpero que el archivo de registro se sobrescribe en lugar de agregarle las teclas ( :h -W):

-W {scriptout}  Like -w, but do not append, overwrite an existing file.
        {not in Vi}
statox
fuente
¡Buena suposición! Está -Wno -w(véase mi respuesta) pero aún así ...
B Capa
@BLayer Bien jugado Fui demasiado vago para mirar su código :-) Actualizaré con el documento para el -Wcual es básicamente el mismo.
statox
1
Sí. Solo agrega vs escribe.
B Capa
¿Una (buena) suposición supera y es aceptado por una respuesta bien investigada y basada en hechos? Se ha cometido una grave injusticia. :( ... LOL
B Layer
1
Es un gesto noble. Acepto humildemente su voto, buen señor o señora. Dilly Dilly.
B Layer
14

No creo que sea tan simple, pero puedes ver el código Ruby tú mismo aquí:

https://github.com/igrigorik/vimgolf/tree/master/lib/vimgolf

Veo una clase para keylogging, por ejemplo.

Aquí está el comando que se usa para iniciar vimen 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}}

@statox tenía (casi) razón sobre -w outfile... -W outfile, en realidad, que sobrescribe el archivo al que se envían los caracteres escritos en lugar de agregarlo. Pero como dije, no es "tan simple" ... compare el contenido de uno de esos archivos y lo que genera la herramienta vimgolf. Esto es de un problema real de vimgolf ...

-W salida cuando se copia y luego se pega aquí:

GI0. ý`gvgý`ZZ

Varios caracteres no impresos se "perdieron en la traducción".

-W salida como aparece en la pantalla:

^VGI0. ^[<80>ý`gvg^A<80>ý`ZZ

Bueno, eso es un poco feo.

Salida de vimgolf mostrada / cargada:

<C-V>GI0. <Esc>gvg<C-A>ZZ

Ahh, eso está mejor.


Actualización: pasé unos minutos mirando un poco más de cerca las cosas y tengo un par de nuevas piezas de información.

Primero, la clase keylogger keylog.rb que menciono anteriormente es de hecho una pieza importante del rompecabezas, pero en realidad es bastante sencilla. Los códigos de tecla que emite Vim y que se guardan en el -Warchivo de registro son de un byte o tres bytes (indicado por un primer valor de byte de 0x80) y hay un mapa hash para cada uno de los dos conjuntos.

La versión de un byte asigna el valor del byte a una representación de cadena del código clave como 0o g. La versión de tres bytes se asigna de manera similar a una cadena (por ejemplo, <Esc>o <C-V>) pero utilizando como clave los valores combinados de los bytes dos y tres. Hay algunas excepciones / casos de esquina que se manejan de manera diferente, pero la gran mayoría de los códigos clave se resuelven mediante búsquedas simples en estos dos mapas.

Al ver cuán básico era el código del registrador de claves, pude notar que algo andaba mal con lo que estaba viendo en los archivos de registro del código de claves (como el ejemplo pegado anteriormente). Resulta que debería haber usado el archivo vimrc requerido por las reglas de VimGolf. En particular esta línea

set t_RV= 

da como resultado el registro correcto. El ejemplo anterior "aparece en pantalla" en realidad se vería así:

^VGI0. ^[gvg^AZZ

Ahora se puede ver la línea recta desde esta cadena "en bruto" hasta la forma renderizada de VimGolf.

Capa B
fuente