patch 9.1.1555: completion: repeated insertion of leader

Commit: 
https://github.com/vim/vim/commit/78b10eab6c4ce4eb6556202e940a1980a472498b
Author: Girish Palya <giris...@gmail.com>
Date:   Wed Jul 16 19:53:56 2025 +0200

    patch 9.1.1555: completion: repeated insertion of leader
    
    Problem:  completion: repeated insertion and deletion of complete
              functions
    Solution: Remove unnecessary insertion and deletion of leader text
              ('compl_orig_text') during expansion of function present in
              'complete' option (Girish Palya).
    
    closes: #17738
    
    Signed-off-by: Girish Palya <giris...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/insexpand.c b/src/insexpand.c
index e355a60fe..a5d86e1e7 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -5122,7 +5122,7 @@ strip_caret_numbers_in_place(char_u *str)
  * Call functions specified in the 'cpt' option with findstart=1,
  * and retrieve the startcol.
  */
-    static void
+    static int
 prepare_cpt_compl_funcs(void)
 {
 #ifdef FEAT_COMPL_FUNC
@@ -5134,11 +5134,10 @@ prepare_cpt_compl_funcs(void)
 
     // Make a copy of 'cpt' in case the buffer gets wiped out
     cpt = vim_strsave(curbuf->b_p_cpt);
+    if (cpt == NULL)
+       return FAIL;
     strip_caret_numbers_in_place(cpt);
 
-    // Re-insert the text removed by ins_compl_delete().
-    ins_compl_insert_bytes(compl_orig_text.string + get_compl_len(), -1);
-
     for (p = cpt; *p;)
     {
        while (*p == ',' || *p == ' ') // Skip delimiters
@@ -5166,11 +5165,10 @@ prepare_cpt_compl_funcs(void)
        idx++;
     }
 
-    // Undo insertion
-    ins_compl_delete();
-
     vim_free(cpt);
+    return OK;
 #endif
+    return FAIL;
 }
 
 /*
@@ -5179,13 +5177,13 @@ prepare_cpt_compl_funcs(void)
     static int
 advance_cpt_sources_index_safe(void)
 {
-    if (cpt_sources_index < cpt_sources_count - 1)
+    if (cpt_sources_index >= 0 && cpt_sources_index < cpt_sources_count - 1)
     {
        cpt_sources_index++;
        return OK;
     }
 #ifdef FEAT_EVAL
-    semsg(_(e_list_index_out_of_range_nr), cpt_sources_index + 1);
+    semsg(_(e_list_index_out_of_range_nr), cpt_sources_index);
 #endif
     return FAIL;
 }
@@ -5237,18 +5235,10 @@ ins_compl_get_exp(pos_T *ini)
     st.cur_match_pos = (compl_dir_forward())
                                    ? &st.last_match_pos : &st.first_match_pos;
 
-    if (ctrl_x_mode_normal() && !ctrl_x_mode_line_or_eval() &&
-           !(compl_cont_status & CONT_LOCAL))
-    {
-       // ^N completion, not ^X^L or complete() or ^X^N
-       if (!compl_started) // Before showing menu the first time
-       {
-           if (setup_cpt_sources() == FAIL)
-               return FAIL;
-       }
-       prepare_cpt_compl_funcs();
+    if (cpt_sources_array != NULL && ctrl_x_mode_normal()
+           && !ctrl_x_mode_line_or_eval()
+           && !(compl_cont_status & CONT_LOCAL))
        cpt_sources_index = 0;
-    }
 
     // For ^N/^P loop over all the flags/windows/buffers in 'complete'.
     for (;;)
@@ -6142,6 +6132,14 @@ get_normal_compl_info(char_u *line, int startcol, 
colnr_T curs_col)
        }
     }
 
+    // Call functions in 'complete' with 'findstart=1'
+    if (ctrl_x_mode_normal() && !(compl_cont_status & CONT_LOCAL))
+    {
+       // ^N completion, not complete() or ^X^N
+       if (setup_cpt_sources() == FAIL || prepare_cpt_compl_funcs() == FAIL)
+           return FAIL;
+    }
+
     return OK;
 }
 
@@ -6975,9 +6973,14 @@ setup_cpt_sources(void)
     char_u  buf[LSIZE];
     int            slen;
     int            count = 0, idx = 0;
-    char_u  *p;
+    char_u  *p, *cpt;
+
+    // Make a copy of 'cpt' in case the buffer gets wiped out
+    cpt = vim_strsave(curbuf->b_p_cpt);
+    if (cpt == NULL)
+       return FAIL;
 
-    for (p = curbuf->b_p_cpt; *p;)
+    for (p = cpt; *p;)
     {
        while (*p == ',' || *p == ' ') // Skip delimiters
            p++;
@@ -6988,7 +6991,7 @@ setup_cpt_sources(void)
        }
     }
     if (count == 0)
-       return OK;
+       goto theend;
 
     cpt_sources_clear();
     cpt_sources_count = count;
@@ -6996,10 +6999,11 @@ setup_cpt_sources(void)
     if (cpt_sources_array == NULL)
     {
        cpt_sources_count = 0;
+       vim_free(cpt);
        return FAIL;
     }
 
-    for (p = curbuf->b_p_cpt; *p;)
+    for (p = cpt; *p;)
     {
        while (*p == ',' || *p == ' ') // Skip delimiters
            p++;
@@ -7014,6 +7018,9 @@ setup_cpt_sources(void)
            idx++;
        }
     }
+
+theend:
+    vim_free(cpt);
     return OK;
 }
 
diff --git a/src/po/vim.pot b/src/po/vim.pot
index dcead5ccf..8c0848ceb 100644
--- a/src/po/vim.pot
+++ b/src/po/vim.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION
"
 "Report-Msgid-Bugs-To: 
"
-"POT-Creation-Date: 2025-07-16 18:54+0200
"
+"POT-Creation-Date: 2025-07-16 19:53+0200
"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>
"
 "Language-Team: LANGUAGE <l...@li.org>
"
@@ -1781,44 +1781,44 @@ msgstr ""
 msgid "Scanning tags."
 msgstr ""
 
-#: ../insexpand.c:5567
+#: ../insexpand.c:5557
 msgid "match in file"
 msgstr ""
 
-#: ../insexpand.c:6609
+#: ../insexpand.c:6607
 msgid " Adding"
 msgstr ""
 
-#: ../insexpand.c:6669
+#: ../insexpand.c:6667
 msgid "-- Searching..."
 msgstr ""
 
-#: ../insexpand.c:6689
+#: ../insexpand.c:6687
 msgid "Hit end of paragraph"
 msgstr ""
 
-#: ../insexpand.c:6690
+#: ../insexpand.c:6688
 msgid "Pattern not found"
 msgstr ""
 
-#: ../insexpand.c:6698
+#: ../insexpand.c:6696
 msgid "Back at original"
 msgstr ""
 
-#: ../insexpand.c:6703
+#: ../insexpand.c:6701
 msgid "Word from other line"
 msgstr ""
 
-#: ../insexpand.c:6708
+#: ../insexpand.c:6706
 msgid "The only match"
 msgstr ""
 
-#: ../insexpand.c:6729
+#: ../insexpand.c:6727
 #, c-format
 msgid "match %d of %d"
 msgstr ""
 
-#: ../insexpand.c:6733
+#: ../insexpand.c:6731
 #, c-format
 msgid "match %d"
 msgstr ""
@@ -4257,327 +4257,327 @@ msgstr ""
 msgid "%s (%s, compiled %s)"
 msgstr ""
 
-#: ../version.c:4042
+#: ../version.c:4044
 msgid ""
 "
"
 "MS-Windows ARM64 GUI/console version"
 msgstr ""
 
-#: ../version.c:4044
+#: ../version.c:4046
 msgid ""
 "
"
 "MS-Windows 64-bit GUI/console version"
 msgstr ""
 
-#: ../version.c:4047
+#: ../version.c:4049
 msgid ""
 "
"
 "MS-Windows 32-bit GUI/console version"
 msgstr ""
 
-#: ../version.c:4052
+#: ../version.c:4054
 msgid ""
 "
"
 "MS-Windows ARM64 GUI version"
 msgstr ""
 
-#: ../version.c:4054
+#: ../version.c:4056
 msgid ""
 "
"
 "MS-Windows 64-bit GUI version"
 msgstr ""
 
-#: ../version.c:4057
+#: ../version.c:4059
 msgid ""
 "
"
 "MS-Windows 32-bit GUI version"
 msgstr ""
 
-#: ../version.c:4061
+#: ../version.c:4063
 msgid " with OLE support"
 msgstr ""
 
-#: ../version.c:4066
+#: ../version.c:4068
 msgid ""
 "
"
 "MS-Windows ARM64 console version"
 msgstr ""
 
-#: ../version.c:4068
+#: ../version.c:4070
 msgid ""
 "
"
 "MS-Windows 64-bit console version"
 msgstr ""
 
-#: ../version.c:4071
+#: ../version.c:4073
 msgid ""
 "
"
 "MS-Windows 32-bit console version"
 msgstr ""
 
-#: ../version.c:4077
+#: ../version.c:4079
 msgid ""
 "
"
 "macOS version"
 msgstr ""
 
-#: ../version.c:4079
+#: ../version.c:4081
 msgid ""
 "
"
 "macOS version w/o darwin feat."
 msgstr ""
 
-#: ../version.c:4089
+#: ../version.c:4091
 msgid ""
 "
"
 "OpenVMS version"
 msgstr ""
 
-#: ../version.c:4104
+#: ../version.c:4106
 msgid ""
 "
"
 "Included patches: "
 msgstr ""
 
-#: ../version.c:4129
+#: ../version.c:4131
 msgid ""
 "
"
 "Extra patches: "
 msgstr ""
 
-#: ../version.c:4141 ../version.c:4452
+#: ../version.c:4143 ../version.c:4454
 msgid "Modified by "
 msgstr ""
 
-#: ../version.c:4148
+#: ../version.c:4150
 msgid ""
 "
"
 "Compiled "
 msgstr ""
 
-#: ../version.c:4151
+#: ../version.c:4153
 msgid "by "
 msgstr ""
 
-#: ../version.c:4163
+#: ../version.c:4165
 msgid ""
 "
"
 "Huge version "
 msgstr ""
 
-#: ../version.c:4165
+#: ../version.c:4167
 msgid ""
 "
"
 "Normal version "
 msgstr ""
 
-#: ../version.c:4167
+#: ../version.c:4169
 msgid ""
 "
"
 "Tiny version "
 msgstr ""
 
-#: ../version.c:4170
+#: ../version.c:4172
 msgid "without GUI."
 msgstr ""
 
-#: ../version.c:4173
+#: ../version.c:4175
 msgid "with GTK3 GUI."
 msgstr ""
 
-#: ../version.c:4175
+#: ../version.c:4177
 msgid "with GTK2-GNOME GUI."
 msgstr ""
 
-#: ../version.c:4177
+#: ../version.c:4179
 msgid "with GTK2 GUI."
 msgstr ""
 
-#: ../version.c:4180
+#: ../version.c:4182
 msgid "with X11-Motif GUI."
 msgstr ""
 
-#: ../version.c:4182
+#: ../version.c:4184
 msgid "with Haiku GUI."
 msgstr ""
 
-#: ../version.c:4184
+#: ../version.c:4186
 msgid "with Photon GUI."
 msgstr ""
 
-#: ../version.c:4186
+#: ../version.c:4188
 msgid "with GUI."
 msgstr ""
 
-#: ../version.c:4188
+#: ../version.c:4190
 msgid "  Features included (+) or not (-):
"
 msgstr ""
 
-#: ../version.c:4195
+#: ../version.c:4197
 msgid "   system vimrc file: \""
 msgstr ""
 
-#: ../version.c:4200
+#: ../version.c:4202
 msgid "     user vimrc file: \""
 msgstr ""
 
-#: ../version.c:4205
+#: ../version.c:4207
 msgid " 2nd user vimrc file: \""
 msgstr ""
 
-#: ../version.c:4210 ../version.c:4217 ../version.c:4221
+#: ../version.c:4212 ../version.c:4219 ../version.c:4223
 msgid " 3rd user vimrc file: \""
 msgstr ""
 
-#: ../version.c:4213
+#: ../version.c:4215
 msgid " 4th user vimrc file: \""
 msgstr ""
 
-#: ../version.c:4226
+#: ../version.c:4228
 msgid "      user exrc file: \""
 msgstr ""
 
-#: ../version.c:4231
+#: ../version.c:4233
 msgid "  2nd user exrc file: \""
 msgstr ""
 
-#: ../version.c:4237
+#: ../version.c:4239
 msgid "  system gvimrc file: \""
 msgstr ""
 
-#: ../version.c:4241
+#: ../version.c:4243
 msgid "    user gvimrc file: \""
 msgstr ""
 
-#: ../version.c:4245
+#: ../version.c:4247
 msgid "2nd user gvimrc file: \""
 msgstr ""
 
-#: ../version.c:4250
+#: ../version.c:4252
 msgid "3rd user gvimrc file: \""
 msgstr ""
 
-#: ../version.c:4255
+#: ../version.c:4257
 msgid "       defaults file: \""
 msgstr ""
 
-#: ../version.c:4260
+#: ../version.c:4262
 msgid "    system menu file: \""
 msgstr ""
 
-#: ../version.c:4268
+#: ../version.c:4270
 msgid "  fall-back for $VIM: \""
 msgstr ""
 
-#: ../version.c:4274
+#: ../version.c:4276
 msgid " f-b for $VIMRUNTIME: \""
 msgstr ""
 
-#: ../version.c:4278
+#: ../version.c:4280
 msgid "Compilation: "
 msgstr ""
 
-#: ../version.c:4284
+#: ../version.c:4286
 msgid "Compiler: "
 msgstr ""
 
-#: ../version.c:4289
+#: ../version.c:4291
 msgid "Linking: "
 msgstr ""
 
-#: ../version.c:4294
+#: ../version.c:4296
 msgid "  DEBUG BUILD"
 msgstr ""
 
-#: ../version.c:4330
+#: ../version.c:4332
 msgid "VIM - Vi IMproved"
 msgstr ""
 
-#: ../version.c:4332
+#: ../version.c:4334
 msgid "version "
 msgstr ""
 
-#: ../version.c:4333
+#: ../version.c:4335
 msgid "by Bram Moolenaar et al."
 msgstr ""
 
-#: ../version.c:4337
+#: ../version.c:4339
 msgid "Vim is open source and freely distributable"
 msgstr ""
 
-#: ../version.c:4339
+#: ../version.c:4341
 msgid "Help poor children in Uganda!"
 msgstr ""
 
-#: ../version.c:4340
+#: ../version.c:4342
 msgid "type  :help iccf<Enter>       for information "
 msgstr ""
 
-#: ../version.c:4342
+#: ../version.c:4344
 msgid "type  :q<Enter>               to exit         "
 msgstr ""
 
-#: ../version.c:4343
+#: ../version.c:4345
 msgid "type  :help<Enter>  or  <F1>  for on-line help"
 msgstr ""
 
-#: ../version.c:4344
+#: ../version.c:4346
 msgid "type  :help version9<Enter>   for version info"
 msgstr ""
 
-#: ../version.c:4347
+#: ../version.c:4349
 msgid "Running in Vi compatible mode"
 msgstr ""
 
-#: ../version.c:4348
+#: ../version.c:4350
 msgid "type  :set nocp<Enter>        for Vim defaults"
 msgstr ""
 
-#: ../version.c:4349
+#: ../version.c:4351
 msgid "type  :help cp-default<Enter> for info on this"
 msgstr ""
 
-#: ../version.c:4364
+#: ../version.c:4366
 msgid "menu  Help->Orphans           for information    "
 msgstr ""
 
-#: ../version.c:4366
+#: ../version.c:4368
 msgid "Running modeless, typed text is inserted"
 msgstr ""
 
-#: ../version.c:4367
+#: ../version.c:4369
 msgid "menu  Edit->Global Settings->Toggle Insert Mode  "
 msgstr ""
 
-#: ../version.c:4368
+#: ../version.c:4370
 msgid "                              for two modes      "
 msgstr ""
 
-#: ../version.c:4372
+#: ../version.c:4374
 msgid "menu  Edit->Global Settings->Toggle Vi Compatible"
 msgstr ""
 
-#: ../version.c:4373
+#: ../version.c:4375
 msgid "                              for Vim defaults   "
 msgstr ""
 
-#: ../version.c:4414
+#: ../version.c:4416
 msgid "Sponsor Vim development!"
 msgstr ""
 
-#: ../version.c:4415
+#: ../version.c:4417
 msgid "Become a registered Vim user!"
 msgstr ""
 
-#: ../version.c:4418
+#: ../version.c:4420
 msgid "type  :help sponsor<Enter>    for information "
 msgstr ""
 
-#: ../version.c:4419
+#: ../version.c:4421
 msgid "type  :help register<Enter>   for information "
 msgstr ""
 
-#: ../version.c:4421
+#: ../version.c:4423
 msgid "menu  Help->Sponsor/Register  for information    "
 msgstr ""
 
diff --git a/src/version.c b/src/version.c
index 3e4151b4d..31263512a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -719,6 +719,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1555,
 /**/
     1554,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1uc6QJ-009aqi-M0%40256bit.org.

Raspunde prin e-mail lui