使用set showcmd时,Vim在屏幕的最后一行显示部分命令。例如,在正常模式下,键入命令dt.时,最后一行显示dt,然后,当您按.时,该命令已完成,因此没有显示。例如,输入dt.gU(时,将显示第一个dt.;当开始键入第二个命令时,第一个命令将被清除,因此最后仅显示gU(。并在遇到意外结果时检查是否键入了所需的内容。

评论

什么是完整命令?之所以显示dt,是因为它是当前待处理的运算符。一旦发出动作,操作员就不再待命。假设我们走得更远,大约做了dt.gU(gu)daw。是所有的“一个完整命令”,还是四个完整命令,或者其他什么?

@mixedmath对我来说将算作4个命令。答案的第二段试图消除我的意思。

从Vim的角度来看,dt.gU(是2个命令:dt。和gU(...。因此,您真正想要的是显示某种命令历史记录(Vim已经显示了“完整命令”)。
@Carpetsmoker,是的,那可能就是我想要的。感谢您编辑问题标题。

我一直在研究正常历史的Vim源代码。在src / normal.c中,代码在多个位置(normal_cmd(),do_pending_operator(),end_visual_mode())调用clear_showcmd()。在这些时候,我正在将showcmd_buf转储到一个文件中,这看起来还不错,但是我很确定,如果不进行类似的修改Vim源代码并重新构建它,您将无法获得想要的东西。当然,这样做可能值得您花些时间轻松制作GIF。

#1 楼

我找不到在常规Vim中执行此操作的任何方法。但是,如果您愿意对Vim进行修补,则可以使用以下方法。

非常简单的修补程序(适用于Vim-7.4.052)禁止对屏幕进行实际更新,从而清除了历史记录。正常命令的结尾。通过返回在更新显示之前是否设置了showcmd_is_clear来完成此操作。 (或者,您可以注释掉if语句,仅保留原始的一行return。注意:下面的补丁粘贴得不好;您可能必须手动应用此修补程序,尽管它只是一小段内容。注意:我没有注释掉实际的display_showcmd(),因为它似乎在可视模式下用于更新所选行数或其他可能的其他内容的显示。我尚未对此进行广泛的测试。

--- src/normal.c    2015-02-14 00:21:23.286352257 -0500
+++ src/normal.c    2015-02-14 00:21:25.238352173 -0500
@@ -4029,6 +4029,7 @@
    /* Don't actually display something if there is nothing to clear. */
    if (showcmd_is_clear)
        return;
+   return;
     }

     display_showcmd()


结果看起来像这样:



注意一些有趣的事情:


这甚至显示了简单的动作,例如jkb等。
x命令实际上变成了showcmd_buf中的dl:命令,或进入插入模式(至少在我的设置中))
我键入"后,捕获程序停止记录许多笔画,但是m在我的长寄存器指定的yank的vim窗口中可以看到y键序列。

#2 楼

除John解决方案外,还有另一种方法来显示所有通过使用-w参数按下的vim按键,这些参数记录了您在文件中键入的所有字符。问题是,仅当您退出Vim时,vim才会编写按键。 VimGolf的工作原理就是这样。然后,只需阅读它们(例如-w),进行分析,或者您可以尝试在状态栏中显示它们(tail -f)。

来源:Vimprint-Drew Neil博客上的Vim击键解析器

如果您想揭示按键Vim在视频教程或GIF中按了击键。