diff options
author | LemonBoy <thatlemon@gmail.com> | 2023-10-11 21:55:56 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-10-11 21:55:56 +0200 |
commit | 69fb5afb3bc9da24c2fb0eafb0027ba9c6502fc2 (patch) | |
tree | 0538edcc3c2e8233315a948e3c1dd207cd8d83e1 /src/insexpand.c | |
parent | dd75fcfbdff1934c6e531b5a89ebc636318bf4a2 (diff) |
patch 9.0.2018: complete_info() returns wrong indexv9.0.2018
Problem: complete_info() returns wrong index
Solution: Make order of 'info' in completion_info consistent
Start the iteration from the same point and follow the same direction as
done when assigning the completion numbers. This way we remove the
dependence on the completion direction and make the order of 'info'
consistent.
closes: #12230
closes: #12971
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: LemonBoy <thatlemon@gmail.com>
Diffstat (limited to 'src/insexpand.c')
-rw-r--r-- | src/insexpand.c | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/src/insexpand.c b/src/insexpand.c index 3b06ee02de..f225cd3844 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -3040,6 +3040,43 @@ ins_compl_update_sequence_numbers(void) } } + static int +info_add_completion_info(list_T *li) +{ + compl_T *match; + + if (compl_first_match == NULL) + return OK; + + // Skip the element with the CP_ORIGINAL_TEXT flag at the beginning, in case of + // forward completion, or at the end, in case of backward completion. + match = compl_dir_forward() + ? compl_first_match->cp_next : compl_first_match->cp_prev->cp_prev; + while (match != NULL && !match_at_original_text(match)) + { + dict_T *di = dict_alloc(); + + if (di == NULL) + return FAIL; + if (list_append_dict(li, di) == FAIL) + return FAIL; + dict_add_string(di, "word", match->cp_str); + 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 (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); + + match = compl_dir_forward() ? match->cp_next : match->cp_prev; + } + + return OK; +} + /* * Get complete information */ @@ -3088,41 +3125,13 @@ get_complete_info(list_T *what_list, dict_T *retdict) if (ret == OK && (what_flag & CI_WHAT_ITEMS)) { list_T *li; - dict_T *di; - compl_T *match; li = list_alloc(); if (li == NULL) return; ret = dict_add_list(retdict, "items", li); - if (ret == OK && compl_first_match != NULL) - { - match = compl_first_match; - do - { - if (!match_at_original_text(match)) - { - di = dict_alloc(); - if (di == NULL) - return; - ret = list_append_dict(li, di); - if (ret != OK) - return; - dict_add_string(di, "word", match->cp_str); - 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 (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); - } - match = match->cp_next; - } - while (match != NULL && !is_first_match(match)); - } + if (ret == OK) + ret = info_add_completion_info(li); } if (ret == OK && (what_flag & CI_WHAT_SELECTED)) |