在 VIM 退出时关闭所有 NERDtree 实例

Close all NERDtree instances on VIM exit

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

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_*":

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

我正在添加:

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

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

有什么建议吗?

我以前遇到过与以下组合完全相同的问题 创建(并重新进入)[neo]Vim-会话和多个 NERDTree-实例。

我的解决方案,可能不是您正在寻找的准确答案 由于稍后将解释的原因,是 首先 关闭所有 NERDTree 实例 before 创建或更新 [neo]Vim-Session 供以后使用。 到目前为止,您使用 tabdo 所做的尝试也有一些 "stages" 晚了,因为自动命令的触发事件是VimLeave

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

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

作为默认 w 中的大哥,可以轻松记住 用于保存的命令行模式(单个缓冲区)。

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

如果你坚持要使用 autocmd,我建议把这两个 上面列出的过程进入一个函数并使用 autocmd 来调用它 功能(使用 [neo]Vim 命令:调用)在 VimLeave 就像你有 之前尝试过,当然是假设您在每次退出时都不得不保存会话。我个人不赞同这一点,因为这样的例子很多 我会迅速启动 [neo]Vim 以快速记录一些无关紧要的事情 并迅速退出,这当然不需要保存会话。

旁注:autocmd 的语法:

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

因此,直接将 cmd 替换为命令,即前缀冒号 试过你原来的post是个弊端。