有时,我的全局替换不能替换一行中的所有匹配项。通过以下事实证实了这一点:当我进行确认替换时可以看到它,在具有多个可能匹配项的行中找到一个匹配项,但随后转到另一行。
我使用ggc参数操作在整个文件上都带有%
在此文件上:
hello hello
hello
hello hello hello
hello

如果我做%s/hello/goodbye/g,我会得到:
goodbye hello
goodbye
goodbye hello hello
goodbye

.vimrc中关于搜索/替换的全部内容是:
set hlsearch
set ignorecase
set incsearch


评论

请给我们一个真实的例子,并向我们展示您的vimrc。

:echo&gd的输出是什么,如果添加这样的第二个g标志:%s / hello / goodbye / gg还是完全删除g标志,会发生什么?如果:echo&gd的输出为1,请尝试在vimrc的末尾添加set nogdefault。

精细!我不知道为什么,但是默认情况下将其设置为0,所以我像您说的那样添加了set nogdefault,现在它可以工作了。谢谢!

#1 楼

也许您或插件已启用选项'gdefault'。此选项在执行替换时自动添加标志g

因此,当启用g时手动添加标志'gdefault'时,就好像您有2个g标志,其作用与否相同。 。因此,Vim只替换每行中第一个出现的模式。

默认情况下,此选项是禁用的,但是要确保是正确的,您可以在vimrcset nogdefault的末尾添加。

或者,如果您怀疑某个插件可能启用了该选项,则可以使用以下命令对其进行跟踪:verb set gd?

或者您可以习惯该选项,这意味着当您想要替换所有出现的模式,您无需添加g标志(因为已经由gdefault完成了),而当您仅希望替换一行的第一个模式出现时,您可以添加g标志(因为2个g标志与没有标志相同。

#2 楼

无需更改任何设置。语法错误。您应该使用所有%,如下所示:
hello hello
hello
hello hello hello
hello

:%s%hello%goodbye%g
goodbye goodbye
goodbye
goodbye goodbye goodbye
goodbye

通常在更改特定行时使用/,例如:像这样:
:1,3 s / hello / goodbye / g
goodbye goodbye
goodbye
goodbye goodbye goodbye
hello


评论


欢迎来到Vi和Vim!抱歉,但这个答案不正确,使用斜杠的语法没有任何问题,也没有理由必须使用%。你自己尝试过吗?

–filbranden♦
20 Dec 1'在15:07