Eric Arnold wrote:

> I don't know if it's supported to do this, but I'm crashing VIm70g,
> WinXP by doing a "new" in a "TabEnter" autocommand.  The crash doesn't
> immediately follow the "new" command, but soon after when other
> functions start looking through the windows.

Doing ":new" in a TabEnter autocommand is nasty, but Vim should not
crash.

> I can't get a crash in a test case, but if you run the script below,
> and if you   :tabnext   5-10 times, you can see it getting real
> confused about the windows (i.e. can't   :wincmd w    to some of them,
> can't quit some of them).
> 
> I've included a gdb backtrace from Vim70g03.  It looks like the window
> list variables have been broken in eval.c.

The problem must have been caused before this, thus the backtrace
doesn't provide information about what caused it.

> P.S.  What I'm trying to do is open a window
> conditionally/automatically when entering a tab.  Is there a better
> way other than TabEnter?
> 
> 
> aug Tst_aug
>       au!
>       "au BufEnter * call Tst_BufEnter()
>       "au BufLeave * call Tst_BufLeave()
>       au WinEnter * call Tst_WinEnter()
>       "au WinLeave * call Tst_WinLeave()
>       au TabEnter * call Tst_TabEnter()
>       au TabLeave * call Tst_TabLeave()
> aug end
> 
> function! Tst_WinEnter()
>       for winnr in range(1, winnr("$"))
>               echomsg 'winnr=' . winnr
>       endfor
> endfunction
> 
> function! Tst_TabEnter()
>       echomsg 'tabenter'
>       new
> endfunction
> 
> function! Tst_TabLeave()
>       echomsg 'tableave'
> endfunction

That is a useful example.  The "gt" command shows redrawing problems.

The main problem appears to be that at the moment TabEnter is triggered
there is no valid current window.  I will have to swap entering the
window with triggering the TabEnter event.  The sequence of triggered
events is not logical then, but it's required for a valid setup for
executing the autocommands.

Index: window.c
===================================================================
RCS file: /cvsroot/vim/vim7/src/window.c,v
retrieving revision 1.51
diff -u -r1.51 window.c
--- window.c    3 May 2006 21:19:14 -0000       1.51
+++ window.c    6 May 2006 11:04:46 -0000
@@ -3425,19 +3425,22 @@
     buf_T      *old_curbuf;
 {
     int                old_off = tp->tp_firstwin->w_winrow;
+    win_T      *next_prevwin = tp->tp_prevwin;
 
     curtab = tp;
     firstwin = tp->tp_firstwin;
     lastwin = tp->tp_lastwin;
     topframe = tp->tp_topframe;
-#ifdef FEAT_AUTOCMD
-    apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
-#endif
 
+    /* We would like doing the TabEnter event first, but we don't have a
+     * valid current window yet, which may break some commands.
+     * This triggers autocommands, thus may make "tp" invalid. */
     win_enter_ext(tp->tp_curwin, FALSE, TRUE);
-    prevwin = tp->tp_prevwin;
+    prevwin = next_prevwin;
 
 #ifdef FEAT_AUTOCMD
+    apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
+
     if (old_curbuf != curbuf)
        apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
 #endif

-- 
What a wonderfully exciting cough!  Do you mind if I join you?
                -- Douglas Adams, "The Hitchhiker's Guide to the Galaxy"

 /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

Reply via email to