patch 9.1.1020: no way to get current selected item in a async context

Commit: 
https://github.com/vim/vim/commit/037b028a2219d09bc97be04b300b2c0490c4268d
Author: glepnir <glephun...@gmail.com>
Date:   Thu Jan 16 14:37:44 2025 +0100

    patch 9.1.1020: no way to get current selected item in a async context
    
    Problem:  no way to get current selected item in a async context
    Solution: add completed flag to show the entries of currently selected
              index item (@glepnir)
    
    closes: #16451
    
    Signed-off-by: glepnir <glephun...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
index 9ba22dc74..9d56f5082 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -1,4 +1,4 @@
-*builtin.txt*  For Vim version 9.1.  Last change: 2025 Jan 15
+*builtin.txt*  For Vim version 9.1.  Last change: 2025 Jan 16
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1946,7 +1946,8 @@ complete_info([{what}])                           
*complete_info()*
                                typed text only, or the last completion after
                                no item is selected when using the <Up> or
                                <Down> keys)
-                  inserted     Inserted string. [NOT IMPLEMENTED YET]
+                  completed    Return a dictionary containing the entries of
+                               the currently selected index item.
 
                                                        *complete_info_mode*
                mode values are:
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 48937b104..2d48cc974 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 9.1.  Last change: 2024 Dec 30
+*todo.txt*      For Vim version 9.1.  Last change: 2025 Jan 16
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -309,9 +309,6 @@ Problem with Visual highlight when 'linebreak' and 
'showbreak' are set.
 GUI Scroll test fails on FreeBSD when using Motif.  See FIXME in
 Test_scrollbars in src/test_gui.vim
 
-Selected index returned by complete_info() does not match the index in the
-list of items.  #12230
-
 Support dark mode for MS-Windows: #12282
 
 Remote command escapes single quote with backslash, should be doubling the
diff --git a/src/insexpand.c b/src/insexpand.c
index 4a02f0ec8..e33e15d43 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -3252,6 +3252,26 @@ ins_compl_update_sequence_numbers(void)
     }
 }
 
+/*
+ * Fill the dict of complete_info
+ */
+    static void
+fill_complete_info_dict(dict_T *di, compl_T *match, int add_match)
+{
+    dict_add_string(di, "word", match->cp_str.string);
+    dict_add_string(di, "abbr", match->cp_text[CPT_ABBR]);
+    dict_add_string(di, "menu", match->cp_text[CPT_MENU]);
+    dict_add_string(di, "kind", match->cp_text[CPT_KIND]);
+    dict_add_string(di, "info", match->cp_text[CPT_INFO]);
+    if (add_match)
+        dict_add_bool(di, "match", match->cp_in_match_array);
+    if (match->cp_user_data.v_type == VAR_UNKNOWN)
+        // Add an empty string for backwards compatibility
+        dict_add_string(di, "user_data", (char_u *)"");
+    else
+        dict_add_tv(di, "user_data", &match->cp_user_data);
+}
+
 /*
  * Get complete information
  */
@@ -3264,13 +3284,13 @@ get_complete_info(list_T *what_list, dict_T *retdict)
 #define CI_WHAT_PUM_VISIBLE    0x02
 #define CI_WHAT_ITEMS          0x04
 #define CI_WHAT_SELECTED       0x08
-#define CI_WHAT_INSERTED       0x10
+#define CI_WHAT_COMPLETED      0x10
 #define CI_WHAT_MATCHES                0x20
 #define CI_WHAT_ALL            0xff
     int                what_flag;
 
     if (what_list == NULL)
-       what_flag = CI_WHAT_ALL & ~CI_WHAT_MATCHES;
+       what_flag = CI_WHAT_ALL & ~(CI_WHAT_MATCHES | CI_WHAT_COMPLETED);
     else
     {
        what_flag = 0;
@@ -3287,8 +3307,8 @@ get_complete_info(list_T *what_list, dict_T *retdict)
                what_flag |= CI_WHAT_ITEMS;
            else if (STRCMP(what, "selected") == 0)
                what_flag |= CI_WHAT_SELECTED;
-           else if (STRCMP(what, "inserted") == 0)
-               what_flag |= CI_WHAT_INSERTED;
+           else if (STRCMP(what, "completed") == 0)
+               what_flag |= CI_WHAT_COMPLETED;
            else if (STRCMP(what, "matches") == 0)
                what_flag |= CI_WHAT_MATCHES;
        }
@@ -3300,8 +3320,8 @@ get_complete_info(list_T *what_list, dict_T *retdict)
     if (ret == OK && (what_flag & CI_WHAT_PUM_VISIBLE))
        ret = dict_add_number(retdict, "pum_visible", pum_visible());
 
-    if (ret == OK && (what_flag & CI_WHAT_ITEMS || what_flag & CI_WHAT_SELECTED
-               || what_flag & CI_WHAT_MATCHES))
+    if (ret == OK && (what_flag & (CI_WHAT_ITEMS | CI_WHAT_SELECTED
+                                   | CI_WHAT_MATCHES | CI_WHAT_COMPLETED)))
     {
        list_T      *li = NULL;
        dict_T      *di;
@@ -3309,6 +3329,7 @@ get_complete_info(list_T *what_list, dict_T *retdict)
        int         selected_idx = -1;
        int         has_items = what_flag & CI_WHAT_ITEMS;
        int         has_matches = what_flag & CI_WHAT_MATCHES;
+       int         has_completed = what_flag & CI_WHAT_COMPLETED;
 
        if (has_items || has_matches)
        {
@@ -3338,18 +3359,7 @@ get_complete_info(list_T *what_list, dict_T *retdict)
                        ret = list_append_dict(li, di);
                        if (ret != OK)
                            return;
-                       dict_add_string(di, "word", match->cp_str.string);
-                       dict_add_string(di, "abbr", match->cp_text[CPT_ABBR]);
-                       dict_add_string(di, "menu", match->cp_text[CPT_MENU]);
-                       dict_add_string(di, "kind", match->cp_text[CPT_KIND]);
-                       dict_add_string(di, "info", match->cp_text[CPT_INFO]);
-                       if (has_matches && has_items)
-                           dict_add_bool(di, "match", 
match->cp_in_match_array);
-                       if (match->cp_user_data.v_type == VAR_UNKNOWN)
-                           // Add an empty string for backwards compatibility
-                           dict_add_string(di, "user_data", (char_u *)"");
-                       else
-                           dict_add_tv(di, "user_data", &match->cp_user_data);
+                       fill_complete_info_dict(di, match, has_matches && 
has_items);
                    }
                    if (compl_curr_match != NULL
                            && compl_curr_match->cp_number == match->cp_number)
@@ -3362,11 +3372,15 @@ get_complete_info(list_T *what_list, dict_T *retdict)
        }
        if (ret == OK && (what_flag & CI_WHAT_SELECTED))
            ret = dict_add_number(retdict, "selected", selected_idx);
-    }
 
-    if (ret == OK && (what_flag & CI_WHAT_INSERTED))
-    {
-       // TODO
+       if (ret == OK && selected_idx != -1 && has_completed)
+       {
+           di = dict_alloc();
+           if (di == NULL)
+               return;
+           fill_complete_info_dict(di, compl_curr_match, FALSE);
+           ret = dict_add_dict(retdict, "completed", di);
+       }
     }
 }
 
diff --git a/src/testdir/test_ins_complete.vim 
b/src/testdir/test_ins_complete.vim
index 8b266667d..289a28188 100644
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -2975,4 +2975,34 @@ func Test_complete_info_matches()
   set cot&
 endfunc
 
+func Test_complete_info_completed()
+  func ShownInfo()
+    let g:compl_info = complete_info(['completed'])
+    return ''
+  endfunc
+  set completeopt+=noinsert
+
+  new
+  call setline(1, ['aaa', 'aab', 'aba', 'abb'])
+  inoremap <buffer><F5> <C-R>=ShownInfo()<CR>
+
+  call feedkeys("Go\<C-X>\<C-N>\<F5>\<Esc>dd", 'tx')
+  call assert_equal({'word': 'aaa', 'menu': '', 'user_data': '', 'info': '', 
'kind': '', 'abbr': ''},  g:compl_info['completed'])
+
+  call feedkeys("Go\<C-X>\<C-N>\<C-N>\<F5>\<Esc>dd", 'tx')
+  call assert_equal({'word': 'aab', 'menu': '', 'user_data': '', 'info': '', 
'kind': '', 'abbr': ''},  g:compl_info['completed'])
+
+  call feedkeys("Go\<C-X>\<C-N>\<C-N>\<C-N>\<C-N>\<F5>\<Esc>dd", 'tx')
+  call assert_equal({'word': 'abb', 'menu': '', 'user_data': '', 'info': '', 
'kind': '', 'abbr': ''},  g:compl_info['completed'])
+
+  set completeopt+=noselect
+  call feedkeys("Go\<C-X>\<C-N>\<F5>\<Esc>dd", 'tx')
+  call assert_equal({}, g:compl_info)
+
+  bw!
+  bw!
+  delfunc ShownInfo
+  set cot&
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab nofoldenable
diff --git a/src/version.c b/src/version.c
index 7ce1a98ef..5a47806a5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1020,
 /**/
     1019,
 /**/

-- 
-- 
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/E1tYQBH-00Fyd3-Jb%40256bit.org.

Raspunde prin e-mail lui