]> granicus.if.org Git - vim/commitdiff
patch 8.0.0468: after aborting an Ex command g< does not work v8.0.0468
authorBram Moolenaar <Bram@vim.org>
Thu, 16 Mar 2017 18:58:25 +0000 (19:58 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 16 Mar 2017 18:58:25 +0000 (19:58 +0100)
Problem:    After aborting an Ex command g< does not work. (Marcin
            Szamotulski)
Solution:   Postpone clearing scrollback messages to until the command line
            has been entered.  Also fix that the screen isn't redrawn if after
            g< the command line is cancelled.

src/ex_getln.c
src/gui.c
src/message.c
src/misc2.c
src/proto/message.pro
src/version.c

index e96f5b8991bd1546dc0ecfa079b80ea0869cefc2..a3cac7262357415ba2ecd6ae76270f9325a3c667 100644 (file)
@@ -258,6 +258,7 @@ getcmdline(
        return NULL;                        /* out of memory */
     ccline.cmdlen = ccline.cmdpos = 0;
     ccline.cmdbuff[0] = NUL;
+    sb_text_start_cmdline();
 
     /* autoindent for :insert and :append */
     if (firstc <= 0)
@@ -2083,6 +2084,7 @@ returncmd:
 #ifdef CURSOR_SHAPE
     ui_cursor_shape();         /* may show different cursor shape */
 #endif
+    sb_text_end_cmdline();
 
     {
        char_u *p = ccline.cmdbuff;
index a4853dce888c1fbf2ccdc624101056f6a85ab13e..7d44db1df9df4343f74761b44c60105b5d779053 100644 (file)
--- a/src/gui.c
+++ b/src/gui.c
@@ -630,7 +630,7 @@ gui_init(void)
      * where Vim was started. */
     emsg_on_display = FALSE;
     msg_scrolled = 0;
-    clear_sb_text();
+    clear_sb_text(TRUE);
     need_wait_return = FALSE;
     msg_didany = FALSE;
 
index 2f8b2fe2f816b52d69b5666ceb1b7b836abe3c7c..a4dd746d0a54f8d8422203b17edc3d61005cdf89 100644 (file)
@@ -2146,8 +2146,6 @@ msg_puts_display(
 
            inc_msg_scrolled();
            need_wait_return = TRUE; /* may need wait_return in main() */
-           if (must_redraw < VALID)
-               must_redraw = VALID;
            redraw_cmdline = TRUE;
            if (cmdline_row > 0 && !exmode_active)
                --cmdline_row;
@@ -2367,6 +2365,8 @@ inc_msg_scrolled(void)
     }
 #endif
     ++msg_scrolled;
+    if (must_redraw < VALID)
+       must_redraw = VALID;
 }
 
 /*
@@ -2389,7 +2389,15 @@ static msgchunk_T *last_msgchunk = NULL; /* last displayed text */
 static msgchunk_T *msg_sb_start(msgchunk_T *mps);
 static msgchunk_T *disp_sb_line(int row, msgchunk_T *smp);
 
-static int do_clear_sb_text = FALSE;   /* clear text on next msg */
+typedef enum {
+    SB_CLEAR_NONE = 0,
+    SB_CLEAR_ALL,
+    SB_CLEAR_CMDLINE_BUSY,
+    SB_CLEAR_CMDLINE_DONE
+} sb_clear_T;
+
+/* When to clear text on next msg. */
+static sb_clear_T do_clear_sb_text = SB_CLEAR_NONE;
 
 /*
  * Store part of a printed message for displaying when scrolling back.
@@ -2404,10 +2412,11 @@ store_sb_text(
 {
     msgchunk_T *mp;
 
-    if (do_clear_sb_text)
+    if (do_clear_sb_text == SB_CLEAR_ALL
+           || do_clear_sb_text == SB_CLEAR_CMDLINE_DONE)
     {
-       clear_sb_text();
-       do_clear_sb_text = FALSE;
+       clear_sb_text(do_clear_sb_text == SB_CLEAR_ALL);
+       do_clear_sb_text = SB_CLEAR_NONE;
     }
 
     if (s > *sb_str)
@@ -2447,23 +2456,53 @@ store_sb_text(
     void
 may_clear_sb_text(void)
 {
-    do_clear_sb_text = TRUE;
+    do_clear_sb_text = SB_CLEAR_ALL;
+}
+
+/*
+ * Starting to edit the command line, do not clear messages now.
+ */
+    void
+sb_text_start_cmdline(void)
+{
+    do_clear_sb_text = SB_CLEAR_CMDLINE_BUSY;
+    msg_sb_eol();
+}
+
+/*
+ * Ending to edit the command line.  Clear old lines but the last one later.
+ */
+    void
+sb_text_end_cmdline(void)
+{
+    do_clear_sb_text = SB_CLEAR_CMDLINE_DONE;
 }
 
 /*
  * Clear any text remembered for scrolling back.
+ * When "all" is FALSE keep the last line.
  * Called when redrawing the screen.
  */
     void
-clear_sb_text(void)
+clear_sb_text(int all)
 {
     msgchunk_T *mp;
+    msgchunk_T **lastp;
+
+    if (all)
+       lastp = &last_msgchunk;
+    else
+    {
+       if (last_msgchunk == NULL)
+           return;
+       lastp = &last_msgchunk->sb_prev;
+    }
 
-    while (last_msgchunk != NULL)
+    while (*lastp != NULL)
     {
-       mp = last_msgchunk->sb_prev;
-       vim_free(last_msgchunk);
-       last_msgchunk = mp;
+       mp = (*lastp)->sb_prev;
+       vim_free(*lastp);
+       *lastp = mp;
     }
 }
 
index 522fcb685cd8e1cbe394fff6fde881c70a89ddf4..357511d0a2e38bb4f2226e3c5b36ef07605186cf 100644 (file)
@@ -970,7 +970,7 @@ lalloc(long_u size, int message)
            break;
        releasing = TRUE;
 
-       clear_sb_text();              /* free any scrollback text */
+       clear_sb_text(TRUE);          /* free any scrollback text */
        try_again = mf_release_all(); /* release as many blocks as possible */
 
        releasing = FALSE;
@@ -1148,7 +1148,7 @@ free_all_mem(void)
 # ifdef FEAT_DIFF
     diff_clear(curtab);
 # endif
-    clear_sb_text();         /* free any scrollback text */
+    clear_sb_text(TRUE);             /* free any scrollback text */
 
     /* Free some global vars. */
     vim_free(username);
index 9a79f14a6061b138e2e04af2f5b7d11da2e6f042..8d9ac71ccee1944108ff5186081c52cfcf05d5b1 100644 (file)
@@ -52,7 +52,9 @@ void msg_puts_long_len_attr(char_u *longstr, int len, int attr);
 void msg_puts_attr(char_u *s, int attr);
 int message_filtered(char_u *msg);
 void may_clear_sb_text(void);
-void clear_sb_text(void);
+void sb_text_start_cmdline(void);
+void sb_text_end_cmdline(void);
+void clear_sb_text(int all);
 void show_sb_text(void);
 void msg_sb_eol(void);
 int msg_use_printf(void);
index 9aad9b613330af5654928b05332fc8619507f0c1..e235fb8d09f571d0508246fb2b5a85e5dcc86bb3 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    468,
 /**/
     467,
 /**/