]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1520: completion for option name includes all bool options v9.0.1520
authorBram Moolenaar <Bram@vim.org>
Sat, 6 May 2023 21:21:11 +0000 (22:21 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 6 May 2023 21:21:11 +0000 (22:21 +0100)
Problem:    Completion for option name includes all bool options.
Solution:   Do not recognize the "noinv" prefix.  Prefix "no" or "inv" when
            appropriate.

src/cmdexpand.c
src/option.c
src/structs.h
src/testdir/test_options.vim
src/version.c

index b5a7a3eb29feb273a7b3f4b96f6170a0d13092af..4ef9c31121fe4f1f9e62f0a02dc99a07d24a6d18 100644 (file)
@@ -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;
 }
 
index 1a9ba2534ad9c7662438af560a57c099e889510a..e5e78d823f646be03ea7bd06d3936b20cab4f581 100644 (file)
@@ -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++;
index 7de0d9e6d0c1446b177a7752b7d395c5849c8aa2..03fb92e40d0a58063bd44c786d5efe32b40d93c0 100644 (file)
@@ -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
index e1b5622a8b2c905b7167f9b34c7de736f0e87ad7..d33389ac8db365909da2482381c822bbe873cfa3 100644 (file)
@@ -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')
index 2aa0ef71832911ecb516f1ee822ae93528cb61ce..35ea18aea5e5d8f5ff47445f05d37d14911609fe 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1520,
 /**/
     1519,
 /**/