首页 > 解决方案 > 在 VIM 退出时关闭所有 NERDtree 实例

问题描述

如果您在退出 VIM 时打开了任何 NERDTree 实例,那么当您再次打开会话时,您会收到许多错误:

Error detected while processing BufLeave Autocommands for "NERD_tree_*":
E121: Undefined variable: b:NERDTree
Error detected while processing WinLeave Autocommands for "NERD_tree_*":

Error detected while processing BufLeave Autocommands for "NERD_tree_*":
E121: Undefined variable: b:NERDTree
Error detected while processing WinLeave Autocommands for "NERD_tree_*":

我试图:tabdo NERDTreeClose在 vim 退出时自动执行(例如使用 qa 或 wqa 或 qa!等)

我要补充:

autocmd VimLeave * tabdo NERDTreeClose<CR>或者 autocmd VimLeave * :tabdo NERDTreeClose<CR>

最后有或没有<CR>,但我无法让它工作。

有什么建议么?

标签: vimnerdtree

解决方案


[neo]Vim我以前在创建(和重新进入)会话和多个实例的组合中遇到了完全相同的问题NERDTree

由于稍后将解释的原因,我的解决方案可能不是您正在寻找的确切答案,它是首先关闭所有NERDTree 实例,然后再创建或更新[neo]Vim-Session 以供以后使用。因此,到目前为止,您一直在尝试tabdo的几个“阶段”为时已晚,因为自动命令的触发事件是VimLeave.

我的主要建议(也是我个人的手段)是创建一个快速键绑定,它执行我上面提到的两个过程,并结合快速保存全部串行:

cnoremap W tabdo NERDTreeClose <bar> wa <bar> mksession! ~/.vim/My_Session.vim

可以轻松地记住它是w命令行模式下用于保存(单个缓冲区)的默认设置的大哥。

此方法的一个警告是,NERDTree当重新进入从上面保存的会话时,所有实例都将关闭。然而,这可以通过调用NERDTreeTogglewithVimEnter作为触发事件来解决 autocmd

如果您坚持使用autocmd此功能,我建议将上面列出的两个过程放入一个函数中,然后像您之前尝试过的那样使用autocmd来调用该函数(使用[neo]Vim命令:call) ,当然前提是您感到被迫VimLeave在每次退出期间保存会话。我个人并不赞同这一点,因为我会迅速启动[neo]Vim以快速记录无关紧要的事情并迅速退出的情况很多,这当然不需要保存会话。

作为旁注:autocmd 的语法:

:au[tocmd] [group] {event} {pat} [++once] [++nested] {cmd}

因此,cmd直接用命令替换,即您在原始帖子中尝试的前缀冒号是一种弊端。


推荐阅读