如何在 Vim 中使用替换重复命令?

Posted

技术标签:

【中文标题】如何在 Vim 中使用替换重复命令?【英文标题】:How to repeat a command with substitution in Vim? 【发布时间】:2010-09-27 18:49:58 【问题描述】:

在 Unix 中,^ 允许您使用一些文本替换新文本来重复命令。例如:

csh% grep "stuff" file1 >> Results
grep "stuff" file1
csh% ^file1^file2^
grep "stuff" file2
csh%

是否有 Vim 等价物?很多时候,我发现自己在命令行上一遍又一遍地编辑小东西。

【问题讨论】:

【参考方案1】:

专门用于替换:使用& 重复您上次的替换,从正常模式到当前行。

要对所有行重复,请输入:%&

【讨论】:

这也应该是这个问题的公认答案 要在所有行上重复之前的替换并确认,您可以执行:%&c【参考方案2】:

q: 进入命令行窗口(@98​​7654322@)。

您可以在此窗口中编辑和重复使用以前输入的 ex 样式命令。

【讨论】:

不完全是我想要的,我想要一个更快的方法。但这是非常好的信息,因为现在我至少可以编写一个函数来做我正在寻找的东西。谢谢。【参考方案3】:

点击: 后,您可以键入几个字符和向上箭头,它将与您键入的字符匹配。例如输入:set,它会爬回你的“集合”。这也适用于搜索 - 只需键入 / 和向上箭头。 /abc 向上箭头会按时间顺序为您提供匹配的搜索字符串。

【讨论】:

【参考方案4】:

有两种方法。

    您只需按 . 键即可精确重播最后一个命令(移动除外)。例如,我输入 cw 然后 hello 将单词更改为“hello”。将光标移动到另一个单词后,我点击 . 再次执行此操作。 对于更高级的命令,如替换,执行替换后,只需按 : 键,然后按 向上箭头键,它会填满您的命令行使用相同的命令。

【讨论】:

但我不想重复命令,我想重复一个命令(从命令行),文本略有不同。 是的,你可以按^箭头,然后改变任何东西就行了。很抱歉我没有提到这一点。【参考方案5】:

要在所有带有相同标志的行上重复前面的替换,您可以使用映射g&

【讨论】:

这接近于我正在寻找的 - 如果我进行替换(:s/A/B/g 在正常模式下的当前行或v/V...:'<,'>s/A/B/g视觉模式下的一系列线条),我想在另一条线/选择上重复替换,最好是在我选择的模式下。感谢您的回复,我发现从正常模式&(相当于:&)将替换当前行,:'<,'>&v/V...:&)将替换在可视模式下选择的行范围。两个版本都重新应用在正常或可视模式下使用的最后一个替换。我也会将此作为答案发布。【参考方案6】:

如果您在正常模式:s/A/B/g(当前行)或可视模式:'<,>'s/A/B/g(当前选择中包含的行)下进行了替换,并且您想重复上一次替换,您可以:

移动到另一行(正常模式)并简单地按&,或者如果你喜欢,:-&-<CR>(看起来像:&),以影响当前行而不突出显示,或

突出显示一个范围(可视模式)并按:-&-<CR>(看起来像:'<,'>&)以影响选择中的行范围。

以我对 Vim 的有限了解,这解决了几个问题。一方面,最后一个视觉替换 :'<,'>s/A/B/g 可作为正常模式和视觉模式下的最后一个命令 (:-<UP>) 使用,但在正常模式下总是会产生错误。 (它仍然指的是视觉模式的最后一个选择——而不是我假设的光标处的空选择——我的示例替换在一次遍历中耗尽了所有匹配项。)同时,最后一个正常模式替换以 :s 开头,而不是:'<,'>s,因此您需要对其进行修改以在可视模式下使用。最后,& 可直接从普通模式获得,因此它接受重复选项和其他选择选项,例如接下来两行的 2&,正如用户 ruohola 所说,整个文件的 g&

在这两个版本中,按 : 然后按 & 就像您按 : 然后重新输入 s/A/B/ 一样,因此您上次所处的模式无关紧要,只有当前光标行或选择决定受影响的线路。 (请注意,像g 这样的尾随标志也被清除了,但在此语法中也出现了下一个标志,如:&g/: '<,'>&g。在我看来,这是喜忧参半,因为您可以/必须重新指定标志在这里,独立的& 似乎根本不带标志。我一定错过了一些东西。)

我欢迎提出建议和更正。其中大部分来自刚刚的实验,所以我确信还有很多内容,但希望它无论如何都会有所帮助。

【讨论】:

【参考方案7】:

看看这个:http://vim.wikia.com/wiki/Using_command-line_history 进行解释。

【讨论】:

以上是关于如何在 Vim 中使用替换重复命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vim/Vi 中快速查找和替换文本内容

如何在 Vim 中的单个命令调用中从光标位置开始并环绕文件末尾进行全局搜索和替换?

VIM常用操作

VIM常用操作

Vim命令之查找和替换

如何在 Vim 中重复任何命令,例如 emacs 中的“C-x z”?