2012-01-13 7 views
3

私はVimで編集しているときに、移動したディレクトリ内のいくつかのファイルを参照するVimセッションを復元することがあります。この問題は、:nを使用して新しいディレクトリにあるすべてのファイルを開いた後に発生します。今、:b <buffer-name>を使用して、新しいディレクトリにある特定のファイルを編集しているバッファに切り替えると、あいまいさがあります。同じ名前のファイルに2つのバッファが開かれ、これらのファイルの1つが存在しません。ですから、私は: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などのプラグインによって現在オープンされているバッファのリストを持つバッファです。これらのバッファは常にがnofileのように設定されています。通常のバッファは空のbuftypeを持っています。
+0

ありがとう!私は私のquesionで記述したものと同様のケースで関数をテストしましたが、それは意図したとおりに動作します。 –

+0

@ void-pointerところで、第2の質問(バッファの再索引付け)について:いいえ、そのようなコマンドはありません。バッファ番号は、新しいバッファが以前のバッファのバッファ番号を受信しないという意味で安定しています。バッファ番号も変更できません。 vimを再起動するだけです。 – ZyX

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'を2回使用していることが原因であると考えました。バッファの一部が存在しないファイルを参照していたためです。 –

+0

バッファリストの順序を変更することは(少なくとも「ネイティブに」)可能ではないと思います。 – romainl

+0

存在しないファイルを編集するバッファを自動的に消去する方法はありますか? –

1

私の提案はどちらも回避策ですが、私は言及する価値があると考えました。 1つの方法はです:lsマウスをつかみ、スクラッチバッファにペーストし、コマンドラインから起動します。

バッファが乱雑になると、私は通常ウィンドウを閉じます。それから、私のシェルから、ソースコントロールからチェックアウトしたファイルをすべて起動するコマンドがあります。時間の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さん/ \ /// G ' RM $ tempscript }

function svnopened() { 
    svn st [email protected] | grep "^\M" | sed -e 's/^.\{8\}//' 
} 
関連する問題