他们如何记录所有击键?那一定是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表示),并且两组都有哈希映射。一字节版本将字节值映射到键码的字符串表示形式,例如
0
或g
。三字节版本类似地映射到字符串(例如<Esc>
或<C-V>
),但将字节二和字节三的组合值用作键。某些例外情况/拐角情况的处理方式不同,但是绝大多数键码是通过在这两个映射中的简单查找来解决的。看到按键记录器代码的基础性很强,我可以判断出按键代码日志文件中出现的错误(例如上面粘贴的示例)。事实证明,我应该使用VimGolf规则所需的vimrc文件。特别是,此行
set t_RV=
导致正确的日志记录。上面的“出现在屏幕上”示例实际上看起来像这样:
评论
我刚刚发现我们在这里有一个非常相似的问题