删除缓冲区时,VIM能否自动关闭NERDTree?

删除缓冲区时,VIM能否自动关闭NERDTree?,vim,nerdtree,Vim,Nerdtree,问题: 在VIM中,打开NERDTree 选择一个文件并在新缓冲区中打开它(输入) 对缓冲区做一些工作并保存它 使用:bd删除缓冲区 现在NERDTree占据了整个窗口-这本身不是问题,但是 使用:bnext转到下一个缓冲区 继续工作 现在,按Ctrl-N再次尝试打开NERDTree 你看,NERDTree保持“最大化”,你必须调整它的大小 我试图解决这个问题: 我的方法如标题所述:删除缓冲区时自动关闭NERDTree,然后在输入另一个缓冲区时重新打开它 function! g:Clos

问题:

  • 在VIM中,打开NERDTree
  • 选择一个文件并在新缓冲区中打开它(输入)
  • 对缓冲区做一些工作并保存它
  • 使用:bd删除缓冲区
现在NERDTree占据了整个窗口-这本身不是问题,但是

  • 使用:bnext转到下一个缓冲区
  • 继续工作
  • 现在,按Ctrl-N再次尝试打开NERDTree
你看,NERDTree保持“最大化”,你必须调整它的大小

我试图解决这个问题:

我的方法如标题所述:删除缓冲区时自动关闭NERDTree,然后在输入另一个缓冲区时重新打开它

function! g:CloseNERDTree()
  if exists("g:NERDTree") && g:NERDTree.IsOpen()
    NERDTreeClose
  else
    echo "already closed"
  endif
endfunction
autocmd BufDelete * call CloseNERDTree()

function! g:OpenNERDTree()
  if exists("g:NERDTree") && g:NERDTree.IsOpen()
    echo "already open"
  else
    NERDTree
  endif
endfunction
autocmd BufEnter * call OpenNERDTree()

这导致VIM无法使用,我的VimScript知识不足以知道发生了什么。

我无法重现您的特定问题(对我来说,NERDTree总是在侧边栏中打开),但我认为您的方法的(或一个)问题在于
BufDelete
事件。有以下警告:

不要切换到其他缓冲区,这会导致问题

我认为最好触发,并使用可见窗口的数量(
winnr(“$”)
)进行检查,如下所示(未测试):


不是答案,但总是值得一读:
function! OnWinEnter()
    if winnr('$') == 1
        if exists("g:NERDTree") && g:NERDTree.IsOpen()
            NERDTreeClose
        endif
    else
        if ! (exists("g:NERDTree") && g:NERDTree.IsOpen())
            NERDTreeOpen
        endif
    endif
endfunction
autocmd WinEnter * call OnWinEnter()