Gary,

I (and others) are having the same issue with 
*vim-nerdtree-tabs <https://github.com/jistr/vim-nerdtree-tabs>. *
It is fully described here: issue #102 
<https://github.com/jistr/vim-nerdtree-tabs/issues/102>  

There is a function that when a tab is closed, checks if the last buffer is 
NERDTree. 
and if it is it closes/quits.  

It was using similar code to yours:

if exists("t:NERDTreeBufName") && bufwinnr(t:NERDTreeBufName) != -1 && 
winnr("$") == 1 

or the variants

if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == 
"primary"):

if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree())

The code was working until 9.0.900+ (I don't know the exact patch).

Unfortunately, the vim-nerdtree-tabs plugin is no longer maintained, so we 
must find a solution on our own.

Were you able to find a workaround or another method of solving your issue?

Matt



On Wednesday, December 14, 2022 at 4:54:37 PM UTC-5 Gary Johnson wrote:

> On 2022-12-14, Bram Moolenaar wrote:
> > Gary Johnson wrote:
> > 
> > > > > I've had an autocommand in my vimrc for quite some time that
> > > > > I noticed recently was causing the following error message when
> > > > > activated:
> > > > > 
> > > > > Error detected while processing BufEnter Autocommands for 
> "<buffer=3>":
> > > > > E1312: Not allowed to change the window layout in this autocmd
> > > > > 
> > > > > I performed a git bisect on the Vim source and found that the bug
> > > > > was introduced here:
> > > > > 
> > > > > d63a85592cef0ee4f0fec5efe2f8d66b31f01f05 is the first bad commit
> > > > > commit d63a85592cef0ee4f0fec5efe2f8d66b31f01f05
> > > > > Author: Bram Moolenaar <br...@vim.org>
> > > > > Date: Sat Nov 19 11:41:30 2022 +0000
> > > > > 
> > > > > patch 9.0.0907: restoring window after WinScrolled may fail
> > > > > 
> > > > > Problem: Restoring window after WinScrolled may fail.
> > > > > Solution: Lock the window layout when triggering WinScrolled.
> > > > > 
> > > > > src/errors.h | 2 ++
> > > > > src/ex_docmd.c | 18 ++++++++++++-----
> > > > > src/proto/window.pro | 1 +
> > > > > src/version.c | 2 ++
> > > > > src/window.c | 56 
> +++++++++++++++++++++++++++++++++++++++++++++++++---
> > > > > 5 files changed, 71 insertions(+), 8 deletions(-)
> > > > > 
> > > > > This is the autocommand in my vimrc and the reason for it being
> > > > > there:
> > > > > 
> > > > > " If the Calendar window is open when the last non-Calendar
> > > > > " window is closed, Vim continues to run with the Calendar
> > > > > " window occupying the full Vim window. Fix this,
> > > > > " automatically close the Calendar window if it is the only
> > > > > " window.
> > > > > "
> > > > > autocmd BufWinEnter __Calendar
> > > > > \ autocmd BufEnter <buffer> if winnr("$")==1 | quit | endif
> > > > 
> > > > So you have a BufEnter autocommand that closes the buffer (with some
> > > > condition). The BufEnter event can be triggered in various places, 
> and
> > > > they are most likely not prepared for the buffer disappearing.
> > > 
> > > The autocommand is defined only when the buffer name is "__Calendar"
> > > and the "<buffer>" pattern is used so that that is the only buffer
> > > in which the command is triggered. The event can be triggered in
> > > only one place and that place is prepared for it.
> > 
> > That is your specific situation. Other users may have very different
> > situations. And we need to deal with all of them...
> > 
> > > > There already is quite a lot of code to handle side effects of what 
> an
> > > > autocmd may do, but it's getting very complicated. In some cases it's
> > > > better to just not allow certain actions. For a BufEnter event it 
> seems
> > > > quite natural to disallow deleting that buffer. Why would you delete 
> a
> > > > buffer you just entered?
> > > 
> > > In this case, I want to delete a buffer if it is the only buffer
> > > displayed in the tab. I never use that buffer alone, only alongside
> > > another buffer. When I close that other buffer, I want the
> > > __Calendar buffer to be deleted, too, because I'm done with it.
> > > I got tired of typing ":q<Enter>" twice, so I created the
> > > autocommand to save some typing and time, i.e., to make the scenario
> > > "just work" as Vim usually gives me the tools to do.
> > > 
> > > The BufEnter event is used because that's what happens when a window
> > > is closed: some other window is entered. And with the test for
> > > 'winnr("$")==1', it isn't closed every time it is entered, but only
> > > when it is the last open window in the tab.
> > 
> > The idea of BufEnter is that you can set some options specifically for a
> > buffer, setup mappings or insert some template text. Deleting the
> > buffer isn't really anticipated.
> > 
> > > > Since this stuff is so complicated we keep finding new problems. So
> > > > once in a while something that was allowed before is no longer 
> allowed,
> > > > because there are situations where it causes a crash.
> > > > 
> > > > The situation you describe seems quite rare, thus I think we just 
> have
> > > > to accept this no longer works. You can probably find another way.
> > > 
> > > I'll buy that the code is getting very complicated and that some use
> > > cases aren't worth supporting. It's just a shame when useful tools
> > > are prevented from working because they don't work in every case,
> > > and frustrating when things that used to work stop working.
> > 
> > At some point I thought I should drop auto commands completely, because
> > it's just getting too complicated and too many crashes have had to be
> > fixed. And there are probably a few more that we haven't found yet.
> > 
> > But users, and especialy plugin writers, depend on auto commands, and
> > there is no good replacement, thus they are still here. But let it be
> > clear that supporting auto commands is almost infeasible, thus you can
> > expect some limitations. I currently tend to prevent things from going
> > bad rather than deal with the problems caused by them. E.g. disallow
> > closing and splitting windows rather than dealing with a window
> > disappearing "under our fingers". Sometimes it's not at all clear what
> > to do then.
>
> Yes, autocommands are wonderful! There are so many situations where
> when "this" happens you want "that" to happen, too. Autocommands
> are pretty much the only hooks we have. They do so much to make Vim
> work just the way I want it. And I do appreciate that they also
> allow users to shoot themselves (ourselves) in the foot. I'm sorry
> they're a PITA for you. Thanks for maintaining them.
>
> > > I don't know what other event is triggered when a window/buffer
> > > becomes the last one open in a tab. I suppose I could try having
> > > a BufDelete or WinClosed event check whether the buffer/window being
> > > closed is the next-to-last one in a tab, and if the other buffer is
> > > __Calendar, then also close that window somehow. (I know my use of
> > > "window" and "buffer" above is a little loose.) I just hope those
> > > commands haven't required the same protections as BufEnter.
> > 
> > Whatever auto command event you use, deleting the buffer will always be
> > problematic. Maybe you find one where it works now, but after some
> > crashing bug it may stop working.
> > 
> > There is one exception: the SafeState event. It was specifically added
> > for when Vim isn't doing anythng, thus deleting the buffer then is
> > probably OK. Give it a try.
>
> Thanks for the tip. I made a note of that near the current code and
> I'll try that if what I'm doing now has problems.
>
> I found another solution using feedkeys(), which allows the :quit
> command to be executed outside of an autocommand environment.
>
> Regards,
> Gary
>
>

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/8b3e57c5-7de9-40d7-a27f-ae265f44c252n%40googlegroups.com.

Raspunde prin e-mail lui