如何重复Vim中的最后n个更改?

Sof*_*fia 41 vim repeat

.重复最后一次更改.做2.两次重复最后一次更改.

但想象一下,我想在最后一次之前重复这一变化.我怎么在Vim中做到这一点?

Fre*_*ihl 32

不要认为你可以,:help .但是,你可以做的是为你的编辑录制一个宏,你有很多寄存器可供选择{0-9a-zA-Z"}(大写要追加).然后使用eg @u编辑1,@t编辑2等等.

关于从Best of VIM提示录制的重要提示

" 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
Run Code Online (Sandbox Code Playgroud)

看看这些有关重复的更多提示:

:&     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
Run Code Online (Sandbox Code Playgroud)

  • 是的,我确实知道宏。只是想知道是否有更简单的方法来做到这一点。我仍然习惯了 vim,宏还没有在我的学习/肌肉训练列表中。不管怎么说,还是要谢谢你 :) (3认同)

joe*_*dle 6

我写了RepeatLast.vim插件来解决这个确切的要求.它提供了一个5\.键绑定来重复最后5个更改(包括移动)并2\D删除/忘记最后2个操作.

它的工作原理是始终启用宏录制,这可能并不适合所有人.但是,如果你可以忍受它,它在99%的用例中起作用.

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

注意事项:

:set ch=2使第一行输出不被"录制"消息隐藏.

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

  1. 难以在不丢失快速重复击键的情况下缓慢触发CursorHold事件
  2. 当用户响应提示时,不需要记录[Space]和[Enter]键.

q从长远来看,训练你的肌肉以先发制人地记录宏可能是一种更好的方法.;-)


koj*_*ow7 5

根据 Fredrick Phil 的回答,这里有一个例子:

录制您的宏

下面展示了如何录制一个宏来删除所有内容(包括带引号的字符串)并存储在寄存器中d。删除字符串的命令是da"。因此,要将这个命令存储在宏寄存器 d 中,我们可以简单地这样做:

qdda"q
Run Code Online (Sandbox Code Playgroud)

注意它以 q 开头和结尾。第二个字符是寄存器,在本例中d用于删除。但我们可以给它任何字母或数字。剩下的字符da"就是我们的命令。

使用我们的宏

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

@d
Run Code Online (Sandbox Code Playgroud)

重复上一个宏命令

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

@@
Run Code Online (Sandbox Code Playgroud)

不相关信​​息:

在这个例子中,我们使用了da"which代表delete a quoted string. (如果您想删除inside带引号的字符串的所有内容,但不删除引号本身,您可以改为使用di"。)。