On 2023-01-28, Matt Martini wrote:
> Gary,
> 
> I (and others) are having the same issue with vim-nerdtree-tabs.
> It is fully described here: issue #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

Matt,

The solution I finally adopted was to use feedkeys(), like this.

    " Note the ending ":\<BS>".  This clears the "quit" from the command line.
    "
    autocmd BufWinEnter __Calendar
        \   augroup MyCalendar
        \ |     autocmd!
        \ |     autocmd BufEnter <buffer> if winnr("$") == 1 | call 
feedkeys(":quit\<CR>:\<BS>") | endif
        \ | augroup END

This isn't all that different from the original code that failed
after patch 9.0.907.

    autocmd BufWinEnter __Calendar
        \ autocmd BufEnter <buffer> if winnr("$")==1 | quit | endif

Sometime later, I encountered the same error while using the linediff
plugin (https://badge.fury.io/gh/andrewradev/linediff.vim).  I fixed
that one temporarily with this change, then reported it to the
author.

    diff --git a/autoload/linediff/differ.vim b/autoload/linediff/differ.vim
    index 23a69ce..023c716 100644
    --- a/autoload/linediff/differ.vim
    +++ b/autoload/linediff/differ.vim
    @@ -211,7 +211,11 @@ endfunction
     function! linediff#differ#CloseDiffBuffer(force) dict
       if bufexists(self.diff_buffer)
         let bang = a:force ? '!' : ''
    -    exe "bdelete".bang." ".self.diff_buffer
    +    " [GAJ 2022-12-19] Change direct :bdelete command to a feedkeys()
    +    " operation to work around the new behavior of patch 9.0.907 that
    +    " prohibits certain operations such as buffer deletions in autocommand
    +    " contexts.  The ":\<BS>" erases the command from the command line.
    +    call feedkeys(":bdelete".bang." ".self.diff_buffer."\<CR>:\<BS>")
       endif
     endfunction

He thought there might be a race condition (he may have actually
observed one--I forget) when using feedkeys() and preferred the
following solution.

    diff --git a/autoload/linediff/differ.vim b/autoload/linediff/differ.vim
    index 23a69ce..b9f3d12 100644
    --- a/autoload/linediff/differ.vim
    +++ b/autoload/linediff/differ.vim
    @@ -211,7 +211,16 @@ endfunction
     function! linediff#differ#CloseDiffBuffer(force) dict
       if bufexists(self.diff_buffer)
         let bang = a:force ? '!' : ''
    -    exe "bdelete".bang." ".self.diff_buffer
    +    let diff_buffer = self.diff_buffer
    +
    +    if has('patch-9.0.907')
    +      " Vim forbids closing the window inside an autocommand, so let's do 
it
    +      " afterwards.
    +      " Ref: https://github.com/AndrewRadev/linediff.vim/issues/36
    +      call timer_start(1, {-> execute('bdelete'.bang.' '.diff_buffer) })
    +    else
    +      exe 'bdelete'.bang.' '.diff_buffer
    +    endif
       endif
     endfunction

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/20230128204917.GG6446%40phoenix.

Raspunde prin e-mail lui