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.

Raspunde prin e-mail lui