如何在Vim中重复最后n次更改?

45

. 命令会重复上一个修改操作,而 2. 会重复上一个修改操作两次。

但是,如果我想要重复上上个修改操作,应该怎么做呢?在 Vim 中如何实现?


10
这似乎是一个很棒的功能请求。(http://www.vim.org/sponsor/vote_results.php) 我希望能够像“时间机器”一样进行事后宏录制。 - sehe
4个回答

39
不要认为你做不到,看看:help .。然而,你可以为编辑记录一个宏,有很多寄存器可供选择{0-9a-zA-Z"}(大写字母追加)。 然后使用例如@u进行编辑1,@t进行编辑2等。 来自Best of VIM Tips的重要录制提示。
" Recording (BEST TIP of ALL)
qq  # record to q
your complex series of commands
q   # end recording
@q to execute
@@ to Repeat
5@@ to Repeat 5 times
qQ@qq                             : Make an existing recording q recursive *N*
" editing a register/recording
"qp                               :display contents of register q (normal mode)
<ctrl-R>q                         :display contents of register q (insert mode)
" you can now see recording contents, edit as required
"qdd                              :put changed contacts back into q
@q                                :execute recording/register q

查看这些内容以获取更多有关重复的提示:

:&     last substitute
:%&    last substitute every line
:%&gic last substitute every line confirm
g%     normal mode repeat last substitute
g&     last substitute on all lines
@@     last recording
@:     last command-mode command
:!!    last :! command
:~     last substitute
:help repeating

3
是的,我知道宏。只是想知道是否有更简单的方法来做这件事。我仍在适应Vim,宏还在我的待学习/训练清单中。无论如何,还是谢谢 :) - scc
1
“.” 命令因其简短而整洁,对于宏需要比手动重做最后两个操作更多按键的小情况非常有用。虽然这是一个好答案,但它还没有被标记为正确。 - fde-capu

10

我编写了RepeatLast.vim插件来解决这个需求。它提供了一个5\.键绑定,用于重复最近的5次更改(包括移动),以及2\D用于放弃/忘记最后的2个动作。

它通过始终启用宏录制来实现工作,这可能不适合每个人。但是,如果您可以接受这一点,在99%的使用情况下它都可以正常工作。

最新版本:https://github.com/joeytwiddle/RepeatLast.vim(请反馈!)

注意事项:

:set ch=2,以便输出的第一行不会被“recording”消息隐藏。

它无法按预期工作的1%的时间通常是由于:

  1. 难以缓慢触发CursorHold事件而不失去快速重复的击键
  2. 在用户响应提示时不希望记录[Space]和[Enter]键。

在长期内,训练您的q肌肉以预先记录宏可能是更好的方法。 ;-)


5
根据Fredrick Phil的回答,这是一个例子:
记录宏: 以下是如何记录宏以删除包含在引号中的所有内容并将其存储在寄存器“d”中的示例。删除字符串的命令是“da””。因此,我们可以将此命令存储在宏寄存器d中,只需执行以下操作:
qdda"q

注意命令以q开头和结尾。第二个字符是寄存器,本例中为d表示删除。但我们也可以使用任何字母或数字来表示寄存器。剩余的字符da"则是我们的命令。

使用宏

现在我们已经录制了宏,可以通过使用@符号后跟寄存器来调用它:

@d

重复上一个宏命令

要再次使用最近调用的宏命令:

@@

非相关信息:

在这个例子中,我们使用了"da",它代表删除一个被引用的字符串。(如果您想要删除引用字符串内部的所有内容,但不包括引号本身,可以使用"di"来代替)


0

记录你的“编辑”

没错!你可以在 Vim 中做到这一点!

Vim 最有用的功能之一是其能够记录您键入的内容以供以后播放。这对于无法轻松使用 . 完成的重复性工作非常有用。

开始录制

  • 在正常模式下按下 q,然后再按一个字母(az
    • 这将开始将按键记录到指定的寄存器中。 Vim 在状态行中显示录制
    • 输入任何正常模式命令,或进入插入模式并输入文本

停止录制

  • 在正常模式下结束,如果不在正常模式下,请回到正常模式并按下 q
  • 在插入模式下结束,请按下 Ctrl+O,这将暂时使您进入正常模式,然后再按下 q

播放您的按键/录制

  • 按下@,然后输入先前选择的字母
  • 键入@@重复上次播放

参考资料


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