Mercurial > vim
changeset 31150:bcda71c89776 v9.0.0909
patch 9.0.0909: error message for layout change does not match action
Commit: https://github.com/vim/vim/commit/9fda81515b26ecd3c1e99f95334aaed3f7b6fea3
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Nov 19 13:14:10 2022 +0000
patch 9.0.0909: error message for layout change does not match action
Problem: Error message for layout change does not match action.
Solution: Pass the command to where the error is given. (closes https://github.com/vim/vim/issues/11573)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 19 Nov 2022 14:15:03 +0100 |
parents | b2cd9ed7d829 |
children | f1872b62216a |
files | src/ex_docmd.c src/proto/window.pro src/testdir/test_autocmd.vim src/version.c src/window.c |
diffstat | 5 files changed, 23 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -6055,7 +6055,7 @@ ex_win_close( emsg(_(e_cannot_close_autocmd_or_popup_window)); return; } - if (window_layout_locked()) + if (window_layout_locked(CMD_close)) return; need_hide = (bufIsChanged(buf) && buf->b_nwindows <= 1); @@ -6229,7 +6229,7 @@ ex_tabclose(exarg_T *eap) cmdwin_result = K_IGNORE; else if (first_tabpage->tp_next == NULL) emsg(_(e_cannot_close_last_tab_page)); - else if (!window_layout_locked()) + else if (!window_layout_locked(CMD_tabclose)) { tab_number = get_tabpage_arg(eap); if (eap->errmsg == NULL) @@ -6265,7 +6265,7 @@ ex_tabonly(exarg_T *eap) cmdwin_result = K_IGNORE; else if (first_tabpage->tp_next == NULL) msg(_("Already only one tab page")); - else if (!window_layout_locked()) + else if (!window_layout_locked(CMD_tabonly)) { tab_number = get_tabpage_arg(eap); if (eap->errmsg == NULL) @@ -6298,7 +6298,7 @@ ex_tabonly(exarg_T *eap) void tabpage_close(int forceit) { - if (window_layout_locked()) + if (window_layout_locked(CMD_tabclose)) return; // First close all the windows but the current one. If that worked then @@ -6346,7 +6346,7 @@ tabpage_close_other(tabpage_T *tp, int f static void ex_only(exarg_T *eap) { - if (window_layout_locked()) + if (window_layout_locked(CMD_only)) return; # ifdef FEAT_GUI need_mouse_correct = TRUE; @@ -6373,7 +6373,7 @@ ex_hide(exarg_T *eap UNUSED) // ":hide" or ":hide | cmd": hide current window if (!eap->skip) { - if (window_layout_locked()) + if (window_layout_locked(CMD_hide)) return; #ifdef FEAT_GUI need_mouse_correct = TRUE;
--- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -1,5 +1,5 @@ /* window.c */ -int window_layout_locked(void); +int window_layout_locked(enum CMD_index cmd); win_T *prevwin_curwin(void); void do_window(int nchar, long Prenum, int xchar); void get_wincmd_addr_type(char_u *arg, exarg_T *eap);
--- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -756,6 +756,14 @@ func Test_BufEnter() bwipe! au! BufEnter endfor + + new + new + autocmd BufEnter * ++once close + call assert_fails('close', 'E1312:') + + au! BufEnter + only endfunc " Closing a window might cause an endless loop
--- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 909, +/**/ 908, /**/ 907,
--- a/src/window.c +++ b/src/window.c @@ -111,13 +111,15 @@ window_layout_unlock(void) /* * When the window layout cannot be changed give an error and return TRUE. + * "cmd" indicates the action being performed and is used to pick the relevant + * error message. */ int -window_layout_locked(void) +window_layout_locked(enum CMD_index cmd) { if (split_disallowed > 0 || close_disallowed > 0) { - if (close_disallowed == 0) + if (close_disallowed == 0 && cmd == CMD_tabnew) emsg(_(e_cannot_split_window_when_closing_buffer)); else emsg(_(e_not_allowed_to_change_window_layout_in_this_autocmd)); @@ -2573,7 +2575,7 @@ win_close(win_T *win, int free_buf) emsg(_(e_cannot_close_last_window)); return FAIL; } - if (window_layout_locked()) + if (window_layout_locked(CMD_close)) return FAIL; if (win->w_closing || (win->w_buffer != NULL @@ -4062,7 +4064,7 @@ win_new_tabpage(int after) emsg(_(e_invalid_in_cmdline_window)); return FAIL; } - if (window_layout_locked()) + if (window_layout_locked(CMD_tabnew)) return FAIL; newtp = alloc_tabpage();