Mercurial > vim
diff src/insexpand.c @ 16237:56451a2677dc v8.1.1123
patch 8.1.1123: no way to avoid filtering for autocomplete function
commit https://github.com/vim/vim/commit/73655cf0ca37a9aa8f56fc51bb853a8b1f7b43d4
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Apr 6 13:45:55 2019 +0200
patch 8.1.1123: no way to avoid filtering for autocomplete function
Problem: No way to avoid filtering for autocomplete function, causing
flickering of the popup menu.
Solution: Add the "equal" field to complete items. (closes #3887)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 06 Apr 2019 14:00:05 +0200 |
parents | cd5c83115ec6 |
children | 5df26b29e809 |
line wrap: on
line diff
--- a/src/insexpand.c +++ b/src/insexpand.c @@ -101,16 +101,18 @@ struct compl_S { compl_T *cp_next; compl_T *cp_prev; - char_u *cp_str; /* matched text */ - char cp_icase; /* TRUE or FALSE: ignore case */ - char_u *(cp_text[CPT_COUNT]); /* text for the menu */ - char_u *cp_fname; /* file containing the match, allocated when - * cp_flags has FREE_FNAME */ - int cp_flags; /* ORIGINAL_TEXT, CONT_S_IPOS or FREE_FNAME */ - int cp_number; /* sequence number */ + char_u *cp_str; // matched text + char cp_icase; // TRUE or FALSE: ignore case + char cp_equal; // TRUE or FALSE: ins_compl_equal always ok + char_u *(cp_text[CPT_COUNT]); // text for the menu + char_u *cp_fname; // file containing the match, allocated when + // cp_flags has FREE_FNAME + int cp_flags; // ORIGINAL_TEXT, CONT_S_IPOS or FREE_FNAME + int cp_number; // sequence number }; -# define ORIGINAL_TEXT (1) /* the original text when the expansion begun */ +// flags for ins_compl_add() +# define ORIGINAL_TEXT (1) // the original text when the expansion begun # define FREE_FNAME (2) static char e_hitend[] = N_("Hit end of paragraph"); @@ -183,7 +185,7 @@ static expand_T compl_xp; static int compl_opt_refresh_always = FALSE; static int compl_opt_suppress_empty = FALSE; -static int ins_compl_add(char_u *str, int len, int icase, char_u *fname, char_u **cptext, int cdir, int flags, int adup); +static int ins_compl_add(char_u *str, int len, int icase, char_u *fname, char_u **cptext, int cdir, int flags, int adup, int equal); static void ins_compl_longest_match(compl_T *match); static void ins_compl_del_pum(void); static void ins_compl_files(int count, char_u **files, int thesaurus, int flags, regmatch_T *regmatch, char_u *buf, int *dir); @@ -413,13 +415,14 @@ ins_compl_accept_char(int c) */ int ins_compl_add_infercase( - char_u *str, + char_u *str_arg, int len, int icase, char_u *fname, int dir, int flags) { + char_u *str = str_arg; char_u *p; int i, c; int actual_len; // Take multi-byte characters @@ -550,10 +553,11 @@ ins_compl_add_infercase( vim_free(wca); } - return ins_compl_add(IObuff, len, icase, fname, NULL, dir, - flags, FALSE); + str = IObuff; } - return ins_compl_add(str, len, icase, fname, NULL, dir, flags, FALSE); + + return ins_compl_add(str, len, icase, fname, NULL, dir, + flags, FALSE, FALSE); } /* @@ -571,7 +575,8 @@ ins_compl_add( char_u **cptext, // extra text for popup menu or NULL int cdir, int flags, - int adup) // accept duplicate match + int adup, // accept duplicate match + int equal) // match is always accepted by ins_compl_equal { compl_T *match; int dir = (cdir == 0 ? compl_direction : cdir); @@ -613,6 +618,7 @@ ins_compl_add( return FAIL; } match->cp_icase = icase; + match->cp_equal = equal; // match-fname is: // - compl_curr_match->cp_fname if it is a string equal to fname. @@ -676,6 +682,8 @@ ins_compl_add( static int ins_compl_equal(compl_T *match, char_u *str, int len) { + if (match->cp_equal) + return TRUE; if (match->cp_icase) return STRNICMP(match->cp_str, str, (size_t)len) == 0; return STRNCMP(match->cp_str, str, (size_t)len) == 0; @@ -776,7 +784,7 @@ ins_compl_add_matches( for (i = 0; i < num_matches && add_r != FAIL; i++) if ((add_r = ins_compl_add(matches[i], -1, icase, - NULL, NULL, dir, 0, FALSE)) == OK) + NULL, NULL, dir, 0, FALSE, FALSE)) == OK) // if dir was BACKWARD then honor it just once dir = FORWARD; FreeWild(num_matches, matches); @@ -868,7 +876,7 @@ set_completion(colnr_T startcol, list_T // compl_pattern doesn't need to be set compl_orig_text = vim_strnsave(ml_get_curline() + compl_col, compl_length); if (compl_orig_text == NULL || ins_compl_add(compl_orig_text, - -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE) != OK) + -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE, FALSE) != OK) return; ctrl_x_mode = CTRL_X_EVAL; @@ -2365,6 +2373,7 @@ ins_compl_add_tv(typval_T *tv, int dir) int icase = FALSE; int adup = FALSE; int aempty = FALSE; + int aequal = FALSE; char_u *(cptext[CPT_COUNT]); if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL) @@ -2386,6 +2395,8 @@ ins_compl_add_tv(typval_T *tv, int dir) adup = dict_get_number(tv->vval.v_dict, (char_u *)"dup"); if (dict_get_string(tv->vval.v_dict, (char_u *)"empty", FALSE) != NULL) aempty = dict_get_number(tv->vval.v_dict, (char_u *)"empty"); + if (dict_get_string(tv->vval.v_dict, (char_u *)"equal", FALSE) != NULL) + aequal = dict_get_number(tv->vval.v_dict, (char_u *)"equal"); } else { @@ -2394,7 +2405,7 @@ ins_compl_add_tv(typval_T *tv, int dir) } if (word == NULL || (!aempty && *word == NUL)) return FAIL; - return ins_compl_add(word, -1, icase, NULL, cptext, dir, 0, adup); + return ins_compl_add(word, -1, icase, NULL, cptext, dir, 0, adup, aequal); } #endif @@ -3694,7 +3705,7 @@ ins_complete(int c, int enable_pum) vim_free(compl_orig_text); compl_orig_text = vim_strnsave(line + compl_col, compl_length); if (compl_orig_text == NULL || ins_compl_add(compl_orig_text, - -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE) != OK) + -1, p_ic, NULL, NULL, 0, ORIGINAL_TEXT, FALSE, FALSE) != OK) { VIM_CLEAR(compl_pattern); VIM_CLEAR(compl_orig_text);