在Vim中记录/拦截每一个按键

10

我刚开始制作了一个工具,帮助我提高使用 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的输入,处理它,然后将其写入某个虚拟tty,Vim将使用它作为输入。你认为这是最好的方法吗?如果是,你有什么提示可以告诉我如何做到这一点吗?

4个回答

2

在进一步查看和研究“script”源代码后,我发现了这个:

man 7 pty
man 4 pts
man 3 openpty

创建一个新的伪终端似乎是解决这个问题的方法,我将尝试一下。
编辑:看起来它正在工作。如果有人遇到类似的问题,可以在以下链接找到该项目:https://github.com/Baranowski/habit-vim/

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

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

似乎该函数正在等待用户输入。
  int gui_wait_for_chars(wtime)

因此,您可能能够从那里找到键盘输入的入口点。


1
如果您正在使用Mac OS X,可以使用this code将键盘输入记录到vim中。
这段代码大量借鉴了旧的Unix script命令,该命令是开源的。
使用它看起来会像这样(在下载源代码后):
$ 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命令,但是输出结果可能包含许多控制字符,使得阅读变得困难。
另外,请不要将该代码用于不良目的。它有点危险。

0

由于这与Vim没有直接关系(并且同样适用于改进其他键盘驱动的应用程序),因此我不会尝试在Vim中实现它(正如您已经发现的那样,这几乎是不可能的),而是通过操作系统手段拦截按键,例如通过自定义键盘驱动程序或键盘记录器。可能存在一些实现可以帮助您入手。


我做了更多的搜索,但找不到适合我的东西。'screen'能够记录输出,但不能记录输入。'script'记录输入和输出,但无法仅记录输入。我找到的所有键盘记录器要么记录所有键盘输入(无论tty/进程是否接收到它),要么需要内核级别的自定义驱动程序。我宁愿使用不需要root权限甚至应该可行的东西。 - Wojciech Baranowski
抱歉打扰,但我可以看到在Vim中实现这个的用例。如果您有多个层次需要解决故障(tmux + zsh + ssh + ... + Vim),那么解决Vim的键映射也意味着解决任何数量的父层。https://dev59.com/9mHVa4cB1Zd3GeqPmmk5#10805437--似乎有一个内置的日志记录选项,但我还没有测试过http://vim.wikia.com/wiki/Map_Ctrl-S_to_save_current_or_new_files--这是一个旨在供Vim使用但通常被终端拦截的关键命令的示例 - John P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接