From cd43effecab02c6c28b1c4a3a14f91b8c3f26c0d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 29 Mar 2018 15:55:38 +0200 Subject: patch 8.0.1649: no completion for argument list commands Problem: No completion for argument list commands. Solution: Add arglist completion. (Yegappan Lakshmanan, closes #2706) --- runtime/doc/eval.txt | 1 + runtime/doc/map.txt | 1 + src/ex_cmds2.c | 15 +++++++++++++++ src/ex_docmd.c | 8 ++++++++ src/ex_getln.c | 1 + src/proto/ex_cmds2.pro | 1 + src/testdir/test_cmdline.vim | 5 +++++ src/version.c | 2 ++ src/vim.h | 1 + 9 files changed, 35 insertions(+) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 387186f83..e5f0b10a5 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -4469,6 +4469,7 @@ getcompletion({pat}, {type} [, {filtered}]) *getcompletion()* specifies what for. The following completion types are supported: + arglist file names in argument list augroup autocmd groups buffer buffer names behave :behave suboptions diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt index 2efeb3bc6..18763f439 100644 --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -1272,6 +1272,7 @@ By default, the arguments of user defined commands do not undergo completion. However, by specifying one or the other of the following attributes, argument completion can be enabled: + -complete=arglist file names in argument list -complete=augroup autocmd groups -complete=buffer buffer names -complete=behave :behave suboptions diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index ae4ce337d..d4ddb82b7 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -3314,6 +3314,21 @@ alist_add_list( #endif /* FEAT_LISTCMDS */ +#if defined(FEAT_CMDL_COMPL) || defined(PROTO) +/* + * Function given to ExpandGeneric() to obtain the possible arguments of the + * argedit and argdelete commands. + */ + char_u * +get_arglist_name(expand_T *xp UNUSED, int idx) +{ + if (idx >= ARGCOUNT) + return NULL; + + return alist_name(&ARGLIST[idx]); +} +#endif + #ifdef FEAT_EVAL /* * ":compiler[!] {name}" diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 97bbd0429..c2d69670b 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -4293,6 +4293,13 @@ set_one_cmd_context( break; #endif + case CMD_argdelete: + while ((xp->xp_pattern = vim_strchr(arg, ' ')) != NULL) + arg = xp->xp_pattern + 1; + xp->xp_context = EXPAND_ARGLIST; + xp->xp_pattern = arg; + break; + #endif /* FEAT_CMDL_COMPL */ default: @@ -5879,6 +5886,7 @@ static struct char *name; } command_complete[] = { + {EXPAND_ARGLIST, "arglist"}, {EXPAND_AUGROUP, "augroup"}, {EXPAND_BEHAVE, "behave"}, {EXPAND_BUFFERS, "buffer"}, diff --git a/src/ex_getln.c b/src/ex_getln.c index 6119ad216..48cccf18e 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -4989,6 +4989,7 @@ ExpandFromContext( #endif {EXPAND_ENV_VARS, get_env_name, TRUE, TRUE}, {EXPAND_USER, get_users, TRUE, FALSE}, + {EXPAND_ARGLIST, get_arglist_name, TRUE, FALSE}, }; int i; diff --git a/src/proto/ex_cmds2.pro b/src/proto/ex_cmds2.pro index 63d377d64..a7d19d768 100644 --- a/src/proto/ex_cmds2.pro +++ b/src/proto/ex_cmds2.pro @@ -67,6 +67,7 @@ void ex_argedit(exarg_T *eap); void ex_argadd(exarg_T *eap); void ex_argdelete(exarg_T *eap); void ex_listdo(exarg_T *eap); +char_u *get_arglist_name(expand_T *xp, int idx); void ex_compiler(exarg_T *eap); void ex_runtime(exarg_T *eap); int do_in_path(char_u *path, char_u *name, int flags, void (*callback)(char_u *fname, void *ck), void *cookie); diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim index 832413e81..8755fbf1a 100644 --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -137,6 +137,11 @@ func Test_getcompletion() let l = getcompletion('v:notexists', 'var') call assert_equal([], l) + args a.c b.c + let l = getcompletion('', 'arglist') + call assert_equal(['a.c', 'b.c'], l) + %argdelete + let l = getcompletion('', 'augroup') call assert_true(index(l, 'END') >= 0) let l = getcompletion('blahblah', 'augroup') diff --git a/src/version.c b/src/version.c index 00a07bc10..1e277129c 100644 --- a/src/version.c +++ b/src/version.c @@ -766,6 +766,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1649, /**/ 1648, /**/ diff --git a/src/vim.h b/src/vim.h index 42007edb6..626c0ad12 100644 --- a/src/vim.h +++ b/src/vim.h @@ -781,6 +781,7 @@ extern int (*dyn_libintl_putenv)(const char *envstring); #define EXPAND_PACKADD 45 #define EXPAND_MESSAGES 46 #define EXPAND_MAPCLEAR 47 +#define EXPAND_ARGLIST 48 /* Values for exmode_active (0 is no exmode) */ #define EXMODE_NORMAL 1 -- cgit v1.2.1