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

相关内容