Commit: patch 9.1.1670: completion: autocomplete breaks second completion

2 views
Skip to first unread message

Christian Brabandt

unread,
Aug 23, 2025, 7:45:17 AM (13 days ago) Aug 23
to vim...@googlegroups.com
patch 9.1.1670: completion: autocomplete breaks second completion

Commit: https://github.com/vim/vim/commit/b4e0bd93a9c09377b684c5bdf12c5c2eeb46aada
Author: Girish Palya <giri...@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 <giri...@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,
/**/
Reply all
Reply to author
Forward
0 new messages