我有时会喜欢参加vimgolf赛。可能很有启发性。

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

评论

我刚刚发现我们在这里有一个非常相似的问题

#1 楼

他们可能使用内置参数-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 Layer指出实际代码使用-W参数,该参数与-w,但是日志文件被覆盖,而不是附加击键(:h -W):

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


评论


不错的猜测!它是-W不是-w(请参阅我的答案),但仍然...

– B层
17 Dec 6'在12:38



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

–statox♦
17年6月6日在12:40

是的只是追加与写入。

– B层
17年6月6日在12:40

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

– B层
2017年12月8日19:46



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

– B层
2017年12月11日20:40



#2 楼

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

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

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

这是用于在lib / vimgolf / cli.rb中启动vim的命令:

 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= 


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