在 Vim 中重复上一个正常模式命令,包括移动

jua*_*blo 32 vim normal-mode

在 Vim 中,使用.,我可以重复上一个普通模式命令;例如:

dd.
Run Code Online (Sandbox Code Playgroud)

删除一行两次。
但是,如果我输入

5j.
Run Code Online (Sandbox Code Playgroud)

光标不会向下移动 10 行。如何重复上一个正常模式命令,尤其是移动?

小智 28

即使在 vanilla vim 中也是可行的,但适用性取决于您的用例,即。您需要多久重复一次,因为它需要更多的按键才能使其可重复。


选项 1:将其转换为命令模式操作

以向下移动 5 行为例,您可以执行以下操作:

  1. 输入:norm 5j,它会将光标向下移动 5 行
  2. 用于@:重复动作

:norm 代表正常,任何后面的字符串都被认为是你在正常模式下的击键


选项 2:使用宏

  1. qa(将宏存储到寄存器中a,您可以选择自己的寄存器,例如qbqc
  2. 5j
  3. q (完成录制宏)
  4. @a重复您录制的操作(替换a为您选择的注册名称,例如@b@c

宏需要更多的精神力量来设置,但它更具可重复性,因为您可以将多个操作存储在不同的寄存器中而不会被最新的操作覆盖。

  • 全程选择2!不要忘记您还可以使用“@@”重新运行最后一个宏。另外,我通常使用 q 寄存器,因此键流变为“qq5jq”、“@@”。 (5认同)

Pau*_*aul 15

vim不幸的是不会这样做。你能做的最好的事情是安装repmo.vim插件,它重复有计数的移动命令。


Hep*_*ite 7

实际上是.重复上次更改,而不是上次普通模式命令。正如保罗所说,您将需要一个插件来允许您重复动作。

见“ :help .”。


thi*_*rty 5

您可以使用 重复更改.。可以使用;命令重复移动。这个命令似乎是新的,并且与其他答案中提到的 repmo.vim 脚本做了类似的事情。

例如,要移至下一个c,请按2fc。然后再次执行,只需键入;

  • `;` 并不新鲜。这是一个标准的 vi 命令。Vi 记住最后一个 `f`/`F`/`t`/`T` 运动的类型和目标字符(但不是数字参数),并且 `;` 重复它。但是,它不会重复其他动作。 (12认同)