在Vim中如何重复一个带有替换的命令?

38
在Unix中,符号^允许您对一条命令进行重复,然后将某些文本替换为新文本。例如:
csh% grep "stuff" file1 >> Results
grep "stuff" file1
csh% ^file1^file2^
grep "stuff" file2
csh%

有没有类似于 Vim 的工具?有很多时候我会在命令行上反复编辑一些小的东西。

8个回答

98

针对替换操作:在正常模式下,使用&重复您最近一次的替换

要在所有行上重复,请键入:%&


这也应该是这个问题的被接受的答案 - ecbrodie
4
要在所有行上重复上一个替换,并进行确认,你可以执行 :%&c - Sagebrush Gardener

11

q: 用于进入命令行窗口(:help cmdwin)。

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


不完全是我想要的,我想要一个更快的方法。但这真的是很好的信息,因为现在我至少可以编写一个函数来做我想要的事情。谢谢。 - Whaledawg

9
一旦您敲击了:,您可以输入几个字符并使用向上箭头,它会匹配您已输入的内容。例如,键入:set,它将回溯查找您的“设置”。这也适用于搜索 - 只需键入/和向上箭头。并且/abc向上箭头将按时间顺序提供与搜索字符串匹配的结果。

7
为了在所有行上以相同的标志重复之前的替换,可以使用映射 g&。

1
这很接近我想要的 - 如果我在正常模式下对当前行进行替换(使用:s/A/B/g),或者在可视模式下对一系列行进行替换(使用v/V...:'<,'>s/A/B/g),我希望能够在另一行/选择中重复该替换,最好是在我选择的模式下。感谢您的回复,我发现在正常模式下,&(等同于:&)将替换当前行,而:'<,'>&v/V...:&)将替换在可视模式下选择的行范围内。两个版本都会重新应用上次在正常或可视模式下使用的最后一个替换。我也会将此作为答案发布。 - John P

7
有两种方法。
  1. 你只需按下.键即可执行与上一个命令(除了移动)完全相同的操作。例如,我输入cw然后输入hello来将一个单词更改为“hello”。在将光标移动到另一个单词之后,我按下.再次执行相同的操作。
  2. 对于更高级的命令,例如替换,在执行替换后,只需按下:键,然后按向上箭头键,它会自动填充相同的命令行。

1
但我不想重复命令,我想用略微不同的文本重复一个命令(从命令行)。 - Whaledawg
是的,你可以使用 ^ 箭头,然后更改行上的任何内容。很抱歉我没有提到这一点。 - palehorse

4
如果你在正常模式下或可视模式下进行了替换,如 :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。在我看来,这是一种混合的祝福,因为你可以/必须在这里重新指定标志,而独立的&似乎根本不接受标志。我一定是遗漏了什么。)
欢迎提出建议和更正。大部分来自刚刚进行的实验,因此我确定还有很多内容,但希望它能够起到帮助的作用。

0

0

您可以输入@:来重复上一条命令。


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