删除缓冲区时,VIM可以自动关闭NERDTree吗?

时间:2018-12-07 19:17:43

标签: vim nerdtree

问题:

  • 在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知识不足以了解正在发生的事情。

1 个答案:

答案 0 :(得分:0)

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

  

请勿更改为其他缓冲区,否则会引起问题。

我认为最好在WinEnter上触发,并使用可见窗口的数量(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()