使用showcmd显示命令历史记录


11

使用set showcmdVim时,在屏幕的最后一行显示部分命令。例如,在普通模式下,键入命令时,dt.将显示最后一行dt,然后,当您单击.命令时,将显示完整的行,因此不显示任何内容。

有没有办法显示完整的命令?例如,键入时dt.gU(dt.将显示first 。当开始键入第二个命令时,第一个命令将被清除,以便最后只gU(显示。

例如,这在说明GIF时可能很有用;并在遇到意外结果时检查是否键入了所需的内容。


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

@mixedmath对我来说将算作4个命令。答案的第二段试图消除我的意思。
贡萨洛·里贝罗

2
从Vim的角度来看,dt.gU(有2条命令:dt.gU(...。因此,您真正想要的是显示某种命令历史记录(Vim已经显示了“完整的命令”)。
马丁·图尔诺伊

@Carpetsmoker,是的,那可能就是我想要的。感谢您编辑问题标题。
贡萨洛·里贝罗

3
我一直在研究正常历史的Vim源代码。在src/normal.c代码调用clear_showcmd()的几个地方(normal_cmd()do_pending_operator()end_visual_mode())。showcmd_buf在这些时候,我正在将它们转储到文件中,这看上去还不错,但是我很确定,如果不进行类似的修改和重新构建Vim源代码,您将无法获得想要的东西。当然,这样做可能值得让您轻松制作gif图像。
John O'M。

Answers:


9

我找不到在常规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命令实际上成为dl在showcmd_buf。
  • 更改底线的命令将消除showcmd区域(例如,使用:命令或进入插入模式(至少在我的设置中))
  • 键入a后,捕获程序停止记录许多笔画",但是对于长寄存器指定的yank,我的键序列在vim窗口中可见。
  • 未在演员esc^[中显示,但在正常模式下命中显示在showcmd区域

4

John解决方案外,还有另一种方法来显示所有vim击键,这些击键是通过使用-w参数来记录的,该参数记录了您在文件中键入的所有字符。问题是,仅当您退出Vim时,vim才会编写按键。这就是VimGolf的工作方式。

要解决此问题,Kana Natsuno提出了此单行修补程序,该修补程序禁用了该-w选项的缓冲,因此您可以访问实时击键流。然后,只需阅读它们(例如tail -f),进行解析,或者您可以尝试在状态栏中显示它们(:set statusline)。

使用MacVim的Drew的live-stream-keystrokes分支检查Vim的自定义版本,以获取实时的击键流。

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

如果您想在视频教程或GIF中显示Vim按下的按键,这将很有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.