2012-01-13 83 views
3

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

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

感谢您的帮助!

回答

2

试试下面的命令:

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。
+0

谢谢!我只是在类似于我在问题中描述的情况下测试了函数,并且它按预期工作。 – 2012-01-13 14:34:14

+0

@ void-pointer顺便提一下,关于第二个问题(reindexing buffers):不,没有这样的命令。缓冲区号是稳定的,因为没有新缓冲区将接收任何先前缓冲区的缓冲区号。您也不能更改缓冲区号码。你所能做的就是重新启动vim。 – ZyX 2012-01-13 16:16:07

3

缓冲区是否应该是唯一的?

命令序列后:

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

我仍然只有两个缓冲器可用如图:buffers:ls.bashrc.profile。即使我使用多个窗口和标签。

您是否将“缓冲区”与“窗口”混淆?

+0

感谢您指出这一点;我编辑了问题和标题以反映问题的实际原因。我认为这个问题是由于我使用':e'两次导致的,因为有些缓冲区指的是不存在的文件。 – 2012-01-13 11:12:17

+0

我不认为这是可能的(至少“本地”)来改变缓冲区列表的顺序。 – romainl 2012-01-13 12:47:08

+0

是否还有一些方法可以自动清除编辑不存在文件的缓冲区? – 2012-01-13 13:07:07

1

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

当我的缓冲区变得混乱时,我通常会关闭窗口。然后我有一个命令从我的shell启动所有检出的文件从我的源代码管理 - 这90%的时间是我感兴趣的文件。

我通常在cygwin bash上。并运行

gvim `p4list` `svnopened` 

功能p4listsvnopened低于:

function p4list() { 
    export tempscript=`mktemp` 
    echo "#!bash" > $tempscript 
    p4 opened [email protected] | 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 [email protected] | grep "^\M" | sed -e 's/^.\{8\}//' 
}