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 <girishji@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Girish Palya
2025-07-16 19:53:56 +02:00
committed by Christian Brabandt
parent e4fdb1e4e7
commit 78b10eab6c
3 changed files with 124 additions and 115 deletions

View File

@ -5122,7 +5122,7 @@ strip_caret_numbers_in_place(char_u *str)
* Call functions specified in the 'cpt' option with findstart=1, * Call functions specified in the 'cpt' option with findstart=1,
* and retrieve the startcol. * and retrieve the startcol.
*/ */
static void static int
prepare_cpt_compl_funcs(void) prepare_cpt_compl_funcs(void)
{ {
#ifdef FEAT_COMPL_FUNC #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 // Make a copy of 'cpt' in case the buffer gets wiped out
cpt = vim_strsave(curbuf->b_p_cpt); cpt = vim_strsave(curbuf->b_p_cpt);
if (cpt == NULL)
return FAIL;
strip_caret_numbers_in_place(cpt); 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;) for (p = cpt; *p;)
{ {
while (*p == ',' || *p == ' ') // Skip delimiters while (*p == ',' || *p == ' ') // Skip delimiters
@ -5166,11 +5165,10 @@ prepare_cpt_compl_funcs(void)
idx++; idx++;
} }
// Undo insertion
ins_compl_delete();
vim_free(cpt); vim_free(cpt);
return OK;
#endif #endif
return FAIL;
} }
/* /*
@ -5179,13 +5177,13 @@ prepare_cpt_compl_funcs(void)
static int static int
advance_cpt_sources_index_safe(void) 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++; cpt_sources_index++;
return OK; return OK;
} }
#ifdef FEAT_EVAL #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 #endif
return FAIL; return FAIL;
} }
@ -5237,18 +5235,10 @@ ins_compl_get_exp(pos_T *ini)
st.cur_match_pos = (compl_dir_forward()) st.cur_match_pos = (compl_dir_forward())
? &st.last_match_pos : &st.first_match_pos; ? &st.last_match_pos : &st.first_match_pos;
if (ctrl_x_mode_normal() && !ctrl_x_mode_line_or_eval() && if (cpt_sources_array != NULL && ctrl_x_mode_normal()
!(compl_cont_status & CONT_LOCAL)) && !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();
cpt_sources_index = 0; cpt_sources_index = 0;
}
// For ^N/^P loop over all the flags/windows/buffers in 'complete'. // For ^N/^P loop over all the flags/windows/buffers in 'complete'.
for (;;) 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; return OK;
} }
@ -6975,9 +6973,14 @@ setup_cpt_sources(void)
char_u buf[LSIZE]; char_u buf[LSIZE];
int slen; int slen;
int count = 0, idx = 0; int count = 0, idx = 0;
char_u *p; char_u *p, *cpt;
for (p = curbuf->b_p_cpt; *p;) // 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 = cpt; *p;)
{ {
while (*p == ',' || *p == ' ') // Skip delimiters while (*p == ',' || *p == ' ') // Skip delimiters
p++; p++;
@ -6988,7 +6991,7 @@ setup_cpt_sources(void)
} }
} }
if (count == 0) if (count == 0)
return OK; goto theend;
cpt_sources_clear(); cpt_sources_clear();
cpt_sources_count = count; cpt_sources_count = count;
@ -6996,10 +6999,11 @@ setup_cpt_sources(void)
if (cpt_sources_array == NULL) if (cpt_sources_array == NULL)
{ {
cpt_sources_count = 0; cpt_sources_count = 0;
vim_free(cpt);
return FAIL; return FAIL;
} }
for (p = curbuf->b_p_cpt; *p;) for (p = cpt; *p;)
{ {
while (*p == ',' || *p == ' ') // Skip delimiters while (*p == ',' || *p == ' ') // Skip delimiters
p++; p++;
@ -7014,6 +7018,9 @@ setup_cpt_sources(void)
idx++; idx++;
} }
} }
theend:
vim_free(cpt);
return OK; return OK;
} }

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-16 18:54+0200\n" "POT-Creation-Date: 2025-07-16 19:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -1781,44 +1781,44 @@ msgstr ""
msgid "Scanning tags." msgid "Scanning tags."
msgstr "" msgstr ""
#: ../insexpand.c:5567 #: ../insexpand.c:5557
msgid "match in file" msgid "match in file"
msgstr "" msgstr ""
#: ../insexpand.c:6609 #: ../insexpand.c:6607
msgid " Adding" msgid " Adding"
msgstr "" msgstr ""
#: ../insexpand.c:6669 #: ../insexpand.c:6667
msgid "-- Searching..." msgid "-- Searching..."
msgstr "" msgstr ""
#: ../insexpand.c:6689 #: ../insexpand.c:6687
msgid "Hit end of paragraph" msgid "Hit end of paragraph"
msgstr "" msgstr ""
#: ../insexpand.c:6690 #: ../insexpand.c:6688
msgid "Pattern not found" msgid "Pattern not found"
msgstr "" msgstr ""
#: ../insexpand.c:6698 #: ../insexpand.c:6696
msgid "Back at original" msgid "Back at original"
msgstr "" msgstr ""
#: ../insexpand.c:6703 #: ../insexpand.c:6701
msgid "Word from other line" msgid "Word from other line"
msgstr "" msgstr ""
#: ../insexpand.c:6708 #: ../insexpand.c:6706
msgid "The only match" msgid "The only match"
msgstr "" msgstr ""
#: ../insexpand.c:6729 #: ../insexpand.c:6727
#, c-format #, c-format
msgid "match %d of %d" msgid "match %d of %d"
msgstr "" msgstr ""
#: ../insexpand.c:6733 #: ../insexpand.c:6731
#, c-format #, c-format
msgid "match %d" msgid "match %d"
msgstr "" msgstr ""
@ -4257,327 +4257,327 @@ msgstr ""
msgid "%s (%s, compiled %s)" msgid "%s (%s, compiled %s)"
msgstr "" msgstr ""
#: ../version.c:4042 #: ../version.c:4044
msgid "" msgid ""
"\n" "\n"
"MS-Windows ARM64 GUI/console version" "MS-Windows ARM64 GUI/console version"
msgstr "" msgstr ""
#: ../version.c:4044 #: ../version.c:4046
msgid "" msgid ""
"\n" "\n"
"MS-Windows 64-bit GUI/console version" "MS-Windows 64-bit GUI/console version"
msgstr "" msgstr ""
#: ../version.c:4047 #: ../version.c:4049
msgid "" msgid ""
"\n" "\n"
"MS-Windows 32-bit GUI/console version" "MS-Windows 32-bit GUI/console version"
msgstr "" msgstr ""
#: ../version.c:4052 #: ../version.c:4054
msgid "" msgid ""
"\n" "\n"
"MS-Windows ARM64 GUI version" "MS-Windows ARM64 GUI version"
msgstr "" msgstr ""
#: ../version.c:4054 #: ../version.c:4056
msgid "" msgid ""
"\n" "\n"
"MS-Windows 64-bit GUI version" "MS-Windows 64-bit GUI version"
msgstr "" msgstr ""
#: ../version.c:4057 #: ../version.c:4059
msgid "" msgid ""
"\n" "\n"
"MS-Windows 32-bit GUI version" "MS-Windows 32-bit GUI version"
msgstr "" msgstr ""
#: ../version.c:4061 #: ../version.c:4063
msgid " with OLE support" msgid " with OLE support"
msgstr "" msgstr ""
#: ../version.c:4066
msgid ""
"\n"
"MS-Windows ARM64 console version"
msgstr ""
#: ../version.c:4068 #: ../version.c:4068
msgid "" msgid ""
"\n" "\n"
"MS-Windows ARM64 console version"
msgstr ""
#: ../version.c:4070
msgid ""
"\n"
"MS-Windows 64-bit console version" "MS-Windows 64-bit console version"
msgstr "" msgstr ""
#: ../version.c:4071 #: ../version.c:4073
msgid "" msgid ""
"\n" "\n"
"MS-Windows 32-bit console version" "MS-Windows 32-bit console version"
msgstr "" msgstr ""
#: ../version.c:4077 #: ../version.c:4079
msgid "" msgid ""
"\n" "\n"
"macOS version" "macOS version"
msgstr "" msgstr ""
#: ../version.c:4079 #: ../version.c:4081
msgid "" msgid ""
"\n" "\n"
"macOS version w/o darwin feat." "macOS version w/o darwin feat."
msgstr "" msgstr ""
#: ../version.c:4089 #: ../version.c:4091
msgid "" msgid ""
"\n" "\n"
"OpenVMS version" "OpenVMS version"
msgstr "" msgstr ""
#: ../version.c:4104 #: ../version.c:4106
msgid "" msgid ""
"\n" "\n"
"Included patches: " "Included patches: "
msgstr "" msgstr ""
#: ../version.c:4129 #: ../version.c:4131
msgid "" msgid ""
"\n" "\n"
"Extra patches: " "Extra patches: "
msgstr "" msgstr ""
#: ../version.c:4141 ../version.c:4452 #: ../version.c:4143 ../version.c:4454
msgid "Modified by " msgid "Modified by "
msgstr "" msgstr ""
#: ../version.c:4148 #: ../version.c:4150
msgid "" msgid ""
"\n" "\n"
"Compiled " "Compiled "
msgstr "" msgstr ""
#: ../version.c:4151 #: ../version.c:4153
msgid "by " msgid "by "
msgstr "" msgstr ""
#: ../version.c:4163
msgid ""
"\n"
"Huge version "
msgstr ""
#: ../version.c:4165 #: ../version.c:4165
msgid "" msgid ""
"\n" "\n"
"Normal version " "Huge version "
msgstr "" msgstr ""
#: ../version.c:4167 #: ../version.c:4167
msgid "" msgid ""
"\n" "\n"
"Normal version "
msgstr ""
#: ../version.c:4169
msgid ""
"\n"
"Tiny version " "Tiny version "
msgstr "" msgstr ""
#: ../version.c:4170 #: ../version.c:4172
msgid "without GUI." msgid "without GUI."
msgstr "" msgstr ""
#: ../version.c:4173 #: ../version.c:4175
msgid "with GTK3 GUI." msgid "with GTK3 GUI."
msgstr "" msgstr ""
#: ../version.c:4175 #: ../version.c:4177
msgid "with GTK2-GNOME GUI." msgid "with GTK2-GNOME GUI."
msgstr "" msgstr ""
#: ../version.c:4177 #: ../version.c:4179
msgid "with GTK2 GUI." msgid "with GTK2 GUI."
msgstr "" msgstr ""
#: ../version.c:4180 #: ../version.c:4182
msgid "with X11-Motif GUI." msgid "with X11-Motif GUI."
msgstr "" msgstr ""
#: ../version.c:4182 #: ../version.c:4184
msgid "with Haiku GUI." msgid "with Haiku GUI."
msgstr "" msgstr ""
#: ../version.c:4184 #: ../version.c:4186
msgid "with Photon GUI." msgid "with Photon GUI."
msgstr "" msgstr ""
#: ../version.c:4186 #: ../version.c:4188
msgid "with GUI." msgid "with GUI."
msgstr "" msgstr ""
#: ../version.c:4188 #: ../version.c:4190
msgid " Features included (+) or not (-):\n" msgid " Features included (+) or not (-):\n"
msgstr "" msgstr ""
#: ../version.c:4195 #: ../version.c:4197
msgid " system vimrc file: \"" msgid " system vimrc file: \""
msgstr "" msgstr ""
#: ../version.c:4200 #: ../version.c:4202
msgid " user vimrc file: \"" msgid " user vimrc file: \""
msgstr "" msgstr ""
#: ../version.c:4205 #: ../version.c:4207
msgid " 2nd user vimrc file: \"" msgid " 2nd user vimrc file: \""
msgstr "" msgstr ""
#: ../version.c:4210 ../version.c:4217 ../version.c:4221 #: ../version.c:4212 ../version.c:4219 ../version.c:4223
msgid " 3rd user vimrc file: \"" msgid " 3rd user vimrc file: \""
msgstr "" msgstr ""
#: ../version.c:4213 #: ../version.c:4215
msgid " 4th user vimrc file: \"" msgid " 4th user vimrc file: \""
msgstr "" msgstr ""
#: ../version.c:4226 #: ../version.c:4228
msgid " user exrc file: \"" msgid " user exrc file: \""
msgstr "" msgstr ""
#: ../version.c:4231 #: ../version.c:4233
msgid " 2nd user exrc file: \"" msgid " 2nd user exrc file: \""
msgstr "" msgstr ""
#: ../version.c:4237 #: ../version.c:4239
msgid " system gvimrc file: \"" msgid " system gvimrc file: \""
msgstr "" msgstr ""
#: ../version.c:4241 #: ../version.c:4243
msgid " user gvimrc file: \"" msgid " user gvimrc file: \""
msgstr "" msgstr ""
#: ../version.c:4245 #: ../version.c:4247
msgid "2nd user gvimrc file: \"" msgid "2nd user gvimrc file: \""
msgstr "" msgstr ""
#: ../version.c:4250 #: ../version.c:4252
msgid "3rd user gvimrc file: \"" msgid "3rd user gvimrc file: \""
msgstr "" msgstr ""
#: ../version.c:4255 #: ../version.c:4257
msgid " defaults file: \"" msgid " defaults file: \""
msgstr "" msgstr ""
#: ../version.c:4260 #: ../version.c:4262
msgid " system menu file: \"" msgid " system menu file: \""
msgstr "" msgstr ""
#: ../version.c:4268 #: ../version.c:4270
msgid " fall-back for $VIM: \"" msgid " fall-back for $VIM: \""
msgstr "" msgstr ""
#: ../version.c:4274 #: ../version.c:4276
msgid " f-b for $VIMRUNTIME: \"" msgid " f-b for $VIMRUNTIME: \""
msgstr "" msgstr ""
#: ../version.c:4278 #: ../version.c:4280
msgid "Compilation: " msgid "Compilation: "
msgstr "" msgstr ""
#: ../version.c:4284 #: ../version.c:4286
msgid "Compiler: " msgid "Compiler: "
msgstr "" msgstr ""
#: ../version.c:4289 #: ../version.c:4291
msgid "Linking: " msgid "Linking: "
msgstr "" msgstr ""
#: ../version.c:4294 #: ../version.c:4296
msgid " DEBUG BUILD" msgid " DEBUG BUILD"
msgstr "" msgstr ""
#: ../version.c:4330 #: ../version.c:4332
msgid "VIM - Vi IMproved" msgid "VIM - Vi IMproved"
msgstr "" msgstr ""
#: ../version.c:4332 #: ../version.c:4334
msgid "version " msgid "version "
msgstr "" msgstr ""
#: ../version.c:4333 #: ../version.c:4335
msgid "by Bram Moolenaar et al." msgid "by Bram Moolenaar et al."
msgstr "" msgstr ""
#: ../version.c:4337 #: ../version.c:4339
msgid "Vim is open source and freely distributable" msgid "Vim is open source and freely distributable"
msgstr "" msgstr ""
#: ../version.c:4339 #: ../version.c:4341
msgid "Help poor children in Uganda!" msgid "Help poor children in Uganda!"
msgstr "" msgstr ""
#: ../version.c:4340 #: ../version.c:4342
msgid "type :help iccf<Enter> for information " msgid "type :help iccf<Enter> for information "
msgstr "" msgstr ""
#: ../version.c:4342 #: ../version.c:4344
msgid "type :q<Enter> to exit " msgid "type :q<Enter> to exit "
msgstr "" msgstr ""
#: ../version.c:4343 #: ../version.c:4345
msgid "type :help<Enter> or <F1> for on-line help" msgid "type :help<Enter> or <F1> for on-line help"
msgstr "" msgstr ""
#: ../version.c:4344 #: ../version.c:4346
msgid "type :help version9<Enter> for version info" msgid "type :help version9<Enter> for version info"
msgstr "" msgstr ""
#: ../version.c:4347 #: ../version.c:4349
msgid "Running in Vi compatible mode" msgid "Running in Vi compatible mode"
msgstr "" msgstr ""
#: ../version.c:4348 #: ../version.c:4350
msgid "type :set nocp<Enter> for Vim defaults" msgid "type :set nocp<Enter> for Vim defaults"
msgstr "" msgstr ""
#: ../version.c:4349 #: ../version.c:4351
msgid "type :help cp-default<Enter> for info on this" msgid "type :help cp-default<Enter> for info on this"
msgstr "" msgstr ""
#: ../version.c:4364 #: ../version.c:4366
msgid "menu Help->Orphans for information " msgid "menu Help->Orphans for information "
msgstr "" msgstr ""
#: ../version.c:4366 #: ../version.c:4368
msgid "Running modeless, typed text is inserted" msgid "Running modeless, typed text is inserted"
msgstr "" msgstr ""
#: ../version.c:4367 #: ../version.c:4369
msgid "menu Edit->Global Settings->Toggle Insert Mode " msgid "menu Edit->Global Settings->Toggle Insert Mode "
msgstr "" msgstr ""
#: ../version.c:4368 #: ../version.c:4370
msgid " for two modes " msgid " for two modes "
msgstr "" msgstr ""
#: ../version.c:4372 #: ../version.c:4374
msgid "menu Edit->Global Settings->Toggle Vi Compatible" msgid "menu Edit->Global Settings->Toggle Vi Compatible"
msgstr "" msgstr ""
#: ../version.c:4373 #: ../version.c:4375
msgid " for Vim defaults " msgid " for Vim defaults "
msgstr "" msgstr ""
#: ../version.c:4414 #: ../version.c:4416
msgid "Sponsor Vim development!" msgid "Sponsor Vim development!"
msgstr "" msgstr ""
#: ../version.c:4415 #: ../version.c:4417
msgid "Become a registered Vim user!" msgid "Become a registered Vim user!"
msgstr "" msgstr ""
#: ../version.c:4418 #: ../version.c:4420
msgid "type :help sponsor<Enter> for information " msgid "type :help sponsor<Enter> for information "
msgstr "" msgstr ""
#: ../version.c:4419 #: ../version.c:4421
msgid "type :help register<Enter> for information " msgid "type :help register<Enter> for information "
msgstr "" msgstr ""
#: ../version.c:4421 #: ../version.c:4423
msgid "menu Help->Sponsor/Register for information " msgid "menu Help->Sponsor/Register for information "
msgstr "" msgstr ""

View File

@ -719,6 +719,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1555,
/**/ /**/
1554, 1554,
/**/ /**/