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

Posted

技术标签:

【中文标题】如何在 Vim 中重复最后 n 次更改?【英文标题】:How do I repeat the last n changes in Vim? 【发布时间】:2011-10-02 09:58:47 【问题描述】:

执行. 会重复上一次更改。执行2. 将最后一次更改重复两次。

但想象一下,我想在最后一个之前重复更改。我如何在 Vim 中做到这一点?

【问题讨论】:

这似乎是一个非常棒的功能。 (vim.org/sponsor/vote_results.php);我想要像事后宏录制一样的“时间机器” 【参考方案1】:

不要认为你可以,见: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

【讨论】:

是的,我确实知道宏。只是想知道是否有更简单的方法可以做到这一点。我还在习惯 vim,宏还在我的学习/肌肉训练列表中。无论如何谢谢:) . 命令简洁,简洁;对于宏需要更多击键而不是手动重做最后两个操作的小情况非常有用。虽然这是一个很好的答案,但它还没有被标记为正确。【参考方案2】:

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

它通过始终启用宏录制来工作,这可能并不适合所有人。但如果你能接受,它适用于 99% 的用例。

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

注意事项:

:set ch=2,这样第一行输出就不会被“录音”消息隐藏。

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

    难以缓慢触发 CursorHold 事件而不会丢失 快速重复的击键 [Space] 和 用户响应提示时的 [Enter] 键。

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

【讨论】:

【参考方案3】:

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

录制宏

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

qdda"q

注意它以 q 开头和结尾。第二个字符是寄存器,在这种情况下d 用于删除。但我们可以给它任何字母或数字。其余字符da" 是我们的命令。

使用我们的宏

现在我们的宏被记录下来了,我们可以使用@符号和寄存器来调用它:

@d

重复上一个宏命令

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

@@

无关信息:

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

【讨论】:

【参考方案4】:

记录您的“编辑”

是的!你可以在 vim 中做到这一点! ?

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

开始录制

在正常模式下按 q 后跟一个字母(az) 开始将击键记录到指定的寄存器。 Vim 在状态栏中显示录音 键入任何普通模式命令,或进入插入模式并键入文本

停止录制

以普通模式结束,如果不是,请进入普通模式,然后按q 以插入模式结束,按Ctrl+O,这会暂时进入正常模式,然后按q

播放您的击键/录音

@ 后跟之前选择的字母 键入 @@ 重复上次播放

参考文献

Vim Fandom: Recording keys for repeated jobs Vim Fandom: Macros Quora - How do you stop recording a Vim macro when in insert mode?

【讨论】:

以上是关于如何在 Vim 中重复最后 n 次更改?的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习

马哥M28-第8-10天的学习总结

vim :更改如何转到特定行

根据数组中的重复模式更改 SwiftUI 列表中文本字段的第二次出现

面试官:vim中如何跳到文件的开头,第n行,最后一行?

如何在R中重复一个字符串N次?