edit.c: fix flicker in popup menu

This commit is contained in:
solawing 2015-05-16 16:51:37 +08:00
parent 4c960c3d78
commit b55726b350

View File

@ -2928,11 +2928,16 @@ static void ins_compl_new_leader(void)
else { else {
spell_bad_len = 0; /* need to redetect bad word */ spell_bad_len = 0; /* need to redetect bad word */
/* /*
* Matches were cleared, need to search for them now. First display * Matches were cleared, need to search for them now.
* the changed text before the cursor. Set "compl_restarting" to * If it's user complete function and refresh_always,
* avoid that the first match is inserted. * not use "compl_leader" as prefix filter.
* Set "compl_restarting" to avoid that the first match is inserted.
*/ */
update_screen(0); if ((ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OMNI)
&& compl_opt_refresh_always){
xfree(compl_leader);
compl_leader = NULL;
}
compl_restarting = TRUE; compl_restarting = TRUE;
if (ins_complete(Ctrl_N) == FAIL) if (ins_complete(Ctrl_N) == FAIL)
compl_cont_status = 0; compl_cont_status = 0;
@ -2976,11 +2981,13 @@ static void ins_compl_addleader(int c)
(*mb_char2bytes)(c, buf); (*mb_char2bytes)(c, buf);
buf[cc] = NUL; buf[cc] = NUL;
ins_char_bytes(buf, cc); ins_char_bytes(buf, cc);
if (compl_opt_refresh_always) if ((ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OMNI)
&& compl_opt_refresh_always)
AppendToRedobuff(buf); AppendToRedobuff(buf);
} else { } else {
ins_char(c); ins_char(c);
if (compl_opt_refresh_always) if ((ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OMNI)
&& compl_opt_refresh_always)
AppendCharToRedobuff(c); AppendCharToRedobuff(c);
} }
@ -2988,15 +2995,10 @@ static void ins_compl_addleader(int c)
if (ins_compl_need_restart()) if (ins_compl_need_restart())
ins_compl_restart(); ins_compl_restart();
/* When 'always' is set, don't reset compl_leader. While completing, xfree(compl_leader);
* cursor doesn't point original position, changing compl_leader would compl_leader = vim_strnsave(get_cursor_line_ptr() + compl_col,
* break redo. */ (int)(curwin->w_cursor.col - compl_col));
if (!compl_opt_refresh_always) { ins_compl_new_leader();
xfree(compl_leader);
compl_leader = vim_strnsave(get_cursor_line_ptr() + compl_col,
(int)(curwin->w_cursor.col - compl_col));
ins_compl_new_leader();
}
} }
/* /*
@ -3005,6 +3007,10 @@ static void ins_compl_addleader(int c)
*/ */
static void ins_compl_restart(void) static void ins_compl_restart(void)
{ {
/* update screen before restart.
* so if complete is blocked,
* will stay to the last popup menu and reduce flick */
update_screen(0);
ins_compl_free(); ins_compl_free();
compl_started = FALSE; compl_started = FALSE;
compl_matches = 0; compl_matches = 0;