如何实现无未隐藏常规缓冲区时自动关闭Vim的功能
通用工具类缓冲区检测自动退出Vim脚本
核心逻辑
判断所有已加载的缓冲区中,是否仅剩下buftype为nofile/nowrite/quickfix、或属于预设工具类filetype的特殊缓冲区,若是则自动退出Vim,无需手动逐个关闭工具面板,完美匹配你提到的使用场景。
完整实现代码
" 自定义需要识别的工具类缓冲区filetype,可根据自己使用的插件增删 let g:utility_buffer_filetypes = ['NERDTree', 'Tagbar', 'magit', 'dbui', 'Outline', 'Trouble'] function! s:CheckAndAutoQuit() " 特殊场景过滤:diff模式、命令窗口、prompt缓冲区不触发逻辑 if &diff || expand('%') == '[Command Line]' || &buftype == 'prompt' return endif let l:regular_buf_count = 0 " 遍历所有有效缓冲区 for l:buf in range(1, bufnr('$')) if bufexists(l:buf) && buflisted(l:buf) let l:bt = getbufvar(l:buf, '&buftype') let l:ft = getbufvar(l:buf, '&filetype') " 统计非工具类的常规文件缓冲区数量 if index(g:utility_buffer_filetypes, l:ft) == -1 && l:bt != 'nofile' && l:bt != 'nowrite' && l:bt != 'quickfix' let l:regular_buf_count += 1 endif endif endfor " 无常规文件缓冲区时自动退出 if l:regular_buf_count == 0 qa endif endfunction " 绑定缓冲区删除事件触发检查 augroup AutoQuitOnOnlyUtilityBuffers autocmd! autocmd BufDelete * call s:CheckAndAutoQuit() augroup END
使用说明
- 新增工具类插件时,在对应工具缓冲区执行
set filetype?查看其filetype,添加到g:utility_buffer_filetypes列表即可完成适配 - 若需临时禁用自动退出,执行
:let g:disable_auto_quit_vim = 1即可,恢复功能将值设为0即可 - 脚本默认适配NERDTree、Tagbar、Magit等常见工具插件,可开箱即用
内容的提问来源于stack exchange,提问作者Ondolin
相关产品推荐
相关产品推荐

