Vim - 如果未更改則隱藏時刪除緩衝區

Vim - 如果未更改則隱藏時刪除緩衝區

我傾向於在不同 Vim 緩衝區中開啟的檔案之間切換。

當在檔案之間快速切換時(例如,從快速修復清單、確認結果、標籤),檔案通常會被打開,然後立即隱藏。然而緩衝區仍然打開,污染了我的開啟緩衝區清單。

如果緩衝區沒有以任何方式修改,如何將緩衝區設定為關閉而不是隱藏。

答案1

對此並沒有一個很好的解決方案,因為大多數都有缺點。

你可以嘗試:set bufhidden=delete(參見'bufhidden'了解更多詳細資訊。

但是'bufhidden'是緩衝區本地的設置,因此您必須為每個新緩衝區或您所描述的想要短暫的緩衝區設置它。您可以從其中一個autocmd或幾個緩衝區執行此操作,具體取決於隱藏時應刪除哪些緩衝區的標準。

另請注意,Vim 文件強烈建議不要使用該選項!

小心:當使用unloaddeletewipe時,緩衝區中的變更將遺失且不會發出警告。此外,這些值可能會破壞暫時在緩衝區之間切換的自動命令。

所以這可能是個無用的開始...

還有:set nobuflisted(參見'buflisted',在這種情況下,緩衝區存在,只是未在:ls輸出中列出。

它也是緩衝區的本地設置,因此您需要autocmd在新緩衝區上設置它。

這似乎沒有那麼危險,而且似乎幾乎達到了你的要求。但這甚至會取消列出目前的緩衝區,或打開視窗的緩衝區,因此這本質上確保:ls始終為空,這使其毫無用處,在這種情況下,您真的比保留緩衝區更好嗎?

最後,您可以在大型操作(例如涉及:args或快速修復)後清理緩衝區,完成並保存所有內容後,您可以使用:

:%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()

相關內容