diff options
author | zeertzjq <zeertzjq@outlook.com> | 2025-03-13 07:08:25 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2025-03-27 07:26:42 +0800 |
commit | 28f61994748e1edd5fb1755ddf2e5ca1324b5635 (patch) | |
tree | fdf9ed4c504c3359a35e51bcb7c978671271aba7 /src | |
parent | cd95ea5d48daa271e323b1eee862e25b49d379d1 (diff) | |
download | rneovim-28f61994748e1edd5fb1755ddf2e5ca1324b5635.tar.gz rneovim-28f61994748e1edd5fb1755ddf2e5ca1324b5635.tar.bz2 rneovim-28f61994748e1edd5fb1755ddf2e5ca1324b5635.zip |
vim-patch:9.1.1197: process_next_cpt_value() uses wrong condition
Problem: process_next_cpt_value() uses wrong condition
Solution: use cfc_has_mode() instead and remove redundant else if branch
(glepnir)
closes: vim/vim#16833
https://github.com/vim/vim/commit/53b14578e03f93a53fd6eb21c00caf96484742ed
Co-authored-by: glepnir <glephunter@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/insexpand.c | 7 | ||||
-rw-r--r-- | src/nvim/options.lua | 25 | ||||
-rw-r--r-- | src/nvim/search.c | 16 |
3 files changed, 29 insertions, 19 deletions
diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c index 0e8b135812..47238468db 100644 --- a/src/nvim/insexpand.c +++ b/src/nvim/insexpand.c @@ -3219,7 +3219,7 @@ enum { /// the "st->e_cpt" option value and process the next matching source. /// INS_COMPL_CPT_END if all the values in "st->e_cpt" are processed. static int process_next_cpt_value(ins_compl_next_state_T *st, int *compl_type_arg, - pos_T *start_match_pos, bool in_fuzzy) + pos_T *start_match_pos, bool fuzzy_collect) { int compl_type = -1; int status = INS_COMPL_CPT_OK; @@ -3235,7 +3235,7 @@ static int process_next_cpt_value(ins_compl_next_state_T *st, int *compl_type_ar st->first_match_pos = *start_match_pos; // Move the cursor back one character so that ^N can match the // word immediately after the cursor. - if (ctrl_x_mode_normal() && (!in_fuzzy && dec(&st->first_match_pos) < 0)) { + if (ctrl_x_mode_normal() && (!fuzzy_collect && dec(&st->first_match_pos) < 0)) { // Move the cursor to after the last character in the // buffer, so that word at start of buffer is found // correctly. @@ -3924,7 +3924,6 @@ static int ins_compl_get_exp(pos_T *ini) static bool st_cleared = false; int found_new_match; int type = ctrl_x_mode; - bool in_fuzzy = (get_cot_flags() & kOptCotFlagFuzzy) != 0; assert(curbuf != NULL); @@ -3961,7 +3960,7 @@ static int ins_compl_get_exp(pos_T *ini) // entries from 'complete' that look in loaded buffers. if ((ctrl_x_mode_normal() || ctrl_x_mode_line_or_eval()) && (!compl_started || st.found_all)) { - int status = process_next_cpt_value(&st, &type, ini, in_fuzzy); + int status = process_next_cpt_value(&st, &type, ini, cfc_has_mode()); if (status == INS_COMPL_CPT_END) { break; } diff --git a/src/nvim/options.lua b/src/nvim/options.lua index 71c96b6770..1a66b32ccc 100644 --- a/src/nvim/options.lua +++ b/src/nvim/options.lua @@ -1466,14 +1466,23 @@ local options = { flags = true, deny_duplicates = true, desc = [=[ - This option enables fuzzy collection for (only some) specific - |ins-completion| modes, adjusting how items are gathered for fuzzy - matching based on input. - The option can contain the following values (separated by commas), - each enabling fuzzy collection for a specific completion mode: - files file names - keyword keyword completion in 'complete' and current file - whole_line whole lines + A comma-separated list of option enables fuzzy collection for specific + |ins-completion| modes, affecting how items are gathered during + completion. When set, fuzzy matching is used to find completion + candidates instead of the standard prefix-based matching. This option + can contain the following values are: + + 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| + + files file names |i_CTRL-X_CTRL-F| + + 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. ]=], full_name = 'completefuzzycollect', list = 'onecomma', diff --git a/src/nvim/search.c b/src/nvim/search.c index 2b7739292b..6db5fc159b 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -3629,7 +3629,7 @@ garray_T *fuzzy_match_str_with_pos(char *const str, const char *const pat) /// - `*len` is set to the length of the matched word. /// - `*score` contains the match score. /// -/// If no match is found, `*ptr` is updated to to the end of the line. +/// If no match is found, `*ptr` is updated to the end of the line. bool fuzzy_match_str_in_line(char **ptr, char *pat, int *len, pos_T *current_pos, int *score) { char *str = *ptr; @@ -3699,9 +3699,6 @@ bool search_for_fuzzy_match(buf_T *buf, pos_T *pos, char *pattern, int dir, pos_ bool looped_around = false; bool whole_line = ctrl_x_mode_whole_line(); - if (whole_line) { - current_pos.lnum += dir; - } if (buf == curbuf) { circly_end = *start_pos; @@ -3711,6 +3708,10 @@ bool search_for_fuzzy_match(buf_T *buf, pos_T *pos, char *pattern, int dir, pos_ circly_end.coladd = 0; } + if (whole_line && start_pos->lnum != pos->lnum) { + current_pos.lnum += dir; + } + while (true) { // Check if looped around and back to start position if (looped_around && equalpos(current_pos, circly_end)) { @@ -3721,11 +3722,14 @@ bool search_for_fuzzy_match(buf_T *buf, pos_T *pos, char *pattern, int dir, pos_ if (current_pos.lnum >= 1 && current_pos.lnum <= buf->b_ml.ml_line_count) { // Get the current line buffer *ptr = ml_get_buf(buf, current_pos.lnum); + if (!whole_line) { + *ptr += current_pos.col; + } + // If ptr is end of line is reached, move to next line // or previous line based on direction if (*ptr != NULL && **ptr != NUL) { if (!whole_line) { - *ptr += current_pos.col; // Try to find a fuzzy match in the current line starting // from current position found_new_match = fuzzy_match_str_in_line(ptr, pattern, @@ -3743,8 +3747,6 @@ bool search_for_fuzzy_match(buf_T *buf, pos_T *pos, char *pattern, int dir, pos_ } next_word_end += l; } - } else if (looped_around) { - found_new_match = false; } *len = (int)(next_word_end - *ptr); current_pos.col = *len; |