@@ -2146,8 +2146,6 @@ msg_puts_display(
21462146
21472147 inc_msg_scrolled ();
21482148 need_wait_return = TRUE; /* may need wait_return in main() */
2149- if (must_redraw < VALID )
2150- must_redraw = VALID ;
21512149 redraw_cmdline = TRUE;
21522150 if (cmdline_row > 0 && !exmode_active )
21532151 -- cmdline_row ;
@@ -2367,6 +2365,8 @@ inc_msg_scrolled(void)
23672365 }
23682366#endif
23692367 ++ msg_scrolled ;
2368+ if (must_redraw < VALID )
2369+ must_redraw = VALID ;
23702370}
23712371
23722372/*
@@ -2389,7 +2389,15 @@ static msgchunk_T *last_msgchunk = NULL; /* last displayed text */
23892389static msgchunk_T * msg_sb_start (msgchunk_T * mps );
23902390static msgchunk_T * disp_sb_line (int row , msgchunk_T * smp );
23912391
2392- static int do_clear_sb_text = FALSE; /* clear text on next msg */
2392+ typedef enum {
2393+ SB_CLEAR_NONE = 0 ,
2394+ SB_CLEAR_ALL ,
2395+ SB_CLEAR_CMDLINE_BUSY ,
2396+ SB_CLEAR_CMDLINE_DONE
2397+ } sb_clear_T ;
2398+
2399+ /* When to clear text on next msg. */
2400+ static sb_clear_T do_clear_sb_text = SB_CLEAR_NONE ;
23932401
23942402/*
23952403 * Store part of a printed message for displaying when scrolling back.
@@ -2404,10 +2412,11 @@ store_sb_text(
24042412{
24052413 msgchunk_T * mp ;
24062414
2407- if (do_clear_sb_text )
2415+ if (do_clear_sb_text == SB_CLEAR_ALL
2416+ || do_clear_sb_text == SB_CLEAR_CMDLINE_DONE )
24082417 {
2409- clear_sb_text ();
2410- do_clear_sb_text = FALSE ;
2418+ clear_sb_text (do_clear_sb_text == SB_CLEAR_ALL );
2419+ do_clear_sb_text = SB_CLEAR_NONE ;
24112420 }
24122421
24132422 if (s > * sb_str )
@@ -2447,23 +2456,53 @@ store_sb_text(
24472456 void
24482457may_clear_sb_text (void )
24492458{
2450- do_clear_sb_text = TRUE;
2459+ do_clear_sb_text = SB_CLEAR_ALL ;
2460+ }
2461+
2462+ /*
2463+ * Starting to edit the command line, do not clear messages now.
2464+ */
2465+ void
2466+ sb_text_start_cmdline (void )
2467+ {
2468+ do_clear_sb_text = SB_CLEAR_CMDLINE_BUSY ;
2469+ msg_sb_eol ();
2470+ }
2471+
2472+ /*
2473+ * Ending to edit the command line. Clear old lines but the last one later.
2474+ */
2475+ void
2476+ sb_text_end_cmdline (void )
2477+ {
2478+ do_clear_sb_text = SB_CLEAR_CMDLINE_DONE ;
24512479}
24522480
24532481/*
24542482 * Clear any text remembered for scrolling back.
2483+ * When "all" is FALSE keep the last line.
24552484 * Called when redrawing the screen.
24562485 */
24572486 void
2458- clear_sb_text (void )
2487+ clear_sb_text (int all )
24592488{
24602489 msgchunk_T * mp ;
2490+ msgchunk_T * * lastp ;
2491+
2492+ if (all )
2493+ lastp = & last_msgchunk ;
2494+ else
2495+ {
2496+ if (last_msgchunk == NULL )
2497+ return ;
2498+ lastp = & last_msgchunk -> sb_prev ;
2499+ }
24612500
2462- while (last_msgchunk != NULL )
2501+ while (* lastp != NULL )
24632502 {
2464- mp = last_msgchunk -> sb_prev ;
2465- vim_free (last_msgchunk );
2466- last_msgchunk = mp ;
2503+ mp = ( * lastp ) -> sb_prev ;
2504+ vim_free (* lastp );
2505+ * lastp = mp ;
24672506 }
24682507}
24692508
0 commit comments