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.