forked from aniani/vim
patch 8.2.4609: :unhide does not check for failing to close a window
Problem: :unhide does not check for failing to close a window. Solution: When closing a window fails continue with the next one. Do not try closing the autocmd window. (closes #9984)
This commit is contained in:
16
src/buffer.c
16
src/buffer.c
@@ -5334,13 +5334,17 @@ ex_buffer_all(exarg_T *eap)
|
|||||||
? wp->w_height + wp->w_status_height < Rows - p_ch
|
? wp->w_height + wp->w_status_height < Rows - p_ch
|
||||||
- tabline_height()
|
- tabline_height()
|
||||||
: wp->w_width != Columns)
|
: wp->w_width != Columns)
|
||||||
|| (had_tab > 0 && wp != firstwin)) && !ONE_WINDOW
|
|| (had_tab > 0 && wp != firstwin))
|
||||||
&& !(wp->w_closing || wp->w_buffer->b_locked > 0))
|
&& !ONE_WINDOW
|
||||||
|
&& !(wp->w_closing || wp->w_buffer->b_locked > 0)
|
||||||
|
&& !win_unlisted(wp))
|
||||||
{
|
{
|
||||||
win_close(wp, FALSE);
|
if (win_close(wp, FALSE) == FAIL)
|
||||||
wpnext = firstwin; // just in case an autocommand does
|
break;
|
||||||
// something strange with windows
|
// Just in case an autocommand does something strange with
|
||||||
tpnext = first_tabpage; // start all over...
|
// windows: start all over...
|
||||||
|
wpnext = firstwin;
|
||||||
|
tpnext = first_tabpage;
|
||||||
open_wins = 0;
|
open_wins = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@@ -46,6 +46,7 @@ win_T *win_horz_neighbor(tabpage_T *tp, win_T *wp, int left, long count);
|
|||||||
void win_enter(win_T *wp, int undo_sync);
|
void win_enter(win_T *wp, int undo_sync);
|
||||||
win_T *buf_jump_open_win(buf_T *buf);
|
win_T *buf_jump_open_win(buf_T *buf);
|
||||||
win_T *buf_jump_open_tab(buf_T *buf);
|
win_T *buf_jump_open_tab(buf_T *buf);
|
||||||
|
int win_unlisted(win_T *wp);
|
||||||
void win_free_popup(win_T *win);
|
void win_free_popup(win_T *win);
|
||||||
void win_remove(win_T *wp, tabpage_T *tp);
|
void win_remove(win_T *wp, tabpage_T *tp);
|
||||||
int win_alloc_lines(win_T *wp);
|
int win_alloc_lines(win_T *wp);
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
source shared.vim
|
source shared.vim
|
||||||
source check.vim
|
source check.vim
|
||||||
source term_util.vim
|
source term_util.vim
|
||||||
|
import './vim9.vim' as v9
|
||||||
|
|
||||||
func s:cleanup_buffers() abort
|
func s:cleanup_buffers() abort
|
||||||
for bnr in range(1, bufnr('$'))
|
for bnr in range(1, bufnr('$'))
|
||||||
@@ -2975,4 +2976,18 @@ func Test_Changed_ChangedI()
|
|||||||
bw!
|
bw!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_closing_autocmd_window()
|
||||||
|
let lines =<< trim END
|
||||||
|
edit Xa.txt
|
||||||
|
tabnew Xb.txt
|
||||||
|
autocmd BufEnter Xa.txt unhide 1
|
||||||
|
doautoall BufEnter
|
||||||
|
END
|
||||||
|
call v9.CheckScriptFailure(lines, 'E814:')
|
||||||
|
au! BufEnter
|
||||||
|
only!
|
||||||
|
bwipe Xa.txt
|
||||||
|
bwipe Xb.txt
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
4609,
|
||||||
/**/
|
/**/
|
||||||
4608,
|
4608,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -43,7 +43,6 @@ static int frame_minheight(frame_T *topfrp, win_T *next_curwin);
|
|||||||
static int may_open_tabpage(void);
|
static int may_open_tabpage(void);
|
||||||
static int win_enter_ext(win_T *wp, int flags);
|
static int win_enter_ext(win_T *wp, int flags);
|
||||||
static void win_free(win_T *wp, tabpage_T *tp);
|
static void win_free(win_T *wp, tabpage_T *tp);
|
||||||
static int win_unlisted(win_T *wp);
|
|
||||||
static void win_append(win_T *after, win_T *wp);
|
static void win_append(win_T *after, win_T *wp);
|
||||||
static void frame_append(frame_T *after, frame_T *frp);
|
static void frame_append(frame_T *after, frame_T *frp);
|
||||||
static void frame_insert(frame_T *before, frame_T *frp);
|
static void frame_insert(frame_T *before, frame_T *frp);
|
||||||
@@ -5233,7 +5232,7 @@ win_free(
|
|||||||
* Return TRUE if "wp" is not in the list of windows: the autocmd window or a
|
* Return TRUE if "wp" is not in the list of windows: the autocmd window or a
|
||||||
* popup window.
|
* popup window.
|
||||||
*/
|
*/
|
||||||
static int
|
int
|
||||||
win_unlisted(win_T *wp)
|
win_unlisted(win_T *wp)
|
||||||
{
|
{
|
||||||
return wp == aucmd_win || WIN_IS_POPUP(wp);
|
return wp == aucmd_win || WIN_IS_POPUP(wp);
|
||||||
|
Reference in New Issue
Block a user