changeset 8224:2baf64fead5e v7.4.1405

commit https://github.com/vim/vim/commit/8aefbe0ad5d05ee7225b20024b0f3023286ebd0f Author: Bram Moolenaar <Bram@vim.org> Date: Tue Feb 23 20:13:16 2016 +0100 patch 7.4.1405 Problem: Completion menu flickers. Solution: Delay showing the popup menu. (Shougo, Justin M. Keyes, closes https://github.com/vim/vim/issues/656)
author Christian Brabandt <cb@256bit.org>
date Tue, 23 Feb 2016 20:15:04 +0100
parents 71b4e24722b0
children 1d89a5001f9f
files src/edit.c src/version.c
diffstat 2 files changed, 37 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/edit.c
+++ b/src/edit.c
@@ -185,7 +185,8 @@ static int  ins_compl_key2dir(int c);
 static int  ins_compl_pum_key(int c);
 static int  ins_compl_key2count(int c);
 static int  ins_compl_use_match(int c);
-static int  ins_complete(int c);
+static int  ins_complete(int c, int enable_pum);
+static void show_pum(int save_w_wrow);
 static unsigned  quote_meta(char_u *dest, char_u *str, int len);
 #endif /* FEAT_INS_EXPAND */
 
@@ -1429,7 +1430,7 @@ doESCkey:
 
 docomplete:
 	    compl_busy = TRUE;
-	    if (ins_complete(c) == FAIL)
+	    if (ins_complete(c, TRUE) == FAIL)
 		compl_cont_status = 0;
 	    compl_busy = FALSE;
 	    break;
@@ -2765,6 +2766,8 @@ ins_compl_make_cyclic(void)
     void
 set_completion(colnr_T startcol, list_T *list)
 {
+    int save_w_wrow = curwin->w_wrow;
+
     /* If already doing completions stop it. */
     if (ctrl_x_mode != 0)
 	ins_compl_prep(' ');
@@ -2794,11 +2797,15 @@ set_completion(colnr_T startcol, list_T 
 
     compl_curr_match = compl_first_match;
     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. */
+    if (!compl_interrupted)
+	show_pum(save_w_wrow);
     out_flush();
 }
 
@@ -3484,7 +3491,7 @@ ins_compl_new_leader(void)
 	}
 #endif
 	compl_restarting = TRUE;
-	if (ins_complete(Ctrl_N) == FAIL)
+	if (ins_complete(Ctrl_N, TRUE) == FAIL)
 	    compl_cont_status = 0;
 	compl_restarting = FALSE;
     }
@@ -5017,7 +5024,7 @@ ins_compl_use_match(int c)
  * Returns OK if completion was done, FAIL if something failed (out of mem).
  */
     static int
-ins_complete(int c)
+ins_complete(int c, int enable_pum)
 {
     char_u	*line;
     int		startcol = 0;	    /* column where searched text starts */
@@ -5610,20 +5617,9 @@ 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;
+    if (enable_pum && !compl_interrupted)
+    {
+	show_pum(save_w_wrow);
     }
     compl_was_interrupted = compl_interrupted;
     compl_interrupted = FALSE;
@@ -5631,6 +5627,24 @@ ins_complete(int c)
     return OK;
 }
 
+    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;
+}
+
 /*
  * Looks in the first "len" chars. of "src" for search-metachars.
  * If dest is not NULL the chars. are copied there quoting (with
--- a/src/version.c
+++ b/src/version.c
@@ -749,6 +749,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1405,
+/**/
     1404,
 /**/
     1403,