vimgolf如何记录所有击键?


10

我不时喜欢参加vimgolf赛。这可能是有启发性的。

他们如何记录所有击键?那一定是vim功能。任何人都知道如何做到这一点。在某些情况下记录所有内容可能会派上用场。


1
我刚刚发现我们在这里
statox

Answers:


10

他们可能使用内置参数-w,请参见: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}

@B层编辑为指出实际代码使用的-W参数与该参数基本相同,-w但是日志文件被覆盖,而不是在其上附加击键(:h -W):

-W {scriptout}  Like -w, but do not append, overwrite an existing file.
        {not in Vi}

不错的猜测!它-W不是-w(见我的答案),但仍...
B层的

@BLayer好玩,我懒得看他们的代码:-)我将使用-W基本相同的文档进行更新。
statox

1
是的 只是追加与写入。
B层

一个(好的)猜测胜过一个被充分研究的基于事实的答案并被接受了?严重的不公正现象已经发生。:( ... LOL
B层

1
'这是一个高贵的手势。先生或女士,我谦虚地接受你的投票。迪莉迪莉
B层

14

我认为这不是那么简单,但是您可以在这里自己查看Ruby代码:

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

我看到了一个用于键盘记录的类。

这是用于vimlib / 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实际上(非常接近)-w outfile... -W outfile,它会覆盖将键入字符发送到的文件,而不是附加到该文件。但是,正如我所说,并不是“那么简单” ...比较那些文件之一的内容和vimgolf工具生成的内容。这是来自实际的vimgolf问题 ...

-W 复制时输出,然后粘贴到此处:

GI0. ý`gvgý`ZZ

几个非印刷字符“丢失了翻译”。

-W 屏幕上显示的输出:

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

好吧,这有点丑陋。

vimgolf显示/上传输出:

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

啊,那更好。


更新:我花了几分钟来仔细研究事情,并获得了一些新的信息。

首先,我上面提到的keylogger类keylog.rb确实是难题的主要部分,但实际上非常简单。Vim发出并保存在-W日志文件中的密钥代码是一个字节或三个字节(由第一个字节值0x80表示),并且两组都有哈希映射。

一字节版本将字节值映射到键码的字符串表示形式,例如0g。三字节版本类似地映射到字符串(例如<Esc><C-V>),但使用字节二和三的组合值作为键。有一些例外情况/角落情况以不同的方式处理,但是绝大多数键码是通过在这两个图中的简单查找来解决的。

看到按键记录器代码的基础性很强,我可以判断出按键代码日志文件(例如上面粘贴的示例)中出现的错误。原来我应该使用VimGolf规则所需的vimrc文件。特别是这条线

set t_RV= 

导致正确的日志记录。上面的“出现在屏幕上”示例实际上看起来像这样:

^VGI0. ^[gvg^AZZ

现在,您可以看到从此“原始”字符串到VimGolf呈现形式的直线。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.