aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-05-07 08:00:08 +0800
committerGitHub <noreply@github.com>2023-05-07 08:00:08 +0800
commitfa1baa9a47cdb3eed17d48b6011a164d4009d2ee (patch)
tree81a4bf4ff96afbe6b04de4c8a2463e9e25565c7f
parent9e34aa76c132b5637ed2f2dafa4487f4c850bf35 (diff)
downloadrneovim-fa1baa9a47cdb3eed17d48b6011a164d4009d2ee.tar.gz
rneovim-fa1baa9a47cdb3eed17d48b6011a164d4009d2ee.tar.bz2
rneovim-fa1baa9a47cdb3eed17d48b6011a164d4009d2ee.zip
vim-patch:9.0.1520: completion for option name includes all bool options (#23518)
Problem: Completion for option name includes all bool options. Solution: Do not recognize the "noinv" prefix. Prefix "no" or "inv" when appropriate. https://github.com/vim/vim/commit/048d9d25214049dfde04c468c14bd1708fb692b8 Co-authored-by: Bram Moolenaar <Bram@vim.org>
-rw-r--r--src/nvim/cmdexpand.c16
-rw-r--r--src/nvim/ex_cmds_defs.h7
-rw-r--r--src/nvim/option.c5
-rw-r--r--test/old/testdir/test_options.vim12
4 files changed, 34 insertions, 6 deletions
diff --git a/src/nvim/cmdexpand.c b/src/nvim/cmdexpand.c
index 5f135ff7b0..bf0944a81d 100644
--- a/src/nvim/cmdexpand.c
+++ b/src/nvim/cmdexpand.c
@@ -897,12 +897,27 @@ char *ExpandOne(expand_T *xp, char *str, char *orig, int options, int mode)
if (mode == WILD_ALL && xp->xp_numfiles > 0 && !got_int) {
size_t len = 0;
for (int 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 += strlen(xp->xp_files[i]) + 1;
}
ss = xmalloc(len);
*ss = NUL;
for (int 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" : " ");
}
@@ -927,6 +942,7 @@ void 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/nvim/ex_cmds_defs.h b/src/nvim/ex_cmds_defs.h
index 7932649114..2acedb5ec3 100644
--- a/src/nvim/ex_cmds_defs.h
+++ b/src/nvim/ex_cmds_defs.h
@@ -222,11 +222,18 @@ struct exarg {
#define EXFLAG_NR 0x02 // '#': number
#define EXFLAG_PRINT 0x04 // 'p': print
+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
struct expand {
char *xp_pattern; // start of item to expand
int xp_context; // type of expansion
size_t xp_pattern_len; // bytes in xp_pattern before cursor
+ xp_prefix_T xp_prefix;
char *xp_arg; // completion function
LuaRef xp_luaref; // Ref to Lua completion function
sctx_T xp_script_ctx; // SCTX for completion function
diff --git a/src/nvim/option.c b/src/nvim/option.c
index a977fc4f86..fc1fc87b62 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -5133,10 +5133,11 @@ void set_context_in_set_cmd(expand_T *xp, char *arg, int opt_flags)
}
if (strncmp(p, "no", 2) == 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 = p;
diff --git a/test/old/testdir/test_options.vim b/test/old/testdir/test_options.vim
index cf8bf1903f..ada44e5eed 100644
--- a/test/old/testdir/test_options.vim
+++ b/test/old/testdir/test_options.vim
@@ -282,13 +282,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')