On 02/20/2015 12:29 PM, Xavier de Gaye wrote:
> Run the following script named nwindows.vim and call Nwindows() with an
argument of 0 or 1:
> gvim -u NONE -S nwindows.vim
> :call Nwindows(1) ---> BufWinLeave events (there should be no
BufWinLeave event): 1
> :call Nwindows(0) ---> BufWinLeave events (there should be no
BufWinLeave event): 0
>
> The following patch fixes the problem by not ignoring the result of the
actions of EVENT_BUFNEW and EVENT_BUFADD autocommands in buflist_new() when called
by do_ecmd().
> This patch may have side effects, but may be useful in describing what is
causing the problem.
> The comment "/* buf->b_nwindows = 0; why was this here? */" in buffer.c is
very old ('hg blame' says before 2004).
>
> ============== nwindows.vim ==============
> " Split the window in the BufAdd event when 'autocmd_split' is true.
> function Nwindows(autocmd_split)
> augroup nwindows
> " Count the number of BufWinLeave events.
> autocmd BufWinLeave foobar let g:nwindows = g:nwindows + 1
> if a:autocmd_split
> autocmd BufAdd foobar wincmd s
> endif
> augroup END
>
> let g:nwindows = 0
> edit foobar
> if ! a:autocmd_split
> wincmd s
> endif
> edit foo
> echo "BufWinLeave events (there should be no BufWinLeave event): " .
g:nwindows
> call input("Press the <Enter> key to continue.")
> qa
> endfunction
>
> ============== patch ==============
> diff --git a/src/buffer.c b/src/buffer.c
> --- a/src/buffer.c
> +++ b/src/buffer.c
> @@ -1794,7 +1794,7 @@
> if (aborting()) /* autocmds may abort script processing */
> return NULL;
> #endif
> - /* buf->b_nwindows = 0; why was this here? */
> + buf->b_nwindows = 0;
> free_buffer_stuff(buf, FALSE); /* delete local variables et al. */
>
> /* Init the options. */
> diff --git a/src/ex_cmds.c b/src/ex_cmds.c
> --- a/src/ex_cmds.c
> +++ b/src/ex_cmds.c
> @@ -3373,10 +3373,7 @@
> if (buf == NULL)
> goto theend;
> if (buf->b_ml.ml_mfp == NULL) /* no memfile yet */
> - {
> oldbuf = FALSE;
> - buf->b_nwindows = 0;
> - }
> else /* existing memfile */
> {
> oldbuf = TRUE;
>
> ==========================================
The problem is that Vim ignores the fact that an autocommand applied by a
BufAdd event may create/use more than one window for this buffer.
And so, an application connected to Vim by netbeans cannot reliably monitor
the state of a buffer (displayed in a window, or not) through
BufWinEnter/BufWinLeave events.
Xavier
--
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.