记录/拦截Vim中的每次击键

时间:2013-05-30 08:00:30

标签: logging vim tty keylogger

我刚开始研究一种工具,可以帮助我提高Vim的工作效率。我希望它将每个击键记录到一个文件,然后识别低效的使用模式。我希望它能为每次按键存储一个时间戳。

我尝试使用-w和-W vim选项将每个击键转储到管道。但是,Vim不会在线报告击键,因此我无法获得可靠的时间戳。

我还尝试拦截来自tty的输入,将其写入管道并将其重定向为Vim的stdin。但随后Vim退出:

Vim: Warning: Input is not from a terminal

我也发现了捕获每个键的技巧:http://vim.wikia.com/wiki/Capture_all_keys。我对vimscript一无所知,但我觉得这不是我想要的。

所以我现在的想法是:我需要拦截来自tty的输入,处理它然后将它写入Vim将用作输入的假tty。你是否同意这是最好的方法?如果是的话,有关我如何做到这一点的任何提示?

4 个答案:

答案 0 :(得分:2)

在进一步挖掘并查看'script'源代码后,我发现了这个:

man 7 pty
man 4 pts
man 3 openpty

创建一个新的伪终端似乎是去这里的方式,我打算试一试。

编辑:它似乎正在发挥作用。如果有人遇到类似的问题,可以在https://github.com/Baranowski/habit-vim/找到该项目。

答案 1 :(得分:1)

一种可能的方法是修补Vim代码:在循环中,捕获键盘输入,保存它们,并将它们写入您的文件。 (或者你可以将它们添加到.viminfo

https://code.google.com/p/vim/source/browse/src/gui.c

似乎以下功能正在等待用户输入。

  int gui_wait_for_chars(wtime)

所以你可以从那里找到键盘输入的入口点。

答案 2 :(得分:1)

如果您正在使用mac os x,则可以使用this code将关键输入记录到vim

此代码大量借用旧的unix script命令,open source

使用它看起来像这样(在下载源代码之后):

$ make keylog          # No Makefile needed for an easy case like this.
$ ./keylog vim myfile  # ... and use vim a bit, then exit.
$ hexdump -C outfile   # `outfile` is the hard-coded keylog file name.

您也可以cat outfile,但它可能包含许多控制字符,导致输出难以阅读。

另外,请不要将该代码用于恶意目的。这有点危险。

答案 3 :(得分:0)

由于这与Vim没有直接关系(并且可以同样用于改进其他键盘驱动应用程序的使用),我不会尝试在Vim中实现这一点(正如您已经发现的那样,接近不可能),而是通过操作系统手段截取密钥,例如通过自定义键盘驱动程序或键盘记录程序。可能有几种实现方式可以帮助您入门。