changeset 32377:3efec53797f3 v9.0.1520

patch 9.0.1520: completion for option name includes all bool options Commit: https://github.com/vim/vim/commit/048d9d25214049dfde04c468c14bd1708fb692b8 Author: Bram Moolenaar <Bram@vim.org> Date: Sat May 6 22:21:11 2023 +0100 patch 9.0.1520: completion for option name includes all bool options Problem: Completion for option name includes all bool options. Solution: Do not recognize the "noinv" prefix. Prefix "no" or "inv" when appropriate.
author Bram Moolenaar <Bram@vim.org>
date Sat, 06 May 2023 23:30:03 +0200
parents d655df6f65d1
children a40f038ce8b5
files src/cmdexpand.c src/option.c src/structs.h src/testdir/test_options.vim src/version.c
diffstat 5 files changed, 40 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }
 
--- 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++;
--- 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
--- 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')
--- 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,