如何:仅在vim中的可修改缓冲区上执行bufdo?

如何:仅在vim中的可修改缓冲区上执行bufdo?,vim,Vim,有时我需要跨多个缓冲区进行替换。为此,我使用了:bufdo%s/old/new/gec。最近我注意到,当缓冲区列表中有不可修改的缓冲区时(在我的例子中,它是打开的fileexplorer/netrw),该命令会失败。运行命令后,vim给我留下E21:无法进行更改,'modifiable'关闭并打开Netrw窗口 :bufdo的方法是否仅适用于可修改的缓冲区?我已经试过:bufdo,但行为是相同的(只是没有显示错误) 更新 我发现.vimrc中的一行造成了这种问题行为: let g:netrw_l

有时我需要跨多个缓冲区进行替换。为此,我使用了
:bufdo%s/old/new/gec
。最近我注意到,当缓冲区列表中有不可修改的缓冲区时(在我的例子中,它是打开的fileexplorer/netrw),该命令会失败。运行命令后,vim给我留下
E21:无法进行更改,'modifiable'关闭
并打开Netrw窗口

:bufdo
的方法是否仅适用于可修改的缓冲区?我已经试过
:bufdo,但行为是相同的(只是没有显示错误)

更新

我发现
.vimrc
中的一行造成了这种问题行为:

let g:netrw_liststyle=3

我不知道这里有什么神奇之处,但当我设置此选项时,建议的解决方案/命令对我都不起作用。现在,问题是如何保持这一行,并使
:bufdo
行为跳过Netrw创建的缓冲区。

如果
:bufdo sil!:%s/old/new/gec
不适用于您(这会自动忽略错误)。您需要将命令包装到
if
语句中。大概是这样的:

:bufdo if &ma | :%s/old/new/gec | endif
它检查每个缓冲区,如果它是可修改的,然后才尝试用新的替换旧的


注意:除了
'modifiable'
设置之外,您可能还需要检查
'readonly'
选项。

您是否尝试使用bang<代码>:bufdo!%s/old/new/gec
我身上没有Vim,所以我无法尝试:-)不幸的是,它仍然将我留在netrw树上。但是,现在它没有显示任何错误。也可以考虑<代码>:ARGDO < /代码>。代码>:bufdo在这里正确地避免了netrw缓冲区,即使使用我最简单的
vimrc
。你可以不使用
vimrc
(或使用)试试吗?@TimurFayzrakhmanov你需要:set nocompatible。不幸的是,它也不起作用。我发现了一行让我产生问题的代码:
让g:netrw_liststyle=3
(将默认视图设置为树样式列表)。设置此选项时,建议的两个命令都不起作用。。那我该怎么办呢?我喜欢树景。@TimurFayzrakhmanov,但这很管用。也许if条件不正确,也许netrw缓冲区实际上是可修改的。但是你需要找到另一种情况吗?也许是你的名字?我不明白你的问题。你在暗示什么?我想要的只是在缓冲区之间进行替换,不包括不可修改的缓冲区,并以最简单的方式进行替换,如
bufdo%s/old/new/gec
。我认为if/endif的解决方案不适用,因为我不会键入太长的命令-这很烦人。@TimurFayzrakhmanov。
if..end
是一种方法。您要求只对可修改的缓冲区执行此操作,这就是如何做到的。如果你想让它变短,你可以为它制作一个命令,甚至映射它。如果不希望netrw窗口受到影响,则需要指定要检查的选项。(可能是
buftype
选项的buffername,无论如何我都会接受你的答案)但是你的解决方案确实不起作用,但是当我去掉这个选项时,它就起作用了。所以我想我需要创建另一个问题