diff options
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 88 |
1 files changed, 62 insertions, 26 deletions
diff --git a/src/buffer.c b/src/buffer.c index 9f29b27510..cfca9394e1 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -565,6 +565,7 @@ buf_freeall(buf, del_buf, wipe_buf) #ifdef FEAT_SYN_HL syntax_clear(buf); /* reset syntax info */ #endif + buf->b_flags &= ~BF_READERR; /* a read error is no longer relevant */ } /* @@ -670,17 +671,23 @@ goto_buffer(eap, start, dir, count) && (defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)) if (swap_exists_action == SEA_QUIT && *eap->cmd == 's') { - int old_got_int = got_int; +# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) + cleanup_T cs; - /* Quitting means closing the split window, nothing else. - * Reset got_int here, because it causes aborting() to return TRUE - * which breaks closing a window. */ - got_int = FALSE; + /* Reset the error/interrupt/exception state here so that + * aborting() returns FALSE when closing a window. */ + enter_cleanup(&cs); +# endif + /* Quitting means closing the split window, nothing else. */ win_close(curwin, TRUE); - - got_int |= old_got_int; swap_exists_action = SEA_NONE; + +# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) + /* Restore the error/interrupt/exception state if not discarded by a + * new aborting error, interrupt, or uncaught exception. */ + leave_cleanup(&cs); +# endif } else handle_swap_exists(old_curbuf); @@ -697,37 +704,58 @@ goto_buffer(eap, start, dir, count) handle_swap_exists(old_curbuf) buf_T *old_curbuf; { - int old_got_int = got_int; - - /* Reset got_int here, because it causes aborting() to return TRUE which - * breaks closing a buffer. */ - got_int = FALSE; +# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) + cleanup_T cs; +# endif if (swap_exists_action == SEA_QUIT) { +# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) + /* Reset the error/interrupt/exception state here so that + * aborting() returns FALSE when closing a buffer. */ + enter_cleanup(&cs); +# endif + /* User selected Quit at ATTENTION prompt. Go back to previous * buffer. If that buffer is gone or the same as the current one, * open a new, empty buffer. */ swap_exists_action = SEA_NONE; /* don't want it again */ close_buffer(curwin, curbuf, DOBUF_UNLOAD); if (!buf_valid(old_curbuf) || old_curbuf == curbuf) - old_curbuf = buflist_new(NULL, NULL, 1L, - BLN_CURBUF | BLN_LISTED | BLN_FORCE); + old_curbuf = buflist_new(NULL, NULL, 1L, BLN_CURBUF | BLN_LISTED); if (old_curbuf != NULL) enter_buffer(old_curbuf); /* If "old_curbuf" is NULL we are in big trouble here... */ + +# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) + /* Restore the error/interrupt/exception state if not discarded by a + * new aborting error, interrupt, or uncaught exception. */ + leave_cleanup(&cs); +# endif } else if (swap_exists_action == SEA_RECOVER) { +# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) + /* Reset the error/interrupt/exception state here so that + * aborting() returns FALSE when closing a buffer. */ + enter_cleanup(&cs); +# endif + /* User selected Recover at ATTENTION prompt. */ msg_scroll = TRUE; ml_recover(); MSG_PUTS("\n"); /* don't overwrite the last message */ cmdline_row = msg_row; do_modelines(FALSE); + +# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) + /* Restore the error/interrupt/exception state if not discarded by a + * new aborting error, interrupt, or uncaught exception. */ + leave_cleanup(&cs); +# endif } swap_exists_action = SEA_NONE; - got_int |= old_got_int; + } #endif @@ -1347,11 +1375,13 @@ enter_buffer(buf) /* Make sure the buffer is loaded. */ if (curbuf->b_ml.ml_mfp == NULL) /* need to load the file */ { +#ifdef FEAT_AUTOCMD /* If there is no filetype, allow for detecting one. Esp. useful for * ":ball" used in a autocommand. If there already is a filetype we * might prefer to keep it. */ if (*curbuf->b_p_ft == NUL) did_filetype = FALSE; +#endif open_buffer(FALSE, NULL); } @@ -1408,7 +1438,6 @@ enter_buffer(buf) * If (flags & BLN_CURBUF) is TRUE, may use current buffer. * If (flags & BLN_LISTED) is TRUE, add new buffer to buffer list. * If (flags & BLN_DUMMY) is TRUE, don't count it as a real buffer. - * If (flags & BLN_FORCE) is TRUE, don't abort on an error. * This is the ONLY way to create a new buffer. */ static int top_file_num = 1; /* highest file number */ @@ -1484,7 +1513,7 @@ buflist_new(ffname, sfname, lnum, flags) apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf); # ifdef FEAT_EVAL /* autocmds may abort script processing */ - if (!(flags & BLN_FORCE) && aborting()) + if (aborting()) return NULL; # endif #endif @@ -1538,7 +1567,7 @@ buflist_new(ffname, sfname, lnum, flags) return NULL; #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) /* autocmds may abort script processing */ - if (!(flags & BLN_FORCE) && aborting()) + if (aborting()) return NULL; #endif /* buf->b_nwindows = 0; why was this here? */ @@ -1615,7 +1644,7 @@ buflist_new(ffname, sfname, lnum, flags) apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, buf); # ifdef FEAT_EVAL /* autocmds may abort script processing */ - if (!(flags & BLN_FORCE) && aborting()) + if (aborting()) return NULL; # endif } @@ -4262,18 +4291,25 @@ ex_buffer_all(eap) #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG) if (swap_exists_action == SEA_QUIT) { - int old_got_int = got_int; +# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) + cleanup_T cs; - /* User selected Quit at ATTENTION prompt; close this window. - * Reset got_int here, because it causes aborting() to return - * TRUE which breaks closing a window. */ - got_int = FALSE; + /* Reset the error/interrupt/exception state here so that + * aborting() returns FALSE when closing a window. */ + enter_cleanup(&cs); +# endif + /* User selected Quit at ATTENTION prompt; close this window. */ win_close(curwin, TRUE); --open_wins; - - got_int |= old_got_int; swap_exists_action = SEA_NONE; + +# if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) + /* Restore the error/interrupt/exception state if not + * discarded by a new aborting error, interrupt, or uncaught + * exception. */ + leave_cleanup(&cs); +# endif } else handle_swap_exists(NULL); |