如果 NERDTree 和 TagList 是最后也是唯一的缓冲区,则自动退出 Vim

Posted

技术标签:

【中文标题】如果 NERDTree 和 TagList 是最后也是唯一的缓冲区,则自动退出 Vim【英文标题】:Automatically quit Vim if NERDTree and TagList are the last and only buffers 【发布时间】:2012-07-26 15:25:00 【问题描述】:

基本上,我的.vimrc 在启动 Vim 时启动 TagList 和 NERDTree,作为正常文件缓冲区的左侧和右侧的拆分。

我想在关闭最后一个缓冲区/选项卡时关闭 Vim,只剩下 TagList 和 NERDTree 拆分。我已经在使用vim-nerdtree-tabs,当 NERDTree 是唯一也是最后一个打开的缓冲区时,它的效果很好。

我知道 *** 上已讨论过此类主题,但我找不到与 NERDTree 和 TagList 相关的任何内容。

谢谢

【问题讨论】:

【参考方案1】:

让 Tlist_Exit_OnlyWindow = 1 如果是最后一个窗口,将关闭 Tag_list 窗口,请查看 http://vim-taglist.sourceforge.net/manual.html 了解有关 Tlist_Exit_OnlyWindow 的更多信息,我不确定您是否正在寻找这个,如果没有,请删除我的答案。

【讨论】:

【参考方案2】:

类似...(未经测试)

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__Tag_List__

【讨论】:

几个月后,这对我很有用:-)(顺便说一句,__Tag_List__ 是正确的,没有检查 NERDTree) @FlorianMargaine 很高兴它有帮助!【参考方案3】:

改进康纳的想法,我在这里做了一个功能性的解决方案。

" 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 的最后一个窗口时,自动命令将绑定到,而不是在进入两个窗口之一时绑定。

【讨论】:

【参考方案4】:

这是一个很好的可扩展解决方案。要针对其他插件/窗口类型进行验证,只需将它们添加到正则表达式检查中。

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

【讨论】:

以上是关于如果 NERDTree 和 TagList 是最后也是唯一的缓冲区,则自动退出 Vim的主要内容,如果未能解决你的问题,请参考以下文章

vim:如何在一个垂直分屏上设置 taglist 和 nerdtree

在“Cmder”控制台模拟器中找不到 VIM TagList 和 NERDTree 命令

将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)(转)

使Nerdtree在打开的文件上使用Choosewin

taglist 和局部变量

vim插件的社区活跃度怎么样