diff options
author | Bram Moolenaar <Bram@vim.org> | 2023-05-06 22:21:11 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-05-06 22:21:11 +0100 |
commit | 048d9d25214049dfde04c468c14bd1708fb692b8 (patch) | |
tree | 5e902e2b54814aa8df9c582b73eb564e0b28d5c0 /src | |
parent | 0b70aeb49d6dfd1879162f202150cb1ed5f024ad (diff) |
patch 9.0.1520: completion for option name includes all bool optionsv9.0.1520
Problem: Completion for option name includes all bool options.
Solution: Do not recognize the "noinv" prefix. Prefix "no" or "inv" when
appropriate.
Diffstat (limited to 'src')
-rw-r--r-- | src/cmdexpand.c | 18 | ||||
-rw-r--r-- | src/option.c | 8 | ||||
-rw-r--r-- | src/structs.h | 7 | ||||
-rw-r--r-- | src/testdir/test_options.vim | 12 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 40 insertions, 7 deletions
diff --git a/src/cmdexpand.c b/src/cmdexpand.c index b5a7a3eb29..4ef9c31121 100644 --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -1012,14 +1012,31 @@ ExpandOne( { len = 0; for (i = 0; i < xp->xp_numfiles; ++i) + { + if (i > 0) + { + if (xp->xp_prefix == XP_PREFIX_NO) + len += 2; // prefix "no" + else if (xp->xp_prefix == XP_PREFIX_INV) + len += 3; // prefix "inv" + } len += (long_u)STRLEN(xp->xp_files[i]) + 1; + } ss = alloc(len); if (ss != NULL) { *ss = NUL; for (i = 0; i < xp->xp_numfiles; ++i) { + if (i > 0) + { + if (xp->xp_prefix == XP_PREFIX_NO) + STRCAT(ss, "no"); + else if (xp->xp_prefix == XP_PREFIX_INV) + STRCAT(ss, "inv"); + } STRCAT(ss, xp->xp_files[i]); + if (i != xp->xp_numfiles - 1) STRCAT(ss, (options & WILD_USE_NL) ? "\n" : " "); } @@ -1044,6 +1061,7 @@ ExpandInit(expand_T *xp) { CLEAR_POINTER(xp); xp->xp_backslash = XP_BS_NONE; + xp->xp_prefix = XP_PREFIX_NONE; xp->xp_numfiles = -1; } diff --git a/src/option.c b/src/option.c index 1a9ba2534a..e5e78d823f 100644 --- a/src/option.c +++ b/src/option.c @@ -7265,11 +7265,13 @@ set_context_in_set_cmd( if (STRNCMP(p, "no", 2) == 0 && STRNCMP(p, "novice", 6) != 0) { xp->xp_context = EXPAND_BOOL_SETTINGS; + xp->xp_prefix = XP_PREFIX_NO; p += 2; } - if (STRNCMP(p, "inv", 3) == 0) + else if (STRNCMP(p, "inv", 3) == 0) { xp->xp_context = EXPAND_BOOL_SETTINGS; + xp->xp_prefix = XP_PREFIX_INV; p += 3; } xp->xp_pattern = arg = p; @@ -7528,7 +7530,7 @@ ExpandSettings( if (options[opt_idx].var == NULL) continue; if (xp->xp_context == EXPAND_BOOL_SETTINGS - && !(options[opt_idx].flags & P_BOOL)) + && !(options[opt_idx].flags & P_BOOL)) continue; is_term_opt = istermoption_idx(opt_idx); if (is_term_opt && num_normal > 0) @@ -7600,7 +7602,7 @@ ExpandSettings( name_buf[4] = NUL; if (match_str(name_buf, regmatch, *matches, count, - (loop == 0), fuzzy, fuzzystr, fuzmatch)) + (loop == 0), fuzzy, fuzzystr, fuzmatch)) { if (loop == 0) num_term++; diff --git a/src/structs.h b/src/structs.h index 7de0d9e6d0..03fb92e40d 100644 --- a/src/structs.h +++ b/src/structs.h @@ -578,6 +578,12 @@ typedef struct buffheader_T sr_old_redobuff; } save_redo_T; +typedef enum { + XP_PREFIX_NONE, // prefix not used + XP_PREFIX_NO, // "no" prefix for bool option + XP_PREFIX_INV, // "inv" prefix for bool option +} xp_prefix_T; + /* * used for completion on the command line */ @@ -586,6 +592,7 @@ typedef struct expand char_u *xp_pattern; // start of item to expand int xp_context; // type of expansion int xp_pattern_len; // bytes in xp_pattern before cursor + xp_prefix_T xp_prefix; #if defined(FEAT_EVAL) char_u *xp_arg; // completion function sctx_T xp_script_ctx; // SCTX for completion function diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim index e1b5622a8b..d33389ac8d 100644 --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -278,13 +278,17 @@ func Test_set_completion() call feedkeys(":setglobal di\<C-A>\<C-B>\"\<CR>", 'tx') call assert_equal('"setglobal dictionary diff diffexpr diffopt digraph directory display', @:) - " Expand boolean options. When doing :set no<Tab> - " vim displays the options names without "no" but completion uses "no...". + " Expand boolean options. When doing :set no<Tab> Vim prefixes the option + " names with "no". call feedkeys(":set nodi\<C-A>\<C-B>\"\<CR>", 'tx') - call assert_equal('"set nodiff digraph', @:) + call assert_equal('"set nodiff nodigraph', @:) call feedkeys(":set invdi\<C-A>\<C-B>\"\<CR>", 'tx') - call assert_equal('"set invdiff digraph', @:) + call assert_equal('"set invdiff invdigraph', @:) + + " Expanding "set noinv" does nothing. + call feedkeys(":set noinv\<C-A>\<C-B>\"\<CR>", 'tx') + call assert_equal('"set noinv', @:) " Expand abbreviation of options. call feedkeys(":set ts\<C-A>\<C-B>\"\<CR>", 'tx') diff --git a/src/version.c b/src/version.c index 2aa0ef7183..35ea18aea5 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1520, +/**/ 1519, /**/ 1518, |