如果NERDTree是最后且唯一的缓冲区,自动退出vim

61

我在我的 .vimrc 文件中有以下内容:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Open NERDTree by default
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
autocmd VimEnter * NERDTree
autocmd VimEnter * wincmd p
所以,
% vim file.txt

打开NERDTree并将光标聚焦在file.txt缓冲区中。我做完编辑后,在缓冲区上按:q,但是剩下的只有……NERDTree。这很烦人。

我可以使用:qa关闭所有缓冲区,并退出vim,但我习惯于使用:q。所以我想知道是否有一种方法可以检测到仅剩的缓冲区是NERDTree,并且将两个缓冲区“合并”,以便进行:q操作。

编辑

求之必得:https://github.com/scrooloose/nerdtree/issues#issue/21


正确的URL是https://github.com/preservim/nerdtree/issues/21。 - armin
5个回答

112

在NERDTree的问题列表中发布了一个执行此操作的脚本。请查看GitHub上的issue-21以获取NERDTree。

这导致您的vimrc中的单行命令在这里:

autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

谢谢,那个脚本正是我在寻找的。你可能应该得到奖励,但唉,现在已经太晚了……你只能用一个赞来作补偿。 - user67416
这意味着你现在不能做 vim . 了,有点烦人(现在只是立即退出)。 - alex
8
在Fedora上使用Vim版本8.0.562时,这个答案对我不再有效。但是scrooloose的较早的答案仍然有效: autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif - MrD
在我的Mac OS X High Sierra(10.13.3 - 17D47)上运行良好,谢谢!vim --version: VIM - Vi改进版8.0(2016年9月12日,编译于2017年7月26日19:10:24) 包含的补丁程序:1-503,505-642 - herrera
我从2018年开始使用它,但大约一年前它就停止工作了。不确定出了什么问题;由于vimscript已经更新,可能需要进行更新。 - stucash

15
function! s:CloseIfOnlyControlWinLeft()
  if winnr("$") != 1
    return
  endif
  if (exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1)
        \ || &buftype == 'quickfix'
    q
  endif
endfunction
augroup CloseIfOnlyControlWinLeft
  au!
  au BufEnter * call s:CloseIfOnlyControlWinLeft()
augroup END

从我的vimrc中,基于来自janus repo的一个版本。
增强功能:如果只剩下一个快速修复窗口,则也关闭它。它使用BufEnter自动命令,这是&bt正常工作所必需的。

1
需要实现的想法:
你可以编写一个函数,当调用时,检查仅剩的缓冲区(或者如果你喜欢,只有非帮助缓冲区)是否是 NERDTree 缓冲区,如果是,则删除它(或者只是退出)。
然后,每当删除/隐藏缓冲区或者当你使用 :q 命令时(我很抱歉我不太确定实际发生了什么),就让 autocmd 运行它。

太好了!我看到你提供的链接指向了你的答案 - 非常棒。 (为了明确起见,那个答案是在本回答发布13个月后时间戳的,而我在四年半前 SO 上第一次发布问题的 17 分钟后发布了这个答案,所以我会将此答案视为历史记录的一部分并保留在这里。) - Michał Marczyk

0
你可以使用:cabbrv q qa,但我建议不要这样做,因为当你真正想要q时,你会忘记它。

0
我喜欢这样做:cmap bq :bufdo q<CR>,在命令模式下只需两个按键就可以关闭所有缓冲区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接