Skip to content

Commit f2405ed

Browse files
committed
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.
1 parent 57002ad commit f2405ed

File tree

6 files changed

+61
-16
lines changed

6 files changed

+61
-16
lines changed

src/ex_getln.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ getcmdline(
258258
return NULL; /* out of memory */
259259
ccline.cmdlen = ccline.cmdpos = 0;
260260
ccline.cmdbuff[0] = NUL;
261+
sb_text_start_cmdline();
261262

262263
/* autoindent for :insert and :append */
263264
if (firstc <= 0)
@@ -2083,6 +2084,7 @@ getcmdline(
20832084
#ifdef CURSOR_SHAPE
20842085
ui_cursor_shape(); /* may show different cursor shape */
20852086
#endif
2087+
sb_text_end_cmdline();
20862088

20872089
{
20882090
char_u *p = ccline.cmdbuff;

src/gui.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ gui_init(void)
630630
* where Vim was started. */
631631
emsg_on_display = FALSE;
632632
msg_scrolled = 0;
633-
clear_sb_text();
633+
clear_sb_text(TRUE);
634634
need_wait_return = FALSE;
635635
msg_didany = FALSE;
636636

src/message.c

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
23892389
static msgchunk_T *msg_sb_start(msgchunk_T *mps);
23902390
static 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
24482457
may_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

src/misc2.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -970,7 +970,7 @@ lalloc(long_u size, int message)
970970
break;
971971
releasing = TRUE;
972972

973-
clear_sb_text(); /* free any scrollback text */
973+
clear_sb_text(TRUE); /* free any scrollback text */
974974
try_again = mf_release_all(); /* release as many blocks as possible */
975975

976976
releasing = FALSE;
@@ -1148,7 +1148,7 @@ free_all_mem(void)
11481148
# ifdef FEAT_DIFF
11491149
diff_clear(curtab);
11501150
# endif
1151-
clear_sb_text(); /* free any scrollback text */
1151+
clear_sb_text(TRUE); /* free any scrollback text */
11521152

11531153
/* Free some global vars. */
11541154
vim_free(username);

src/proto/message.pro

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ void msg_puts_long_len_attr(char_u *longstr, int len, int attr);
5252
void msg_puts_attr(char_u *s, int attr);
5353
int message_filtered(char_u *msg);
5454
void may_clear_sb_text(void);
55-
void clear_sb_text(void);
55+
void sb_text_start_cmdline(void);
56+
void sb_text_end_cmdline(void);
57+
void clear_sb_text(int all);
5658
void show_sb_text(void);
5759
void msg_sb_eol(void);
5860
int msg_use_printf(void);

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,8 @@ static char *(features[]) =
764764

765765
static int included_patches[] =
766766
{ /* Add new patch number below this line */
767+
/**/
768+
468,
767769
/**/
768770
467,
769771
/**/

0 commit comments

Comments
 (0)