Vim未加global operator执行%s/foo//仍删所有匹配项如何解决
问题成因
你遇到的这个现象是Vim的gdefault配置项被开启导致的,和你有没有手动加g标志没有关系:
- 你执行的命令里开头的
%是范围标记,代表对当前打开文件的所有行执行替换操作,末尾空的替换段代表把匹配到的foo替换为空字符串,也就是删除匹配内容。 - Vim原生的
:substitute(简写:s)命令默认行为是:不加g标志时,仅替换每行的第一个匹配项;但如果开启了gdefault选项,Vim会默认给所有:s命令追加g标志的效果,也就是默认替换每行内的所有匹配项,不需要手动写g。
你可以在Vim里执行下面的命令确认当前配置状态:
:set gdefault?
如果返回结果为gdefault,就说明该选项确实处于开启状态,就是导致你全量删除所有foo匹配的根因。
极少数情况下,如果确认gdefault是关闭状态仍有该问题,可以执行:verbose nmap s、:verbose command S检查是否有自定义映射、自动命令篡改了:s命令的默认行为,顺着返回的配置文件路径定位对应修改即可。
解决方法
根据你的使用习惯选对应方案即可:
- 临时修复当前编辑会话:直接执行
:set nogdefault即可关闭该选项,之后:s命令会回到默认逻辑,不加g时仅替换每行第一个匹配。 - 永久修复:把
set nogdefault写入你的Vim持久化配置文件即可,传统Vim的配置路径为~/.vimrc,Neovim的配置路径为~/.config/nvim/init.vim,如果用Lua配置Neovim则写入vim.o.gdefault = false。 - 如果你觉得
gdefault默认替换所有的逻辑更顺手不想关,只是某次需要只替换每行第一个匹配,可以在替换命令末尾显式加g标志——gdefault开启时,显式写g会反向关闭“替换所有匹配”的逻辑,比如只删除每行第一个foo的命令为::%s/foo//g
内容的提问来源于stack exchange,提问作者Sparsh
相关产品推荐
相关产品推荐

