mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.4565: no command line completion for :breakadd and :breakdel
Problem: No command line completion for :breakadd and :breakdel.
Solution: Add completion for :breakadd and :breakdel. (Yegappan Lakshmanan,
closes vim/vim#9950)
6e2e2cc95b
This commit is contained in:
parent
89f45dc155
commit
f2056e4045
@ -2958,7 +2958,8 @@ getcompletion({pat}, {type} [, {filtered}]) *getcompletion()*
|
||||
arglist file names in argument list
|
||||
augroup autocmd groups
|
||||
buffer buffer names
|
||||
behave :behave suboptions
|
||||
behave |:behave| suboptions
|
||||
breakpoint |:breakadd| and |:breakdel| suboptions
|
||||
cmdline |cmdline-completion| result
|
||||
color color schemes
|
||||
command Ex command
|
||||
@ -2974,7 +2975,7 @@ getcompletion({pat}, {type} [, {filtered}]) *getcompletion()*
|
||||
function function name
|
||||
help help subjects
|
||||
highlight highlight groups
|
||||
history :history suboptions
|
||||
history |:history| suboptions
|
||||
locale locale names (as output of locale -a)
|
||||
mapclear buffer argument
|
||||
mapping mapping name
|
||||
|
@ -1658,6 +1658,60 @@ static const char *set_context_in_lang_cmd(expand_T *xp, const char *arg)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static enum {
|
||||
EXP_BREAKPT_ADD, // expand ":breakadd" sub-commands
|
||||
EXP_BREAKPT_DEL, // expand ":breakdel" sub-commands
|
||||
} breakpt_expand_what;
|
||||
|
||||
/// Set the completion context for the :breakadd command. Always returns NULL.
|
||||
static const char *set_context_in_breakadd_cmd(expand_T *xp, const char *arg, cmdidx_T cmdidx)
|
||||
{
|
||||
xp->xp_context = EXPAND_BREAKPOINT;
|
||||
xp->xp_pattern = (char *)arg;
|
||||
|
||||
if (cmdidx == CMD_breakadd) {
|
||||
breakpt_expand_what = EXP_BREAKPT_ADD;
|
||||
} else {
|
||||
breakpt_expand_what = EXP_BREAKPT_DEL;
|
||||
}
|
||||
|
||||
const char *p = skipwhite(arg);
|
||||
if (*p == NUL) {
|
||||
return NULL;
|
||||
}
|
||||
const char *subcmd_start = p;
|
||||
|
||||
if (strncmp("file ", p, 5) == 0
|
||||
|| strncmp("func ", p, 5) == 0) {
|
||||
// :breakadd file [lnum] <filename>
|
||||
// :breakadd func [lnum] <funcname>
|
||||
p += 4;
|
||||
p = skipwhite(p);
|
||||
|
||||
// skip line number (if specified)
|
||||
if (ascii_isdigit(*p)) {
|
||||
p = skipdigits(p);
|
||||
if (*p != ' ') {
|
||||
xp->xp_context = EXPAND_NOTHING;
|
||||
return NULL;
|
||||
}
|
||||
p = skipwhite(p);
|
||||
}
|
||||
if (strncmp("file", subcmd_start, 4) == 0) {
|
||||
xp->xp_context = EXPAND_FILES;
|
||||
} else {
|
||||
xp->xp_context = EXPAND_USER_FUNC;
|
||||
}
|
||||
xp->xp_pattern = (char *)p;
|
||||
} else if (strncmp("expr ", p, 5) == 0) {
|
||||
// :breakadd expr <expression>
|
||||
xp->xp_context = EXPAND_EXPRESSION;
|
||||
xp->xp_pattern = skipwhite(p + 5);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/// Set the completion context in "xp" for command "cmd" with index "cmdidx".
|
||||
/// The argument to the command is "arg" and the argument flags is "argt".
|
||||
/// For user-defined commands and for environment variables, "context" has the
|
||||
@ -2012,6 +2066,10 @@ static const char *set_context_by_cmdname(const char *cmd, cmdidx_T cmdidx, expa
|
||||
xp->xp_pattern = (char *)arg;
|
||||
break;
|
||||
|
||||
case CMD_breakadd:
|
||||
case CMD_breakdel:
|
||||
return set_context_in_breakadd_cmd(xp, arg, cmdidx);
|
||||
|
||||
case CMD_lua:
|
||||
xp->xp_context = EXPAND_LUA;
|
||||
break;
|
||||
@ -2358,6 +2416,25 @@ static char *get_behave_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/// Function given to ExpandGeneric() to obtain the possible arguments of the
|
||||
/// ":breakadd {expr, file, func, here}" command.
|
||||
/// ":breakdel {func, file, here}" command.
|
||||
static char *get_breakadd_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx)
|
||||
{
|
||||
char *opts[] = { "expr", "file", "func", "here" };
|
||||
|
||||
if (idx >= 0 && idx <= 3) {
|
||||
if (breakpt_expand_what == EXP_BREAKPT_ADD) {
|
||||
return opts[idx];
|
||||
} else {
|
||||
if (idx <= 2) {
|
||||
return opts[idx + 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/// Function given to ExpandGeneric() to obtain the possible arguments of the
|
||||
/// ":messages {clear}" command.
|
||||
static char *get_messages_arg(expand_T *xp FUNC_ATTR_UNUSED, int idx)
|
||||
@ -2442,6 +2519,7 @@ static int ExpandOther(expand_T *xp, regmatch_T *rmp, char ***matches, int *numM
|
||||
{ EXPAND_ENV_VARS, get_env_name, true, true },
|
||||
{ EXPAND_USER, get_users, true, false },
|
||||
{ EXPAND_ARGLIST, get_arglist_name, true, false },
|
||||
{ EXPAND_BREAKPOINT, get_breakadd_arg, true, true },
|
||||
{ EXPAND_CHECKHEALTH, get_healthcheck_names, true, false },
|
||||
};
|
||||
int ret = FAIL;
|
||||
|
@ -2654,6 +2654,160 @@ func Test_cmdline_complete_dlist()
|
||||
call assert_equal("\"dlist 10 /pat/ | chistory", @:)
|
||||
endfunc
|
||||
|
||||
" Test for :breakadd argument completion
|
||||
func Test_cmdline_complete_breakadd()
|
||||
call feedkeys(":breakadd \<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd expr file func here", @:)
|
||||
call feedkeys(":breakadd \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd expr", @:)
|
||||
call feedkeys(":breakadd \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd expr", @:)
|
||||
call feedkeys(":breakadd he\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd here", @:)
|
||||
call feedkeys(":breakadd he\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd here", @:)
|
||||
call feedkeys(":breakadd abc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd abc", @:)
|
||||
call assert_equal(['expr', 'file', 'func', 'here'], getcompletion('', 'breakpoint'))
|
||||
let l = getcompletion('not', 'breakpoint')
|
||||
call assert_equal([], l)
|
||||
|
||||
" Test for :breakadd file [lnum] <file>
|
||||
call writefile([], 'Xscript')
|
||||
call feedkeys(":breakadd file Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd file Xscript", @:)
|
||||
call feedkeys(":breakadd file Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd file Xscript", @:)
|
||||
call feedkeys(":breakadd file 20 Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd file 20 Xscript", @:)
|
||||
call feedkeys(":breakadd file 20 Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd file 20 Xscript", @:)
|
||||
call feedkeys(":breakadd file 20x Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd file 20x Xsc\t", @:)
|
||||
call feedkeys(":breakadd file 20\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd file 20\t", @:)
|
||||
call feedkeys(":breakadd file 20x\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd file 20x\t", @:)
|
||||
call feedkeys(":breakadd file Xscript \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd file Xscript ", @:)
|
||||
call feedkeys(":breakadd file X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd file X1B2C3", @:)
|
||||
call delete('Xscript')
|
||||
|
||||
" Test for :breakadd func [lnum] <function>
|
||||
func Xbreak_func()
|
||||
endfunc
|
||||
call feedkeys(":breakadd func Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd func Xbreak_func", @:)
|
||||
call feedkeys(":breakadd func Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd func Xbreak_func", @:)
|
||||
call feedkeys(":breakadd func 20 Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd func 20 Xbreak_func", @:)
|
||||
call feedkeys(":breakadd func 20 Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd func 20 Xbreak_func", @:)
|
||||
call feedkeys(":breakadd func 20x Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd func 20x Xbr\t", @:)
|
||||
call feedkeys(":breakadd func 20\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd func 20\t", @:)
|
||||
call feedkeys(":breakadd func 20x\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd func 20x\t", @:)
|
||||
call feedkeys(":breakadd func Xbreak_func \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd func Xbreak_func ", @:)
|
||||
call feedkeys(":breakadd func X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd func X1B2C3", @:)
|
||||
delfunc Xbreak_func
|
||||
|
||||
" Test for :breakadd expr <expression>
|
||||
let g:Xtest_var = 10
|
||||
call feedkeys(":breakadd expr Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd expr Xtest_var", @:)
|
||||
call feedkeys(":breakadd expr Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd expr Xtest_var", @:)
|
||||
call feedkeys(":breakadd expr Xtest_var \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd expr Xtest_var ", @:)
|
||||
call feedkeys(":breakadd expr X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd expr X1B2C3", @:)
|
||||
unlet g:Xtest_var
|
||||
|
||||
" Test for :breakadd here
|
||||
call feedkeys(":breakadd here Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd here Xtest", @:)
|
||||
call feedkeys(":breakadd here Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd here Xtest", @:)
|
||||
call feedkeys(":breakadd here \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakadd here ", @:)
|
||||
endfunc
|
||||
|
||||
" Test for :breakdel argument completion
|
||||
func Test_cmdline_complete_breakdel()
|
||||
call feedkeys(":breakdel \<C-A>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file func here", @:)
|
||||
call feedkeys(":breakdel \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file", @:)
|
||||
call feedkeys(":breakdel \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file", @:)
|
||||
call feedkeys(":breakdel he\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel here", @:)
|
||||
call feedkeys(":breakdel he\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel here", @:)
|
||||
call feedkeys(":breakdel abc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel abc", @:)
|
||||
|
||||
" Test for :breakdel file [lnum] <file>
|
||||
call writefile([], 'Xscript')
|
||||
call feedkeys(":breakdel file Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file Xscript", @:)
|
||||
call feedkeys(":breakdel file Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file Xscript", @:)
|
||||
call feedkeys(":breakdel file 20 Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file 20 Xscript", @:)
|
||||
call feedkeys(":breakdel file 20 Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file 20 Xscript", @:)
|
||||
call feedkeys(":breakdel file 20x Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file 20x Xsc\t", @:)
|
||||
call feedkeys(":breakdel file 20\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file 20\t", @:)
|
||||
call feedkeys(":breakdel file 20x\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file 20x\t", @:)
|
||||
call feedkeys(":breakdel file Xscript \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file Xscript ", @:)
|
||||
call feedkeys(":breakdel file X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel file X1B2C3", @:)
|
||||
call delete('Xscript')
|
||||
|
||||
" Test for :breakdel func [lnum] <function>
|
||||
func Xbreak_func()
|
||||
endfunc
|
||||
call feedkeys(":breakdel func Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel func Xbreak_func", @:)
|
||||
call feedkeys(":breakdel func Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel func Xbreak_func", @:)
|
||||
call feedkeys(":breakdel func 20 Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel func 20 Xbreak_func", @:)
|
||||
call feedkeys(":breakdel func 20 Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel func 20 Xbreak_func", @:)
|
||||
call feedkeys(":breakdel func 20x Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel func 20x Xbr\t", @:)
|
||||
call feedkeys(":breakdel func 20\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel func 20\t", @:)
|
||||
call feedkeys(":breakdel func 20x\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel func 20x\t", @:)
|
||||
call feedkeys(":breakdel func Xbreak_func \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel func Xbreak_func ", @:)
|
||||
call feedkeys(":breakdel func X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel func X1B2C3", @:)
|
||||
delfunc Xbreak_func
|
||||
|
||||
" Test for :breakdel here
|
||||
call feedkeys(":breakdel here Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel here Xtest", @:)
|
||||
call feedkeys(":breakdel here Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel here Xtest", @:)
|
||||
call feedkeys(":breakdel here \<Tab>\<C-B>\"\<CR>", 'tx')
|
||||
call assert_equal("\"breakdel here ", @:)
|
||||
|
||||
endfunc
|
||||
|
||||
" this was going over the end of IObuff
|
||||
func Test_report_error_with_composing()
|
||||
let caught = 'no'
|
||||
|
@ -896,6 +896,9 @@ endfunc
|
||||
" link to the original file. The backup file should not be modified.
|
||||
func Test_write_backup_symlink()
|
||||
CheckUnix
|
||||
call mkdir('Xbackup')
|
||||
let save_backupdir = &backupdir
|
||||
set backupdir=.,./Xbackup
|
||||
call writefile(['1111'], 'Xfile')
|
||||
silent !ln -s Xfile Xfile.bak
|
||||
|
||||
@ -904,11 +907,18 @@ func Test_write_backup_symlink()
|
||||
write
|
||||
call assert_equal('link', getftype('Xfile.bak'))
|
||||
call assert_equal('Xfile', resolve('Xfile.bak'))
|
||||
" backup file should be created in the 'backup' directory
|
||||
if !has('bsd')
|
||||
" This check fails on FreeBSD
|
||||
call assert_true(filereadable('./Xbackup/Xfile.bak'))
|
||||
endif
|
||||
set backup& backupcopy& backupext&
|
||||
close
|
||||
%bw
|
||||
|
||||
call delete('Xfile')
|
||||
call delete('Xfile.bak')
|
||||
call delete('Xbackup', 'rf')
|
||||
let &backupdir = save_backupdir
|
||||
endfunc
|
||||
|
||||
" Test for ':write ++bin' and ':write ++nobin'
|
||||
|
@ -95,6 +95,7 @@ static const char *command_complete[] = {
|
||||
[EXPAND_TAGS_LISTFILES] = "tag_listfiles",
|
||||
[EXPAND_USER] = "user",
|
||||
[EXPAND_USER_VARS] = "var",
|
||||
[EXPAND_BREAKPOINT] = "breakpoint",
|
||||
};
|
||||
|
||||
/// List of names of address types. Must be alphabetical for completion.
|
||||
|
@ -154,6 +154,7 @@ enum {
|
||||
EXPAND_MAPCLEAR,
|
||||
EXPAND_ARGLIST,
|
||||
EXPAND_DIFF_BUFFERS,
|
||||
EXPAND_BREAKPOINT,
|
||||
EXPAND_CHECKHEALTH,
|
||||
EXPAND_LUA,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user