diff options
author | Bram Moolenaar <Bram@vim.org> | 2012-06-20 11:55:01 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2012-06-20 11:55:01 +0200 |
commit | 9e931224db8f8843ddc778307984dbe37ebde47c (patch) | |
tree | f0529d7858bfae7c36ac786f0c70a046bed97781 /src/buffer.c | |
parent | 36105782d2dfe526a0ca361d1c6c06e6f7a9ca6f (diff) | |
download | vim-git-9e931224db8f8843ddc778307984dbe37ebde47c.tar.gz |
updated for version 7.3.557v7.3.557
Problem: Crash when an autocommand wipes out a buffer when it is hidden.
Solution: Restore the current window when needed. (Christian Brabandt)
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/buffer.c b/src/buffer.c index e27626eb1..183429159 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1363,6 +1363,7 @@ set_curbuf(buf, action) int action; { buf_T *prevbuf; + win_T *prevwin; int unload = (action == DOBUF_UNLOAD || action == DOBUF_DEL || action == DOBUF_WIPE); @@ -1402,22 +1403,30 @@ set_curbuf(buf, action) if (buf_valid(prevbuf)) #endif { + prevwin = curwin; if (prevbuf == curbuf) u_sync(FALSE); close_buffer(prevbuf == curwin->w_buffer ? curwin : NULL, prevbuf, unload ? action : (action == DOBUF_GOTO && !P_HID(prevbuf) && !bufIsChanged(prevbuf)) ? DOBUF_UNLOAD : 0, FALSE); + if (curwin != prevwin && win_valid(prevwin)) + /* autocommands changed curwin, Grr! */ + curwin = prevwin; } } #ifdef FEAT_AUTOCMD /* An autocommand may have deleted "buf", already entered it (e.g., when - * it did ":bunload") or aborted the script processing! */ -# ifdef FEAT_EVAL - if (buf_valid(buf) && buf != curbuf && !aborting()) -# else - if (buf_valid(buf) && buf != curbuf) -# endif + * it did ":bunload") or aborted the script processing! + * If curwin->w_buffer is null, enter_buffer() will make it valid again */ + if ((buf_valid(buf) && buf != curbuf +#ifdef FEAT_EVAL + && !aborting() +#endif +#ifdef FEAT_WINDOWS + ) || curwin->w_buffer == NULL +#endif + ) #endif enter_buffer(buf); } |