2012-01-13 144 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\}//' 
}