vim-patch:8.2.4570: no command line completion for :profile and :profdel

Problem:    No command line completion for :profile and :profdel.
Solution:   Implement completion. (Yegappan Lakshmanan, closes vim/vim#9955)

1fdf84e033

Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
This commit is contained in:
zeertzjq
2023-01-15 06:40:49 +08:00
parent f2056e4045
commit 064fdad98c
4 changed files with 63 additions and 10 deletions

View File

@@ -1659,8 +1659,9 @@ static const char *set_context_in_lang_cmd(expand_T *xp, const char *arg)
} }
static enum { static enum {
EXP_BREAKPT_ADD, // expand ":breakadd" sub-commands EXP_BREAKPT_ADD, ///< expand ":breakadd" sub-commands
EXP_BREAKPT_DEL, // expand ":breakdel" sub-commands EXP_BREAKPT_DEL, ///< expand ":breakdel" sub-commands
EXP_PROFDEL, ///< expand ":profdel" sub-commands
} breakpt_expand_what; } breakpt_expand_what;
/// Set the completion context for the :breakadd command. Always returns NULL. /// Set the completion context for the :breakadd command. Always returns NULL.
@@ -1671,8 +1672,10 @@ static const char *set_context_in_breakadd_cmd(expand_T *xp, const char *arg, cm
if (cmdidx == CMD_breakadd) { if (cmdidx == CMD_breakadd) {
breakpt_expand_what = EXP_BREAKPT_ADD; breakpt_expand_what = EXP_BREAKPT_ADD;
} else { } else if (cmdidx == CMD_breakdel) {
breakpt_expand_what = EXP_BREAKPT_DEL; breakpt_expand_what = EXP_BREAKPT_DEL;
} else {
breakpt_expand_what = EXP_PROFDEL;
} }
const char *p = skipwhite(arg); const char *p = skipwhite(arg);
@@ -1681,8 +1684,7 @@ static const char *set_context_in_breakadd_cmd(expand_T *xp, const char *arg, cm
} }
const char *subcmd_start = p; const char *subcmd_start = p;
if (strncmp("file ", p, 5) == 0 if (strncmp("file ", p, 5) == 0 || strncmp("func ", p, 5) == 0) {
|| strncmp("func ", p, 5) == 0) {
// :breakadd file [lnum] <filename> // :breakadd file [lnum] <filename>
// :breakadd func [lnum] <funcname> // :breakadd func [lnum] <funcname>
p += 4; p += 4;
@@ -2067,6 +2069,7 @@ static const char *set_context_by_cmdname(const char *cmd, cmdidx_T cmdidx, expa
break; break;
case CMD_breakadd: case CMD_breakadd:
case CMD_profdel:
case CMD_breakdel: case CMD_breakdel:
return set_context_in_breakadd_cmd(xp, arg, cmdidx); return set_context_in_breakadd_cmd(xp, arg, cmdidx);
@@ -2424,12 +2427,19 @@ static char *get_breakadd_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx)
char *opts[] = { "expr", "file", "func", "here" }; char *opts[] = { "expr", "file", "func", "here" };
if (idx >= 0 && idx <= 3) { if (idx >= 0 && idx <= 3) {
// breakadd {expr, file, func, here}
if (breakpt_expand_what == EXP_BREAKPT_ADD) { if (breakpt_expand_what == EXP_BREAKPT_ADD) {
return opts[idx]; return opts[idx];
} else { } else if (breakpt_expand_what == EXP_BREAKPT_DEL) {
// breakdel {func, file, here}
if (idx <= 2) { if (idx <= 2) {
return opts[idx + 1]; return opts[idx + 1];
} }
} else {
// profdel {func, file}
if (idx <= 1) {
return opts[idx + 1];
}
} }
} }
return NULL; return NULL;

View File

@@ -354,7 +354,6 @@ char *get_profile_name(expand_T *xp, int idx)
switch (pexpand_what) { switch (pexpand_what) {
case PEXP_SUBCMD: case PEXP_SUBCMD:
return pexpand_cmds[idx]; return pexpand_cmds[idx];
// case PEXP_FUNC: TODO
default: default:
return NULL; return NULL;
} }
@@ -373,13 +372,17 @@ void set_context_in_profile_cmd(expand_T *xp, const char *arg)
return; return;
} }
if (end_subcmd - arg == 5 && strncmp(arg, "start", 5) == 0) { if ((end_subcmd - arg == 5 && strncmp(arg, "start", 5) == 0)
|| (end_subcmd - arg == 4 && strncmp(arg, "file", 4) == 0)) {
xp->xp_context = EXPAND_FILES; xp->xp_context = EXPAND_FILES;
xp->xp_pattern = skipwhite(end_subcmd); xp->xp_pattern = skipwhite(end_subcmd);
return; return;
} else if (end_subcmd - arg == 4 && strncmp(arg, "func", 4) == 0) {
xp->xp_context = EXPAND_USER_FUNC;
xp->xp_pattern = skipwhite(end_subcmd);
return;
} }
// TODO(tarruda): expand function names after "func"
xp->xp_context = EXPAND_NOTHING; xp->xp_context = EXPAND_NOTHING;
} }

View File

@@ -2805,7 +2805,6 @@ func Test_cmdline_complete_breakdel()
call assert_equal("\"breakdel here Xtest", @:) call assert_equal("\"breakdel here Xtest", @:)
call feedkeys(":breakdel here \<Tab>\<C-B>\"\<CR>", 'tx') call feedkeys(":breakdel here \<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal("\"breakdel here ", @:) call assert_equal("\"breakdel here ", @:)
endfunc endfunc
" this was going over the end of IObuff " this was going over the end of IObuff

View File

@@ -403,6 +403,47 @@ func Test_profile_completion()
call feedkeys(":profile start test_prof\<C-A>\<C-B>\"\<CR>", 'tx') call feedkeys(":profile start test_prof\<C-A>\<C-B>\"\<CR>", 'tx')
call assert_match('^"profile start.* test_profile\.vim', @:) call assert_match('^"profile start.* test_profile\.vim', @:)
call feedkeys(":profile file test_prof\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_match('"profile file test_profile\.vim', @:)
call feedkeys(":profile file test_prof\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_match('"profile file test_profile\.vim', @:)
call feedkeys(":profile file test_prof \<Tab>\<C-B>\"\<CR>", 'tx')
call assert_match('"profile file test_prof ', @:)
call feedkeys(":profile file X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_match('"profile file X1B2C3', @:)
func Xprof_test()
endfunc
call feedkeys(":profile func Xprof\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profile func Xprof_test', @:)
call feedkeys(":profile func Xprof\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profile func Xprof_test', @:)
call feedkeys(":profile func Xprof \<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profile func Xprof ', @:)
call feedkeys(":profile func X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profile func X1B2C3', @:)
call feedkeys(":profdel \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profdel file func', @:)
call feedkeys(":profdel fu\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profdel func', @:)
call feedkeys(":profdel he\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profdel he', @:)
call feedkeys(":profdel here \<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profdel here ', @:)
call feedkeys(":profdel file test_prof\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profdel file test_profile.vim', @:)
call feedkeys(":profdel file X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profdel file X1B2C3', @:)
call feedkeys(":profdel func Xprof\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profdel func Xprof_test', @:)
call feedkeys(":profdel func Xprof_test \<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profdel func Xprof_test ', @:)
call feedkeys(":profdel func X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
call assert_equal('"profdel func X1B2C3', @:)
delfunc Xprof_test
endfunc endfunc
func Test_profile_errors() func Test_profile_errors()