changeset 24327:44e42eac77cb v8.2.2704

patch 8.2.2704: adding a lot of completions can be a bit slow Commit: https://github.com/vim/vim/commit/440cf096fad7bf628974abc344343b823d79a006 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Apr 3 20:13:30 2021 +0200 patch 8.2.2704: adding a lot of completions can be a bit slow Problem: Adding a lot of completions can be a bit slow. Solution: Use fast_breakcheck() instead of ui_breakcheck() when adding a list of completions. (Ben Jackson, closes #8061)
author Bram Moolenaar <Bram@vim.org>
date Sat, 03 Apr 2021 20:15:03 +0200
parents 7fb9981b8c4f
children c27c9994e3c1
files src/insexpand.c src/version.c
diffstat 2 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -118,6 +118,7 @@ struct compl_S
 # define CP_CONT_S_IPOS	    4	// use CONT_S_IPOS for compl_cont_status
 # define CP_EQUAL	    8	// ins_compl_equal() always returns TRUE
 # define CP_ICASE	    16	// ins_compl_equal() ignores case
+# define CP_FAST	    32	// use fast_breakcheck instead of ui_breakcheck
 
 static char e_hitend[] = N_("Hit end of paragraph");
 # ifdef FEAT_COMPL_FUNC
@@ -790,7 +791,7 @@ ins_compl_add_matches(
 
     for (i = 0; i < num_matches && add_r != FAIL; i++)
 	if ((add_r = ins_compl_add(matches[i], -1, NULL, NULL, NULL, dir,
-					   icase ? CP_ICASE : 0, FALSE)) == OK)
+			       CP_FAST | (icase ? CP_ICASE : 0), FALSE)) == OK)
 	    // if dir was BACKWARD then honor it just once
 	    dir = FORWARD;
     FreeWild(num_matches, matches);
@@ -1567,7 +1568,8 @@ ins_compl_bs(void)
     // Respect the 'backspace' option.
     if ((int)(p - line) - (int)compl_col < 0
 	    || ((int)(p - line) - (int)compl_col == 0
-		&& ctrl_x_mode != CTRL_X_OMNI) || ctrl_x_mode == CTRL_X_EVAL
+						 && ctrl_x_mode != CTRL_X_OMNI)
+	    || ctrl_x_mode == CTRL_X_EVAL
 	    || (!can_bs(BS_START) && (int)(p - line) - (int)compl_col
 							- compl_length < 0))
 	return K_BS;
@@ -2271,14 +2273,15 @@ theend:
  * If the given string is already in the list of completions, then return
  * NOTDONE, otherwise add it to the list and return OK.  If there is an error,
  * maybe because alloc() returns NULL, then FAIL is returned.
+ * When "fast" is TRUE use fast_breakcheck() instead of ui_breakcheck().
  */
     static int
-ins_compl_add_tv(typval_T *tv, int dir)
+ins_compl_add_tv(typval_T *tv, int dir, int fast)
 {
     char_u	*word;
     int		dup = FALSE;
     int		empty = FALSE;
-    int		flags = 0;
+    int		flags = fast ? CP_FAST : 0;
     char_u	*(cptext[CPT_COUNT]);
     typval_T	user_data;
 
@@ -2329,7 +2332,7 @@ ins_compl_add_list(list_T *list)
     CHECK_LIST_MATERIALIZE(list);
     FOR_ALL_LIST_ITEMS(list, li)
     {
-	if (ins_compl_add_tv(&li->li_tv, dir) == OK)
+	if (ins_compl_add_tv(&li->li_tv, dir, TRUE) == OK)
 	    // if dir was BACKWARD then honor it just once
 	    dir = FORWARD;
 	else if (did_emsg)
@@ -2391,7 +2394,8 @@ set_completion(colnr_T startcol, list_T 
     if (p_ic)
 	flags |= CP_ICASE;
     if (compl_orig_text == NULL || ins_compl_add(compl_orig_text,
-				  -1, NULL, NULL, NULL, 0, flags, FALSE) != OK)
+					      -1, NULL, NULL, NULL, 0,
+					      flags | CP_FAST, FALSE) != OK)
 	return;
 
     ctrl_x_mode = CTRL_X_EVAL;
@@ -2461,7 +2465,7 @@ f_complete(typval_T *argvars, typval_T *
     void
 f_complete_add(typval_T *argvars, typval_T *rettv)
 {
-    rettv->vval.v_number = ins_compl_add_tv(&argvars[0], 0);
+    rettv->vval.v_number = ins_compl_add_tv(&argvars[0], 0, FALSE);
 }
 
 /*
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2704,
+/**/
     2703,
 /**/
     2702,