]> granicus.if.org Git - vim/commitdiff
patch 9.0.0115: when 'cmdheight' is zero pressing ':' may scroll a window v9.0.0115
authorBram Moolenaar <Bram@vim.org>
Sat, 30 Jul 2022 18:10:06 +0000 (19:10 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 30 Jul 2022 18:10:06 +0000 (19:10 +0100)
Problem:    When 'cmdheight' is zero pressing ':' may scroll a window.
Solution:   Add the made_cmdheight_nonzero flag and set 'scrolloff' to zero.

src/ex_getln.c
src/globals.h
src/version.c
src/window.c

index 58c83a85c7d1b6d21c84570490b54a343deeae1f..6c2a3a4b4489fedbc16caf1b7b13b46c33ed97e4 100644 (file)
@@ -1615,10 +1615,17 @@ getcmdline_int(
 
     if (cmdheight0)
     {
-       // If cmdheight is 0, cmdheight must be set to 1 when we enter command
-       // line.
+       int  save_so = lastwin->w_p_so;
+
+       // If cmdheight is 0, cmdheight must be set to 1 when we enter the
+       // command line.  Set "made_cmdheight_nonzero" and reset 'scrolloff' to
+       // avoid scrolling the last window.
+       made_cmdheight_nonzero = TRUE;
+       lastwin->w_p_so = 0;
        set_option_value((char_u *)"ch", 1L, NULL, 0);
        update_screen(VALID);                 // redraw the screen NOW
+       made_cmdheight_nonzero = FALSE;
+       lastwin->w_p_so = save_so;
     }
 
     // one recursion level deeper
@@ -2606,9 +2613,11 @@ theend:
 
        if (cmdheight0)
        {
+           made_cmdheight_nonzero = TRUE;
            set_option_value((char_u *)"ch", 0L, NULL, 0);
            // Redraw is needed for command line completion
            redraw_all_later(CLEAR);
+           made_cmdheight_nonzero = FALSE;
        }
 
        --depth;
index 786c850d3c5eef13498212e14c1acb5bd7bad30f..86472acda3597842ff3707358ada3452291a351b 100644 (file)
@@ -1728,3 +1728,6 @@ EXTERN int channel_need_redraw INIT(= FALSE);
 // While executing a regexp and set to OPTION_MAGIC_ON or OPTION_MAGIC_OFF this
 // overrules p_magic.  Otherwise set to OPTION_MAGIC_NOT_SET.
 EXTERN optmagic_T magic_overruled INIT(= OPTION_MAGIC_NOT_SET);
+
+// Set when 'cmdheight' is changed from non-zero to one temporarily.
+EXTERN int made_cmdheight_nonzero INIT(= FALSE);
index ccfc04861ca20d87220ccd37aca16727402f0e2f..796b88f0f9f5ab21a72db0476fb183ea9a9738ad 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    115,
 /**/
     114,
 /**/
index 15a4d505e4488e513748e3e34130f4de8dcbe171..e418f11598cf55d0bf5a9b5d9f33abed85c8fab2 100644 (file)
@@ -6365,7 +6365,8 @@ win_new_height(win_T *wp, int height)
 
     // There is no point in adjusting the scroll position when exiting.  Some
     // values might be invalid.
-    if (!exiting)
+    // Skip scroll_to_fraction() when 'cmdheight' was set to one from zero.
+    if (!exiting && !made_cmdheight_nonzero)
        scroll_to_fraction(wp, prev_height);
 }