我倾向于在不同 Vim 缓冲区中打开的文件之间切换。
当在文件之间快速切换时(例如,从快速修复列表、确认结果、标签),文件通常会被打开,然后立即隐藏。然而缓冲区仍然打开,污染了我的打开缓冲区列表。
如果缓冲区没有以任何方式修改,如何将缓冲区设置为关闭而不是隐藏。
答案1
对此并没有一个很好的解决方案,因为大多数都有缺点。
你可以尝试:set bufhidden=delete
(参见'bufhidden'
了解更多详细信息。)这看起来非常接近您想要的。
但是'bufhidden'
是缓冲区本地的设置,因此您必须为每个新缓冲区或您所描述的想要短暂的缓冲区设置它。您可以从其中一个autocmd
或几个缓冲区中执行此操作,具体取决于隐藏时应删除哪些缓冲区的标准。
另请注意,Vim 文档强烈建议不要使用该选项!
小心:当使用
unload
、delete
或wipe
时,缓冲区中的更改将丢失且不会发出警告。此外,这些值可能会破坏临时在缓冲区之间切换的自动命令。
所以这可能是一个无用的开始......
还有: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()