24

在 Vim 中,当我这样做时:

:%s/foo/bar/g

它将在整个文档中将所有出现的 'foo' 替换为 'bar'。完成后,光标已移动到最后一个将 'foo' 替换为 'bar' 的位置。

在发出此命令之前,如何:%s/foo/bar/g在光标不离开原始位置的情况下运行?

我可以在.vimrc文件中设置一些选项吗?

4

3 回答 3

34

:substitute命令运行时,在执行任何替换之前,光标的位置存储在跳转列表中。为了回到最近一次跳转之前的位置,可以使用 ``''Normal-mode 命令。前者准确跳转到存储位置;后者跳转到存储位置所属行上的第一个非空白字符。

通过发出命令,可以同时调用替换命令并随后将光标移回

:%s/pat/str/g|norm!``

或者,如果不跳转到精确位置而仅跳转到包含行就足够了,则使用命令

:%s/pat/str/g|''

不需要在后一个命令中''加上norm!前缀,因为 ''Ex 命令的范围语法允许的地址是指正常模式命令 ''跳转到的同一行(请参阅 :help :range);两者都只是查看' 伪标记的内容。

于 2012-05-06T08:27:29.800 回答
27

我只需在替换后键入Ctrl+O即可返回上一个位置。

于 2012-05-06T08:49:38.080 回答
0

它很旧,但是对于遇到这个问题的任何人,我想分享我的解决方案,因为即使没有任何替换它也能正常工作:

:exe 'norm m`' | %s/pattern/substitution/eg | norm g``

exe是必需的,因为norm将 bar 视为参数。

于 2021-09-06T08:19:54.717 回答