有时我需要替换多个缓冲区。出于此目的,我使用:bufdo %s/old/new/gec
。最近我注意到,当缓冲区列表中存在不可修改的缓冲区时,该命令失败(在我的情况下,它打开了文件浏览器/ netrw)。运行命令后,vim离开了我E21: Cannot make changes, 'modifiable' is off
并打开了Netrw窗口。
:bufdo
只能在可修改的缓冲区上使用吗?我已经尝试了:bufdo!
,但行为是一样的(只是没有显示错误)。
更新
我发现.vimrc
行造成了这种有问题的行为:
let g:netrw_liststyle=3
我不知道这里有什么神奇之处,但是当我设置此选项时,建议的解决方案/命令都不适用于我。现在,问题是如何保持这一行并使:bufdo
行为跳过由Netrw创建的缓冲区。
答案 0 :(得分:3)
好吧,如果:bufdo sil! :%s/old/new/gec
对您不起作用(这会默默地忽略错误)。您需要将命令包装到if
语句中。像这样:
:bufdo if &ma | :%s/old/new/gec | endif
检查每个缓冲区,如果它是可修改的,然后只尝试用new替换旧的。
注意:除'readonly'
设置外,您可能还需要检查'modifiable'
选项。