Vim:清除缓冲区编辑不存在的文件

Vim:清除缓冲区编辑不存在的文件,vim,editor,buffer,Vim,Editor,Buffer,通常,当我在Vim中编辑时,我会恢复一个Vim会话,该会话引用已移动目录中的一些文件。在我使用:n打开位于新目录中的所有文件后,会出现此问题。现在,当我使用:b切换到缓冲区编辑位于新目录中的特定文件时,存在一个模糊性:在具有相同名称的文件上打开两个缓冲区,其中一个文件不存在。因此,我不得不使用:ls,手动搜索正在编辑不存在文件的缓冲区的索引,并对每个文件调用:bw。是否有一些简单的命令可以自动清除缓冲区,为我编辑不存在的文件 此外,手动清除有问题的缓冲区后,连续缓冲区之间的索引会突然中断,这使得

通常,当我在Vim中编辑时,我会恢复一个Vim会话,该会话引用已移动目录中的一些文件。在我使用
:n
打开位于新目录中的所有文件后,会出现此问题。现在,当我使用
:b
切换到缓冲区编辑位于新目录中的特定文件时,存在一个模糊性:在具有相同名称的文件上打开两个缓冲区,其中一个文件不存在。因此,我不得不使用
:ls
,手动搜索正在编辑不存在文件的缓冲区的索引,并对每个文件调用
:bw
。是否有一些简单的命令可以自动清除缓冲区,为我编辑不存在的文件

此外,手动清除有问题的缓冲区后,连续缓冲区之间的索引会突然中断,这使得使用
:b
在缓冲区之间切换更加困难。是否有一个命令将为我重新索引缓冲区,以便索引集是某个连续的范围


谢谢你的帮助

缓冲区不应该是唯一的吗

在这一系列命令之后:

:e .bashrc
:e .profile
:e .bashrc
:e .profile
:e .bashrc
:e .profile
:e .bashrc
:e .profile
:e .bashrc
我仍然只有两个可用的缓冲区,如
:buffers
:ls
.bashrc
.profile
所示。即使我使用多个窗口和选项卡


你把“缓冲区”和“窗口”混淆了吗?

我的两个建议都是解决办法,但我认为值得一提。一种方法是:ls然后用鼠标抓取,粘贴到scratch缓冲区,然后从命令行启动

当我的缓冲区乱七八糟时,我通常会关上窗户。然后,我的shell中有一个命令,用于启动源代码管理中的所有签出文件——90%的时间是我感兴趣的文件

我通常在参加cygwin聚会。跑

gvim `p4list` `svnopened`
功能
p4list
svnopened
如下:

function p4list() {
  export tempscript=`mktemp`
  echo "#!bash" > $tempscript
  p4 opened $@ | sed -e 's/#.*//g' | sed -e 's/$/ \\/g' | sed -e '1~300s/^/\
\
p4 where /' >> $tempscript
  chmod +x $tempscript
  $tempscript | sed -e 's/.* //g' | sed -e 's/
//g'| sed-e's/\///g' rm$tempscript }


请尝试以下命令:

function s:WipeBuffersWithoutFiles()
    let bufs=filter(range(1, bufnr('$')), 'bufexists(v:val) && '.
                                          \'empty(getbufvar(v:val, "&buftype")) && '.
                                          \'!filereadable(bufname(v:val))')
    if !empty(bufs)
        execute 'bwipeout' join(bufs)
    endif
endfunction
command BWnex call s:WipeBuffersWithoutFiles()
用法:

:BWnex<CR>
:BWnex
注意一些技巧:

  • filter(范围(1,bufnr('$),'bufexists(v:val)
    将向您显示vim当前拥有的所有缓冲区(缓冲区编号)的列表
  • empty(getbufvar(v:val,&buftype'))
    检查缓冲区是否实际应该有一个文件。有一些插件打开缓冲区,但这些缓冲区永远不应该在文件系统中表示:例如,缓冲区包含由minibufexplorer等插件发出的当前打开的缓冲区列表。这些缓冲区总是将
    &buftype
    设置为类似
    nofile
    的值,普通缓冲区的buftype为空

感谢您指出这一点;我编辑了问题和标题,以反映问题的实际原因。我认为问题是由于我使用了两次
:e
,当时是因为一些缓冲区引用了不存在的文件。我认为不可能(至少“本机”)更改缓冲区列表的顺序。是否还有一些方法可以自动清除编辑不存在文件的缓冲区?不是内置的方法。但是一个自定义函数,可以循环所有缓冲区并检查文件是否存在。谢谢!我刚刚在一个与我在问题中描述的类似的情况下测试了这个函数,它按预期工作。@顺便说一句,关于第二个问题(为缓冲区重新编制索引):不,没有这样的命令。缓冲区编号是稳定的,因为新的缓冲区不会接收任何以前缓冲区的缓冲区编号。您也不能更改缓冲区编号。您所能做的就是重新启动vim。
:BWnex<CR>