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

时间:2012-01-13 03:06:38

标签: vim editor buffer

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

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

缓冲区不应该是唯一的吗?

在这一系列命令之后:

:e .bashrc
:e .profile
:e .bashrc
:e .profile
:e .bashrc
:e .profile
:e .bashrc
:e .profile
:e .bashrc

我仍然只有两个缓冲区,如:buffers:ls.bashrc.profile所示。即使我使用多个窗口和标签页。

您是否将“缓冲区”与“Windows”混淆了?

答案 1 :(得分:3)

尝试以下命令:

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>

注意一些技巧:

  • filter(range(1, bufnr('$')), 'bufexists(v:val)')将显示vim当前具有的所有缓冲区(缓冲区编号)的列表。
  • empty(getbufvar(v:val, '&buftype'))检查缓冲区是否确实应该有文件。有一些插件打开缓冲区永远不应该在文件系统中表示:例如,缓冲区包含插件(如minibufexplorer)发出的当前打开的缓冲区列表。这些缓冲区的&buftype始终设置为nofile,普通缓冲区的空buftype。

答案 2 :(得分:1)

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

当我的缓冲区混乱时,我通常会关闭窗口。然后我从我的shell获得了一个命令,它从我的源代码控制中启动所有签出的文件 - 其中90%的时间是我感兴趣的文件。

我经常在cygwin bash上。然后运行

gvim `p4list` `svnopened`

功能p4listsvnopened如下:

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 svnopened() {
    svn st $@ | grep "^\M" | sed -e 's/^.\{8\}//'
}