vim-patch:9.1.1201: 'completefuzzycollect' does not handle dictionary correctly

Problem:  'completefuzzycollect' does not handle dictionary correctly
Solution: check for ctrl_x_mode_dictionary (glepnir)

closes: vim/vim#16867

587601671c

Cherry-pick a documentation fix from later.

Co-authored-by: glepnir <glephunter@gmail.com>
This commit is contained in:
zeertzjq
2025-03-14 07:42:54 +08:00
parent 5975ddbdb8
commit e39cdafed9
5 changed files with 41 additions and 30 deletions

View File

@@ -1526,17 +1526,18 @@ A jump table for the options with a short description can be found at |Q_op|.
find completion candidates instead of the standard prefix-based
matching. This option can contain the following values:
keyword keywords in the current file |i_CTRL-X_CTRL-N|
keywords with the ".", "w", "b", "u", "U" and
"k{dict}" flags in 'complete'. |i_CTRL-N| |i_CTRL-P|
keyword keywords in the current file |i_CTRL-X_CTRL-N|
keywords with flags ".", "w", |i_CTRL-N| |i_CTRL-P|
"b", "u", "U" and "k{dict}" in 'complete'
keywords in 'dictionary' |i_CTRL-X_CTRL-K|
files file names |i_CTRL-X_CTRL-F|
files file names |i_CTRL-X_CTRL-F|
whole_line whole lines |i_CTRL-X_CTRL-L|
whole_line whole lines |i_CTRL-X_CTRL-L|
When used with 'completeopt' "longest" option, fuzzy collection can
identify the longest common string among the best fuzzy matches and
automatically insert it.
When using the 'completeopt' "longest" option value, fuzzy collection
can identify the longest common string among the best fuzzy matches
and insert it automatically.
*'completeitemalign'* *'cia'*
'completeitemalign' 'cia' string (default "abbr,kind,menu")

View File

@@ -1050,17 +1050,18 @@ vim.bo.cfu = vim.bo.completefunc
--- find completion candidates instead of the standard prefix-based
--- matching. This option can contain the following values:
---
--- keyword keywords in the current file `i_CTRL-X_CTRL-N`
--- keywords with the ".", "w", "b", "u", "U" and
--- "k{dict}" flags in 'complete'. `i_CTRL-N` `i_CTRL-P`
--- keyword keywords in the current file `i_CTRL-X_CTRL-N`
--- keywords with flags ".", "w", `i_CTRL-N` `i_CTRL-P`
--- "b", "u", "U" and "k{dict}" in 'complete'
--- keywords in 'dictionary' `i_CTRL-X_CTRL-K`
---
--- files file names `i_CTRL-X_CTRL-F`
--- files file names `i_CTRL-X_CTRL-F`
---
--- whole_line whole lines `i_CTRL-X_CTRL-L`
--- whole_line whole lines `i_CTRL-X_CTRL-L`
---
--- When used with 'completeopt' "longest" option, fuzzy collection can
--- identify the longest common string among the best fuzzy matches and
--- automatically insert it.
--- When using the 'completeopt' "longest" option value, fuzzy collection
--- can identify the longest common string among the best fuzzy matches
--- and insert it automatically.
---
--- @type string
vim.o.completefuzzycollect = ""

View File

@@ -792,14 +792,13 @@ int ins_compl_add_infercase(char *str_arg, int len, bool icase, char *fname, Dir
/// Check if ctrl_x_mode has been configured in 'completefuzzycollect'
static bool cfc_has_mode(void)
{
switch (ctrl_x_mode) {
case CTRL_X_NORMAL:
if (ctrl_x_mode_normal() || ctrl_x_mode_dictionary()) {
return (cfc_flags & kOptCfcFlagKeyword) != 0;
case CTRL_X_FILES:
} else if (ctrl_x_mode_files()) {
return (cfc_flags & kOptCfcFlagFiles) != 0;
case CTRL_X_WHOLE_LINE:
} else if (ctrl_x_mode_whole_line()) {
return (cfc_flags & kOptCfcFlagWholeLine) != 0;
default:
} else {
return false;
}
}
@@ -1670,7 +1669,7 @@ static void ins_compl_files(int count, char **files, bool thesaurus, int flags,
regmatch_T *regmatch, char *buf, Direction *dir)
FUNC_ATTR_NONNULL_ARG(2, 7)
{
bool in_fuzzy_collect = cfc_has_mode() && ctrl_x_mode_normal();
bool in_fuzzy_collect = cfc_has_mode();
char *leader = in_fuzzy_collect ? ins_compl_leader() : NULL;
int leader_len = in_fuzzy_collect ? (int)ins_compl_leader_len() : 0;

View File

@@ -1472,17 +1472,18 @@ local options = {
find completion candidates instead of the standard prefix-based
matching. This option can contain the following values:
keyword keywords in the current file |i_CTRL-X_CTRL-N|
keywords with the ".", "w", "b", "u", "U" and
"k{dict}" flags in 'complete'. |i_CTRL-N| |i_CTRL-P|
keyword keywords in the current file |i_CTRL-X_CTRL-N|
keywords with flags ".", "w", |i_CTRL-N| |i_CTRL-P|
"b", "u", "U" and "k{dict}" in 'complete'
keywords in 'dictionary' |i_CTRL-X_CTRL-K|
files file names |i_CTRL-X_CTRL-F|
files file names |i_CTRL-X_CTRL-F|
whole_line whole lines |i_CTRL-X_CTRL-L|
whole_line whole lines |i_CTRL-X_CTRL-L|
When used with 'completeopt' "longest" option, fuzzy collection can
identify the longest common string among the best fuzzy matches and
automatically insert it.
When using the 'completeopt' "longest" option value, fuzzy collection
can identify the longest common string among the best fuzzy matches
and insert it automatically.
]=],
full_name = 'completefuzzycollect',
list = 'onecomma',

View File

@@ -2988,8 +2988,17 @@ func Test_complete_fuzzy_collect()
call feedkeys("Gofuzzy\<C-X>\<C-N>\<C-N>\<C-N>\<C-N>\<CR>\<Esc>0", 'tx!')
call assert_equal('completefuzzycollect', getline(line('.') - 1))
" keywords in 'dictonary'
call writefile(['hello', 'think'], 'test_dict.txt', 'D')
set dict=test_dict.txt
call feedkeys("Sh\<C-X>\<C-K>\<C-N>\<CR>\<Esc>0", 'tx!')
call assert_equal('hello', getline(line('.') - 1))
call feedkeys("Sh\<C-X>\<C-K>\<C-N>\<C-N>\<CR>\<Esc>0", 'tx!')
call assert_equal('think', getline(line('.') - 1))
bw!
bw!
set dict&
set completeopt& cfc& cpt&
endfunc