diff --git a/src/edit.c b/src/edit.c index 686c6d429a..8dd60941a0 100644 --- a/src/edit.c +++ b/src/edit.c @@ -618,6 +618,11 @@ edit( c = hkmap(c); // Hebrew mode mapping #endif + // If the window was made so small that nothing shows, make it at least + // one line and one column when typing. + if (KeyTyped && !KeyStuffed) + win_ensure_size(); + /* * Special handling of keys while the popup menu is visible or wanted * and the cursor is still in the completed word. Only when there is diff --git a/src/normal.c b/src/normal.c index 0fbfe92076..d3c4c7875c 100644 --- a/src/normal.c +++ b/src/normal.c @@ -608,6 +608,11 @@ normal_cmd( old_mapped_len = 0; // do go to Insert mode } + // If the window was made so small that nothing shows, make it at least one + // line and one column when typing a command. + if (KeyTyped && !KeyStuffed) + win_ensure_size(); + #ifdef FEAT_CMDL_INFO need_flushbuf = add_to_showcmd(c); #endif diff --git a/src/proto/window.pro b/src/proto/window.pro index 93264e1ad2..740d310b76 100644 --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -55,6 +55,7 @@ void shell_new_columns(void); void win_size_save(garray_T *gap); void win_size_restore(garray_T *gap); int win_comp_pos(void); +void win_ensure_size(void); void win_setheight(int height); void win_setheight_win(int height, win_T *win); void win_setwidth(int width); diff --git a/src/testdir/test_window_cmd.vim b/src/testdir/test_window_cmd.vim index af7c63a19c..68c44a0c38 100644 --- a/src/testdir/test_window_cmd.vim +++ b/src/testdir/test_window_cmd.vim @@ -1358,4 +1358,38 @@ func Test_close_dest_window() %bw! endfunc +func Test_window_minimal_size() + set winminwidth=0 winminheight=0 + + " check size is fixed vertically + new + call win_execute(win_getid(2), 'wincmd _') + call assert_equal(0, winheight(0)) + call feedkeys('0', 'tx') + call assert_equal(1, winheight(0)) + bwipe! + + " check size is fixed horizontally + vert new + call win_execute(win_getid(2), 'wincmd |') + call assert_equal(0, winwidth(0)) + call feedkeys('0', 'tx') + call assert_equal(1, winwidth(0)) + bwipe! + + if has('timers') + " check size is fixed in Insert mode + new + call timer_start(100, {_ -> win_execute(win_getid(2), 'wincmd _')}) + call timer_start(200, {_ -> assert_equal(0, winheight(0))}) + call timer_start(300, {_ -> feedkeys(" \", 't!')}) + call feedkeys('a', 'tx!') + call assert_equal(1, winheight(0)) + bwipe! + endif + + set winminwidth& winminheight& +endfunc + + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index a14f9a770f..06b91839e8 100644 --- a/src/version.c +++ b/src/version.c @@ -753,6 +753,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3764, /**/ 3763, /**/ diff --git a/src/window.c b/src/window.c index 47fb815972..b54813f4ff 100644 --- a/src/window.c +++ b/src/window.c @@ -5517,6 +5517,18 @@ frame_comp_pos(frame_T *topfrp, int *row, int *col) } } +/* + * Make the current window show at least one line and one column. + */ + void +win_ensure_size() +{ + if (curwin->w_height == 0) + win_setheight(1); + if (curwin->w_width == 0) + win_setwidth(1); +} + /* * Set current window height and take care of repositioning other windows to * fit around it.