【问题标题】:Can VIM automatically close NERDTree when deleting a buffer?vim 可以在删除缓冲区时自动关闭 NERDTree 吗?
【发布时间】:2018-12-07 19:17:42
【问题描述】:

问题:

  • 在 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 知识不足以知道发生了什么。

【问题讨论】:

标签: vim nerdtree


【解决方案1】:

我无法重现您的特定问题(对我来说,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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2013-07-19
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多