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 vim
en 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 -W
archivo 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 0
o 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.