patch 9.1.0983: not able to get the displayed items in complete_info()

Commit: 
https://github.com/vim/vim/commit/d4088edae21659e14ab5f763c820f4eab9d36981
Author: glepnir <glephun...@gmail.com>
Date:   Tue Dec 31 10:55:22 2024 +0100

    patch 9.1.0983: not able to get the displayed items in complete_info()
    
    Problem:  not able to get the displayed items in complete_info()
              (Evgeni Chasnovski)
    Solution: return the visible items via the "matches" key for
              complete_info() (glepnir)
    
    fixes: #10007
    closes: #16307
    
    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 c82ff8115..9d010150a 100644
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -1,4 +1,4 @@
-*builtin.txt*  For Vim version 9.1.  Last change: 2024 Dec 30
+*builtin.txt*  For Vim version 9.1.  Last change: 2024 Dec 31
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1896,10 +1896,15 @@ complete_info([{what}])                         
*complete_info()*
                                See |complete_info_mode| for the values.
                   pum_visible  |TRUE| if popup menu is visible.
                                See |pumvisible()|.
-                  items        List of completion matches.  Each item is a
-                               dictionary containing the entries "word",
+                  items        List of all completion candidates. Each item
+                               is a dictionary containing the entries "word",
                                "abbr", "menu", "kind", "info" and "user_data".
                                See |complete-items|.
+                  matches      Same as "items", but only returns items that
+                               are matching current query. If both "matches"
+                               and "items" are in "what", the returned list
+                               will still be named "items", but each item
+                               will have an additional "match" field.
                   selected     Selected item index.  First index is zero.
                                Index is -1 if no item is selected (showing
                                typed text only, or the last completion after
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
index f025d816f..a5d245f50 100644
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -1,4 +1,4 @@
-*insert.txt*    For Vim version 9.1.  Last change: 2024 Dec 28
+*insert.txt*    For Vim version 9.1.  Last change: 2024 Dec 31
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1195,6 +1195,7 @@ items:
                        |hl-PmenuKind| highlight group, allowing for the
                        customization of ctermfg and guifg properties for the
                        completion kind
+       match           See "matches" in |complete_info()|.
 
 All of these except "icase", "equal", "dup" and "empty" must be a string.  If
 an item does not meet these requirements then an error message is given and
diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt
index af637021c..3477c9126 100644
--- a/runtime/doc/version9.txt
+++ b/runtime/doc/version9.txt
@@ -1,4 +1,4 @@
-*version9.txt*  For Vim version 9.1.  Last change: 2024 Dec 30
+*version9.txt*  For Vim version 9.1.  Last change: 2024 Dec 31
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -41621,6 +41621,8 @@ Changed~
   instead of the "sh" filetype
 - the default value of the 'keyprotocol' option has been updated by support
   for the ghostty terminal emulator (using kitty protocol)
+- |complete_info()| returns the list of matches shown in the poppu menu via
+  the "matches" key
 
                                                        *added-9.2*
 Added ~
diff --git a/src/insexpand.c b/src/insexpand.c
index 522b7f73e..818b1b96a 100644
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -106,6 +106,7 @@ struct compl_S
     int                cp_flags;               // CP_ values
     int                cp_number;              // sequence number
     int                cp_score;               // fuzzy match score
+    int                cp_in_match_array;      // collected by 
compl_match_array
     int                cp_user_abbr_hlattr;    // highlight attribute for abbr
     int                cp_user_kind_hlattr;    // highlight attribute for kind
 };
@@ -1282,6 +1283,7 @@ ins_compl_build_pum(void)
 
     do
     {
+       compl->cp_in_match_array = FALSE;
        // When 'completeopt' contains "fuzzy" and leader is not NULL or empty,
        // set the cp_score for later comparisons.
        if (compl_fuzzy_match && compl_leader.string != NULL && 
compl_leader.length > 0)
@@ -1293,6 +1295,7 @@ ins_compl_build_pum(void)
                    || (compl_fuzzy_match && compl->cp_score > 0)))
        {
            ++compl_match_arraysize;
+           compl->cp_in_match_array = TRUE;
            if (match_head == NULL)
                match_head = compl;
            else
@@ -3259,11 +3262,12 @@ get_complete_info(list_T *what_list, dict_T *retdict)
 #define CI_WHAT_ITEMS          0x04
 #define CI_WHAT_SELECTED       0x08
 #define CI_WHAT_INSERTED       0x10
+#define CI_WHAT_MATCHES                0x20
 #define CI_WHAT_ALL            0xff
     int                what_flag;
 
     if (what_list == NULL)
-       what_flag = CI_WHAT_ALL;
+       what_flag = CI_WHAT_ALL & ~CI_WHAT_MATCHES;
     else
     {
        what_flag = 0;
@@ -3282,6 +3286,8 @@ get_complete_info(list_T *what_list, dict_T *retdict)
                what_flag |= CI_WHAT_SELECTED;
            else if (STRCMP(what, "inserted") == 0)
                what_flag |= CI_WHAT_INSERTED;
+           else if (STRCMP(what, "matches") == 0)
+               what_flag |= CI_WHAT_MATCHES;
        }
     }
 
@@ -3291,19 +3297,23 @@ 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))
+    if (ret == OK && (what_flag & CI_WHAT_ITEMS || what_flag & CI_WHAT_SELECTED
+               || what_flag & CI_WHAT_MATCHES))
     {
        list_T      *li = NULL;
        dict_T      *di;
        compl_T     *match;
        int         selected_idx = -1;
+       int         has_items = what_flag & CI_WHAT_ITEMS;
+       int         has_matches = what_flag & CI_WHAT_MATCHES;
 
-       if (what_flag & CI_WHAT_ITEMS)
+       if (has_items || has_matches)
        {
            li = list_alloc();
            if (li == NULL)
                return;
-           ret = dict_add_list(retdict, "items", li);
+           ret = dict_add_list(retdict, (has_matches && !has_items)
+                                               ? "matches" : "items", li);
        }
        if (ret == OK && what_flag & CI_WHAT_SELECTED)
            if (compl_curr_match != NULL && compl_curr_match->cp_number == -1)
@@ -3316,7 +3326,8 @@ get_complete_info(list_T *what_list, dict_T *retdict)
            {
                if (!match_at_original_text(match))
                {
-                   if (what_flag & CI_WHAT_ITEMS)
+                   if (has_items
+                           || (has_matches && match->cp_in_match_array))
                    {
                        di = dict_alloc();
                        if (di == NULL)
@@ -3329,13 +3340,16 @@ get_complete_info(list_T *what_list, dict_T *retdict)
                        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);
                    }
-                   if (compl_curr_match != NULL && compl_curr_match->cp_number 
== match->cp_number)
+                   if (compl_curr_match != NULL
+                           && compl_curr_match->cp_number == match->cp_number)
                        selected_idx = list_idx;
                    list_idx += 1;
                }
diff --git a/src/testdir/test_ins_complete.vim 
b/src/testdir/test_ins_complete.vim
index ad2d42167..8b266667d 100644
--- a/src/testdir/test_ins_complete.vim
+++ b/src/testdir/test_ins_complete.vim
@@ -2931,4 +2931,48 @@ func Test_complete_backwards_default()
   bw!
 endfunc
 
+func Test_complete_info_matches()
+  let g:what = ['matches']
+  func ShownInfo()
+    let g:compl_info = complete_info(g:what)
+    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': ''},
+    \ {'word': 'aab', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 
'abbr': ''},
+    \ {'word': 'aba', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 
'abbr': ''},
+    \ {'word': 'abb', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 
'abbr': ''},
+    \], g:compl_info['matches'])
+
+  call feedkeys("Goa\<C-X>\<C-N>b\<F5>\<Esc>dd", 'tx')
+  call assert_equal([
+    \ {'word': 'aba', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 
'abbr': ''},
+    \ {'word': 'abb', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 
'abbr': ''},
+    \], g:compl_info['matches'])
+
+  " items and matches both in what
+  let g:what = ['items', 'matches']
+  call feedkeys("Goa\<C-X>\<C-N>b\<F5>\<Esc>dd", 'tx')
+  call assert_equal([
+    \ {'word': 'aaa', 'menu': '', 'user_data': '', 'match': v:false, 'info': 
'', 'kind': '', 'abbr': ''},
+    \ {'word': 'aab', 'menu': '', 'user_data': '', 'match': v:false, 'info': 
'', 'kind': '', 'abbr': ''},
+    \ {'word': 'aba', 'menu': '', 'user_data': '', 'match': v:true, 'info': 
'', 'kind': '', 'abbr': ''},
+    \ {'word': 'abb', 'menu': '', 'user_data': '', 'match': v:true, 'info': 
'', 'kind': '', 'abbr': ''},
+    \], g:compl_info['items'])
+  call assert_false(has_key(g:compl_info, 'matches'))
+
+  bw!
+  bw!
+  unlet g:what
+  delfunc ShownInfo
+  set cot&
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab nofoldenable
diff --git a/src/version.c b/src/version.c
index a4b0fc45e..48a060653 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 */
+/**/
+    983,
 /**/
     982,
 /**/

-- 
-- 
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/E1tSZ2i-00FhBV-Nt%40256bit.org.

Raspunde prin e-mail lui