patch 9.1.1670: completion: autocomplete breaks second completion Commit: https://github.com/vim/vim/commit/b4e0bd93a9c09377b684c5bdf12c5c2eeb46aada Author: Girish Palya <giris...@gmail.com> Date: Sat Aug 23 06:36:00 2025 -0400
patch 9.1.1670: completion: autocomplete breaks second completion Problem: completion: autocomplete breaks second completion (gravndal) Solution: Fix the autocomplete bug (Girish Palya) fixes: #18044 closes: #18068 Signed-off-by: Girish Palya <giris...@gmail.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/src/edit.c b/src/edit.c index 5ffe425d1..c61a9250e 100644 --- a/src/edit.c +++ b/src/edit.c @@ -664,9 +664,6 @@ edit( continue; } - if (p_ac) - ins_compl_set_autocomplete(TRUE); - // A non-white character that fits in with the current // completion: Add to "compl_leader". if (ins_compl_accept_char(c)) @@ -688,9 +685,6 @@ edit( continue; } - if (p_ac) - ins_compl_set_autocomplete(FALSE); - // Pressing CTRL-Y selects the current match. When // ins_compl_enter_selects() is set the Enter key does the // same. @@ -997,7 +991,7 @@ doESCkey: { update_screen(UPD_VALID); // Show char deletion immediately out_flush(); - ins_compl_set_autocomplete(TRUE); + ins_compl_enable_autocomplete(); goto docomplete; // Trigger autocompletion } } @@ -1424,7 +1418,7 @@ normalchar: { update_screen(UPD_VALID); // Show character immediately out_flush(); - ins_compl_set_autocomplete(TRUE); + ins_compl_enable_autocomplete(); goto docomplete; } diff --git a/src/insexpand.c b/src/insexpand.c index 9ff36ab99..dc6f02784 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -7078,8 +7078,11 @@ ins_complete(int c, int enable_pum) int insert_match; int no_matches_found; #ifdef ELAPSED_FUNC - // Timestamp when match collection starts - elapsed_T compl_start_tv = {0}; + elapsed_T compl_start_tv = {0}; // Time when match collection starts + int disable_ac_delay; + + disable_ac_delay = compl_started && ctrl_x_mode_normal() + && (c == Ctrl_N || c == Ctrl_P || c == Ctrl_R || ins_compl_pum_key(c)); #endif compl_direction = ins_compl_key2dir(c); @@ -7088,16 +7091,13 @@ ins_complete(int c, int enable_pum) if (!compl_started) { if (ins_compl_start() == FAIL) - { - compl_autocomplete = FALSE; return FAIL; - } } else if (insert_match && stop_arrow() == FAIL) return FAIL; #ifdef ELAPSED_FUNC - if (compl_autocomplete && p_acl > 0) + if (compl_autocomplete && p_acl > 0 && !disable_ac_delay) ELAPSED_INIT(compl_start_tv); #endif compl_curr_win = curwin; @@ -7152,8 +7152,8 @@ ins_complete(int c, int enable_pum) // Wait for the autocompletion delay to expire #ifdef ELAPSED_FUNC - if (compl_autocomplete && p_acl > 0 && !no_matches_found - && ELAPSED_FUNC(compl_start_tv) < p_acl) + if (compl_autocomplete && p_acl > 0 && !disable_ac_delay + && !no_matches_found && ELAPSED_FUNC(compl_start_tv) < p_acl) { cursor_on(); setcursor(); @@ -7178,19 +7178,18 @@ ins_complete(int c, int enable_pum) compl_was_interrupted = compl_interrupted; compl_interrupted = FALSE; - compl_autocomplete = FALSE; return OK; } /* - * Enable/disable autocompletion + * Enable autocompletion */ void -ins_compl_set_autocomplete(int value) +ins_compl_enable_autocomplete(void) { #ifdef ELAPSED_FUNC - compl_autocomplete = value; + compl_autocomplete = TRUE; #endif } diff --git a/src/proto/insexpand.pro b/src/proto/insexpand.pro index 16f073ed8..6d3f2c637 100644 --- a/src/proto/insexpand.pro +++ b/src/proto/insexpand.pro @@ -72,6 +72,6 @@ void ins_compl_delete(void); void ins_compl_insert(int move_cursor); void ins_compl_check_keys(int frequency, int in_compl_func); int ins_complete(int c, int enable_pum); -void ins_compl_set_autocomplete(int val); +void ins_compl_enable_autocomplete(void); void free_insexpand_stuff(void); /* vim: set ft=c : */ diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index 4cbdec6ff..b5e969120 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -5358,7 +5358,7 @@ func Test_autocomplete_timer() call assert_equal(['abc', 'ab'], b:matches->mapnew('v:val.word')) call assert_equal(0, b:selected) call assert_equal(1, g:CallCount) - call assert_equal('ab', getline(4)) + call assert_equal('abc', getline(4)) set completeopt& " Test 8: {func} completes after space, but not '.' diff --git a/src/version.c b/src/version.c index 6fe0936c7..42949896a 100644 --- a/src/version.c +++ b/src/version.c @@ -724,6 +724,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1670, /**/ 1669, /**/ -- -- 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/E1upmgC-00Emqa-2l%40256bit.org.