Mercurial > vim
changeset 28091:554f493902ea v8.2.4570
patch 8.2.4570: no command line completion for :profile and :profdel
Commit: https://github.com/vim/vim/commit/1fdf84e033f8c4eead3b4ccebb1969cfbc7d10db
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Tue Mar 15 10:53:09 2022 +0000
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 https://github.com/vim/vim/issues/9955)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 15 Mar 2022 12:00:04 +0100 |
parents | 55c0661bfe1f |
children | 8b1ab22de19d |
files | src/cmdexpand.c src/profiler.c src/testdir/test_cmdline.vim src/testdir/test_profile.vim src/version.c |
diffstat | 5 files changed, 67 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -1606,7 +1606,8 @@ set_context_in_lang_cmd(expand_T *xp, ch static enum { 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; /* @@ -1623,16 +1624,17 @@ set_context_in_breakadd_cmd(expand_T *xp if (cmdidx == CMD_breakadd) breakpt_expand_what = EXP_BREAKPT_ADD; + else if (cmdidx == CMD_breakdel) + breakpt_expand_what = EXP_BREAKPT_DEL; else - breakpt_expand_what = EXP_BREAKPT_DEL; + breakpt_expand_what = EXP_PROFDEL; p = skipwhite(arg); if (*p == NUL) return NULL; subcmd_start = p; - if (STRNCMP("file ", p, 5) == 0 || - STRNCMP("func ", p, 5) == 0) + if (STRNCMP("file ", p, 5) == 0 || STRNCMP("func ", p, 5) == 0) { // :breakadd file [lnum] <filename> // :breakadd func [lnum] <funcname> @@ -2025,6 +2027,7 @@ set_context_by_cmdname( #ifdef FEAT_EVAL case CMD_breakadd: + case CMD_profdel: case CMD_breakdel: return set_context_in_breakadd_cmd(xp, arg, cmdidx); #endif @@ -2432,11 +2435,19 @@ get_breakadd_arg(expand_T *xp UNUSED, in if (idx >=0 && idx <= 3) { + // breakadd {expr, file, func, here} if (breakpt_expand_what == EXP_BREAKPT_ADD) return (char_u *)opts[idx]; + else if (breakpt_expand_what == EXP_BREAKPT_DEL) + { + // breakdel {func, file, here} + if (idx <= 2) + return (char_u *)opts[idx + 1]; + } else { - if (idx <= 2) + // profdel {func, file} + if (idx <= 1) return (char_u *)opts[idx + 1]; } }
--- a/src/profiler.c +++ b/src/profiler.c @@ -376,7 +376,6 @@ get_profile_name(expand_T *xp UNUSED, in { case PEXP_SUBCMD: return (char_u *)pexpand_cmds[idx]; - // case PEXP_FUNC: TODO default: return NULL; } @@ -399,14 +398,20 @@ set_context_in_profile_cmd(expand_T *xp, if (*end_subcmd == NUL) 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_pattern = skipwhite(end_subcmd); 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: expand function names after "func" xp->xp_context = EXPAND_NOTHING; }
--- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -3158,7 +3158,6 @@ func Test_cmdline_complete_breakdel() call assert_equal("\"breakdel here Xtest", @:) call feedkeys(":breakdel here \<Tab>\<C-B>\"\<CR>", 'tx') call assert_equal("\"breakdel here ", @:) - endfunc " vim: shiftwidth=2 sts=2 expandtab
--- a/src/testdir/test_profile.vim +++ b/src/testdir/test_profile.vim @@ -434,6 +434,47 @@ func Test_profile_completion() call feedkeys(":profile start test_prof\<C-A>\<C-B>\"\<CR>", 'tx') 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 func Test_profile_errors()