基本上,我在启动 Vim 时.vimrc
启动TagList和 NERDTree,作为正常文件缓冲区的左侧和右侧的拆分。
我想在关闭最后一个缓冲区/选项卡时关闭 Vim,只剩下 TagList 和 NERDTree 拆分。我已经在使用vim-nerdtree-tabs,当 NERDTree 是唯一也是最后一个打开的缓冲区时,它的效果很好。
我知道 StackOverflow 上已讨论过此类主题,但我找不到与 NERDTree 和 TagList 相关的任何内容。
谢谢
基本上,我在启动 Vim 时.vimrc
启动TagList和 NERDTree,作为正常文件缓冲区的左侧和右侧的拆分。
我想在关闭最后一个缓冲区/选项卡时关闭 Vim,只剩下 TagList 和 NERDTree 拆分。我已经在使用vim-nerdtree-tabs,当 NERDTree 是唯一也是最后一个打开的缓冲区时,它的效果很好。
我知道 StackOverflow 上已讨论过此类主题,但我找不到与 NERDTree 和 TagList 相关的任何内容。
谢谢
let Tlist_Exit_OnlyWindow = 1 将关闭 Tag_list 窗口,如果它是最后一个窗口,请查看http://vim-taglist.sourceforge.net/manual.html以获取有关 Tlist_Exit_OnlyWindow 的更多信息,我不确定您是否正在寻找这个,如果不,请删除我的答案。
像......(未经测试)
fun! NoExcitingBuffersLeft()
if tabpagenr("$") == 1 && winnr("$") == 2
let window1 = bufname(winbufnr(1))
let window2 = bufname(winbufnr(2))
if (window1 == t:NERDTreeBufName || window1 == "__Tag_List__") &&
(window2 == t:NERDTreeBufName || window2 == "__Tag_List__")
quit
endif
endif
endfun
然后将该功能绑定到自动命令...
au WinEnter * call NoExcitingBuffersLeft()<cr>
我不使用这些插件中的任何一个,因此您可能需要调整t:NERDTreeBufName
and __Tag_List__
。
改进康纳的想法,我在这里做了一个功能性的解决方案。
" If only 2 windows left, NERDTree and Tag_List, close vim or current tab
fun! NoExcitingBuffersLeft()
if winnr("$") == 3
let w1 = bufname(winbufnr(1))
let w2 = bufname(winbufnr(2))
let w3 = bufname(winbufnr(3))
if (exists(":NERDTree")) && (w1 == "__Tag_List__" || w2 == "__Tag_List__" || w3 == "__Tag_List__")
if tabpagenr("$") == 1
exec 'qa'
else
exec 'tabclose'
endif
endif
endif
endfun
autocmd BufWinLeave * call NoExcitingBuffersLeft()
BufWinLeave 事件需要 vim 7.0+。如果打开了多个选项卡,则关闭选项卡,否则退出 vim。这样,当您关闭不是 NERDTree 或 Tag_List 的最后一个窗口时,自动命令将绑定到,而不是在进入两个窗口之一时绑定。
这是一个很好的可扩展解决方案。要针对其他插件/窗口类型进行验证,只需将它们添加到正则表达式检查。
function! s:CloseAddons()
for w in range(1, winnr('$'))
if bufname(winbufnr(w)) !~# '__Tagbar\|NERD_tree_\|coc-explorer'
\ && getbufvar(winbufnr(w), "&buftype") !=? "quickfix"
return
endif
endfor
if tabpagenr('$') ==? 1
execute 'quitall'
else
execute 'tabclose'
endif
endfunction