summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-05-06 22:21:11 +0100
committerBram Moolenaar <Bram@vim.org>2023-05-06 22:21:11 +0100
commit048d9d25214049dfde04c468c14bd1708fb692b8 (patch)
tree5e902e2b54814aa8df9c582b73eb564e0b28d5c0
parent0b70aeb49d6dfd1879162f202150cb1ed5f024ad (diff)
downloadvim-git-048d9d25214049dfde04c468c14bd1708fb692b8.tar.gz
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.
-rw-r--r--src/cmdexpand.c18
-rw-r--r--src/option.c8
-rw-r--r--src/structs.h7
-rw-r--r--src/testdir/test_options.vim12
-rw-r--r--src/version.c2
5 files changed, 40 insertions, 7 deletions
diff --git a/src/cmdexpand.c b/src/cmdexpand.c
index b5a7a3eb2..4ef9c3112 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 1a9ba2534..e5e78d823 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 7de0d9e6d..03fb92e40 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 e1b5622a8..d33389ac8 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 2aa0ef718..35ea18aea 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,