diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/fileio.c | 47 | ||||
-rw-r--r-- | src/nvim/window.c | 19 |
2 files changed, 25 insertions, 41 deletions
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 77ddbb1eda..433c571108 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -6520,21 +6520,14 @@ bool check_nomodeline(char_u **argp) return true; } -/* - * Prepare for executing autocommands for (hidden) buffer "buf". - * Search for a visible window containing the current buffer. If there isn't - * one then use "aucmd_win". - * Set "curbuf" and "curwin" to match "buf". - */ -void -aucmd_prepbuf ( - aco_save_T *aco, /* structure to save values in */ - buf_T *buf /* new curbuf */ -) +/// Prepare for executing autocommands for (hidden) buffer "buf". +/// Search for a visible window containing the current buffer. If there isn't +/// one then use "aucmd_win". +/// Set "curbuf" and "curwin" to match "buf". +void aucmd_prepbuf(aco_save_T *aco, buf_T *buf) { - win_T *win; - int save_ea; - int save_acd; + win_T *win; + bool auwin_appended = false; /* Find a window that is for the new buffer */ if (buf == curbuf) { /* be quick when buf is curbuf */ @@ -6552,6 +6545,7 @@ aucmd_prepbuf ( /* Allocate "aucmd_win" when needed. */ if (win == NULL && aucmd_win == NULL) { win_alloc_aucmd_win(); + auwin_appended = true; } if (win == NULL && aucmd_win_used) /* Strange recursive autocommand, fall back to using the current @@ -6586,23 +6580,18 @@ aucmd_prepbuf ( aco->globaldir = globaldir; globaldir = NULL; - - /* Split the current window, put the aucmd_win in the upper half. - * We don't want the BufEnter or WinEnter autocommands. */ block_autocmds(); - make_snapshot(SNAP_AUCMD_IDX); - save_ea = p_ea; - p_ea = false; + if (!auwin_appended) { + win_append(lastwin, aucmd_win); + } - /* Prevent chdir() call in win_enter_ext(), through do_autochdir(). */ - save_acd = p_acd; + // Prevent chdir() call in win_enter_ext(), through do_autochdir() + int save_acd = p_acd; p_acd = false; - - (void)win_split_ins(0, WSP_TOP, aucmd_win, 0); - (void)win_comp_pos(); /* recompute window positions */ - p_ea = save_ea; + win_enter(aucmd_win, false); p_acd = save_acd; unblock_autocmds(); + curwin = aucmd_win; } curbuf = buf; @@ -6616,8 +6605,6 @@ aucmd_prepbuf ( /// @param aco structure holding saved values void aucmd_restbuf(aco_save_T *aco) { - int dummy; - if (aco->use_aucmd_win) { curbuf->b_nwindows--; // Find "aucmd_win", it can't be closed, but it may be in another tab page. @@ -6636,8 +6623,6 @@ void aucmd_restbuf(aco_save_T *aco) } win_found: - // Remove the window and frame from the tree of frames. - (void)winframe_remove(curwin, &dummy, NULL); win_remove(curwin, NULL); aucmd_win_used = false; last_status(false); // may need to remove last status line @@ -6647,8 +6632,6 @@ win_found: close_tabpage(curtab); } - restore_snapshot(SNAP_AUCMD_IDX, false); - (void)win_comp_pos(); // recompute window positions unblock_autocmds(); if (win_valid(aco->save_curwin)) { diff --git a/src/nvim/window.c b/src/nvim/window.c index c6270d6c76..7d6f88d469 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -2295,8 +2295,7 @@ int win_close(win_T *win, bool free_buf) EMSG(_("E813: Cannot close autocmd window")); return FAIL; } - if ((firstwin == aucmd_win || lastwin_nofloating() == aucmd_win) - && one_window()) { + if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window()) { EMSG(_("E814: Cannot close window, only autocmd window would remain")); return FAIL; } @@ -3413,16 +3412,18 @@ int win_alloc_first(void) return OK; } -/* - * Init "aucmd_win". This can only be done after the first - * window is fully initialized, thus it can't be in win_alloc_first(). - */ +// Init "aucmd_win". This can only be done after the first window +// is fully initialized, thus it can't be in win_alloc_first(). void win_alloc_aucmd_win(void) { - aucmd_win = win_alloc(NULL, TRUE); - win_init_some(aucmd_win, curwin); + Error err = ERROR_INIT; + FloatConfig fconfig = FLOAT_CONFIG_INIT; + fconfig.width = 20; + fconfig.height = 20; + fconfig.focusable = false; + aucmd_win = win_new_float(NULL, fconfig, &err); + aucmd_win->w_buffer->b_nwindows--; RESET_BINDING(aucmd_win); - new_frame(aucmd_win); } /* |