From d92db1424175e255922d5b10b788b6fb85f83f7a Mon Sep 17 00:00:00 2001 From: Shougo Matsushita Date: Mon, 18 Jan 2016 12:23:18 +0900 Subject: [PATCH 1/2] completion: Avoid flicker. --- src/nvim/edit.c | 51 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/src/nvim/edit.c b/src/nvim/edit.c index d3b556f669..e51a6e9b09 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -184,6 +184,9 @@ static expand_T compl_xp; static int compl_opt_refresh_always = FALSE; +static bool compl_show_pum = true; // true: show popup menu + // false: don't show popup menu + typedef struct insert_state { VimState state; cmdarg_T *ca; @@ -2321,9 +2324,10 @@ static int ins_compl_make_cyclic(void) */ void set_completion(colnr_T startcol, list_T *list) { - /* If already doing completions stop it. */ - if (ctrl_x_mode != 0) + // If already doing completions stop it. + if (ctrl_x_mode != 0) { ins_compl_prep(' '); + } ins_compl_clear(); if (stop_arrow() == FAIL) @@ -2349,8 +2353,10 @@ void set_completion(colnr_T startcol, list_T *list) compl_started = TRUE; compl_used_match = TRUE; compl_cont_status = 0; + int save_w_wrow = curwin->w_wrow; compl_curr_match = compl_first_match; + compl_show_pum = false; if (compl_no_insert) { ins_complete(K_DOWN); } else { @@ -2359,6 +2365,13 @@ void set_completion(colnr_T startcol, list_T *list) ins_complete(Ctrl_P); } } + + // Lazily show the popup menu, unless we got interrupted. + compl_show_pum = true; + if (!compl_interrupted) { + show_pum(save_w_wrow); + } + ui_flush(); } @@ -4781,20 +4794,9 @@ static int ins_complete(int c) } } - /* Show the popup menu, unless we got interrupted. */ - if (!compl_interrupted) { - /* RedrawingDisabled may be set when invoked through complete(). */ - n = RedrawingDisabled; - RedrawingDisabled = 0; - - /* If the cursor moved we need to remove the pum first. */ - setcursor(); - if (save_w_wrow != curwin->w_wrow) - ins_compl_del_pum(); - - ins_compl_show_pum(); - setcursor(); - RedrawingDisabled = n; + // Show the popup menu, unless we got interrupted. + if (!compl_interrupted && compl_show_pum) { + show_pum(save_w_wrow); } compl_was_interrupted = compl_interrupted; compl_interrupted = FALSE; @@ -8522,3 +8524,20 @@ static char_u *do_insert_char_pre(int c) return res; } + +static void show_pum(int save_w_wrow) +{ + // RedrawingDisabled may be set when invoked through complete(). + int n = RedrawingDisabled; + RedrawingDisabled = 0; + + // If the cursor moved we need to remove the pum first. + setcursor(); + if (save_w_wrow != curwin->w_wrow) { + ins_compl_del_pum(); + } + + ins_compl_show_pum(); + setcursor(); + RedrawingDisabled = n; +} From c8b574f749adb133dbf2ef86217cbb8e6c90775e Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Sun, 21 Feb 2016 15:58:02 -0500 Subject: [PATCH 2/2] ins_complete: Avoid semi-global state. --- src/nvim/edit.c | 36 +++++++++++++++--------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/src/nvim/edit.c b/src/nvim/edit.c index e51a6e9b09..8c376c3748 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -184,9 +184,6 @@ static expand_T compl_xp; static int compl_opt_refresh_always = FALSE; -static bool compl_show_pum = true; // true: show popup menu - // false: don't show popup menu - typedef struct insert_state { VimState state; cmdarg_T *ca; @@ -1250,7 +1247,7 @@ normalchar: static void insert_do_complete(InsertState *s) { compl_busy = true; - if (ins_complete(s->c) == FAIL) { + if (ins_complete(s->c, true) == FAIL) { compl_cont_status = 0; } compl_busy = false; @@ -2356,18 +2353,16 @@ void set_completion(colnr_T startcol, list_T *list) int save_w_wrow = curwin->w_wrow; compl_curr_match = compl_first_match; - compl_show_pum = false; if (compl_no_insert) { - ins_complete(K_DOWN); + ins_complete(K_DOWN, false); } else { - ins_complete(Ctrl_N); + ins_complete(Ctrl_N, false); if (compl_no_select) { - ins_complete(Ctrl_P); + ins_complete(Ctrl_P, false); } } // Lazily show the popup menu, unless we got interrupted. - compl_show_pum = true; if (!compl_interrupted) { show_pum(save_w_wrow); } @@ -2948,18 +2943,17 @@ static void ins_compl_new_leader(void) ins_bytes(compl_leader + ins_compl_len()); compl_used_match = FALSE; - if (compl_started) + if (compl_started) { ins_compl_set_original_text(compl_leader); - else { - spell_bad_len = 0; /* need to redetect bad word */ - /* - * Matches were cleared, need to search for them now. - * Set "compl_restarting" to avoid that the first match is inserted. - */ - compl_restarting = TRUE; - if (ins_complete(Ctrl_N) == FAIL) + } else { + spell_bad_len = 0; // need to redetect bad word + // Matches were cleared, need to search for them now. + // Set "compl_restarting" to avoid that the first match is inserted. + compl_restarting = true; + if (ins_complete(Ctrl_N, true) == FAIL) { compl_cont_status = 0; - compl_restarting = FALSE; + } + compl_restarting = false; } compl_enter_selects = !compl_used_match; @@ -4311,7 +4305,7 @@ static int ins_compl_use_match(int c) * Called when character "c" was typed, which has a meaning for completion. * Returns OK if completion was done, FAIL if something failed. */ -static int ins_complete(int c) +static int ins_complete(int c, bool enable_pum) { char_u *line; int startcol = 0; /* column where searched text starts */ @@ -4795,7 +4789,7 @@ static int ins_complete(int c) } // Show the popup menu, unless we got interrupted. - if (!compl_interrupted && compl_show_pum) { + if (enable_pum && !compl_interrupted) { show_pum(save_w_wrow); } compl_was_interrupted = compl_interrupted;