diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-03-16 19:58:25 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-03-16 19:58:25 +0100 |
commit | f2405ed2321da4a879fe0b0703af780fc0432c63 (patch) | |
tree | 0cc02db45ec63fd64c3d75e5d5ab2c2a24e51a60 | |
parent | 57002ad70c4c32f3afefec24994a974cf3eef3ad (diff) | |
download | vim-f2405ed2321da4a879fe0b0703af780fc0432c63.zip |
patch 8.0.0468: after aborting an Ex command g< does not work
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.
-rw-r--r-- | src/ex_getln.c | 2 | ||||
-rw-r--r-- | src/gui.c | 2 | ||||
-rw-r--r-- | src/message.c | 63 | ||||
-rw-r--r-- | src/misc2.c | 4 | ||||
-rw-r--r-- | src/proto/message.pro | 4 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 61 insertions, 16 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c index e96f5b899..a3cac7262 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -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; @@ -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; diff --git a/src/message.c b/src/message.c index 2f8b2fe2f..a4dd746d0 100644 --- a/src/message.c +++ b/src/message.c @@ -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; } } diff --git a/src/misc2.c b/src/misc2.c index 522fcb685..357511d0a 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -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); diff --git a/src/proto/message.pro b/src/proto/message.pro index 9a79f14a6..8d9ac71cc 100644 --- a/src/proto/message.pro +++ b/src/proto/message.pro @@ -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); diff --git a/src/version.c b/src/version.c index 9aad9b613..e235fb8d0 100644 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 468, +/**/ 467, /**/ 466, |