Vim - 変更されていない場合は非表示時にバッファを削除する

Vim - 変更されていない場合は非表示時にバッファを削除する

私は、異なる Vim バッファで開いているファイル間を移動する傾向があります。

ファイル間を素早く切り替える場合 (例: クイックフィックス リスト、Ack 結果、タグ)、ファイルは開かれてすぐに非表示になることがよくあります。ただし、バッファーは開いたままなので、開いているバッファー リストが汚染されます。

バッファが何ら変更されていない場合、バッファを非表示にするのではなく閉じるように設定するにはどうすればよいですか。

答え1

ほとんどのものに欠点があるため、これに対する優れた解決策は実際にはありません。

試してみるのもいいでしょう:set bufhidden=delete'bufhidden'詳細は、こちらをご覧ください。) これは、あなたが望んでいるものにかなり近いようです。

ただし、'bufhidden'これはバッファにローカルな設定なので、新しいバッファごとに設定するか、または説明したように一時的に設定するバッファに対して設定する必要があります。非表示にするautocmdときにどのバッファを削除するかという基準に応じて、1 つまたはいくつかのバッファから設定できる可能性があります。

また、Vim のドキュメントでは、そのオプションを使用しないことを強く推奨していることに注意してください。

注意深い:unloaddeleteまたはを使用するとwipe、バッファ内の変更は警告なしに失われます。また、これらの値により、バッファ間を一時的に切り替える自動コマンドが機能しなくなる場合があります。

だから、それはおそらく無理だろう...

また:set nobuflisted、(参照'buflisted'バッファが存在する場合、:ls出力にはリストされません。

これはバッファにローカルな設定でもあるため、autocmd新しいバッファに設定するには が必要になります。

これはそれほど危険ではないようですし、あなたが求めていることをほぼ実現しているようです。しかし、これは現在バッファ、または開いているウィンドウのバッファなので、基本的には:ls常に空になることが保証され、役に立たなくなります。その場合、バッファを残しておくよりも本当に良いのでしょうか?

最後に、大規模な操作 (including:argsや quickfix など) の後にバッファをクリーンアップし、完了してすべてを保存したら、次を使用できます。

:%bd

これにより、すべてのバッファが閉じられ、編集できる新しい空のファイルが残ります。(:bdelete

これは、何か新しいものに切り替えて、少数のバッファだけを保持し、ファイル名の短い部分文字列や、その他の文字列を使用してバッファ間をすばやく切り替えられるようにしたい場合に便利なコマンドです:bnext

答え2

これが私が思いついたもので、今のところ満足しています。

" Unlist unchanged buffers if they are hidden
function! BufferUnchanged()
  return exists("b:undo_seq_load") && b:undo_seq_load==changenr()
endfunction
function! UnlistUnchangedBuffer()
  if BufferUnchanged()
    set nobuflisted
  endif
endfunction
" Save the undo sequence position on buffer load
autocmd BufReadPost * let b:undo_seq_load=changenr()
autocmd BufWinLeave * call UnlistUnchangedBuffer()

関連情報