diff options
-rw-r--r-- | src/evalvars.c | 6 | ||||
-rw-r--r-- | src/ex_getln.c | 9 | ||||
-rw-r--r-- | src/proto/ex_getln.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_ins_complete.vim | 49 | ||||
-rw-r--r-- | src/usercmd.c | 18 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 73 insertions, 12 deletions
diff --git a/src/evalvars.c b/src/evalvars.c index 6851eef9b..afbab79ff 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -2074,8 +2074,7 @@ get_user_var_name(expand_T *xp, int idx) ht = #ifdef FEAT_CMDWIN // In cmdwin, the alternative buffer should be used. - (cmdwin_type != 0 && get_cmdline_type() == NUL) ? - &prevwin->w_buffer->b_vars->dv_hashtab : + is_in_cmdwin() ? &prevwin->w_buffer->b_vars->dv_hashtab : #endif &curbuf->b_vars->dv_hashtab; if (bdone < ht->ht_used) @@ -2093,8 +2092,7 @@ get_user_var_name(expand_T *xp, int idx) ht = #ifdef FEAT_CMDWIN // In cmdwin, the alternative window should be used. - (cmdwin_type != 0 && get_cmdline_type() == NUL) ? - &prevwin->w_vars->dv_hashtab : + is_in_cmdwin() ? &prevwin->w_vars->dv_hashtab : #endif &curwin->w_vars->dv_hashtab; if (wdone < ht->ht_used) diff --git a/src/ex_getln.c b/src/ex_getln.c index 258548ed8..2616afc42 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -4485,6 +4485,15 @@ open_cmdwin(void) return cmdwin_result; } + +/* + * Return TRUE if in the cmdwin, not editing the command line. + */ + int +is_in_cmdwin(void) +{ + return cmdwin_type != 0 && get_cmdline_type() == NUL; +} #endif // FEAT_CMDWIN /* diff --git a/src/proto/ex_getln.pro b/src/proto/ex_getln.pro index d047e39da..d6f19110e 100644 --- a/src/proto/ex_getln.pro +++ b/src/proto/ex_getln.pro @@ -38,6 +38,7 @@ int get_cmdline_type(void); int get_cmdline_firstc(void); int get_list_range(char_u **str, int *num1, int *num2); char *check_cedit(void); +int is_in_cmdwin(void); char_u *script_get(exarg_T *eap, char_u *cmd); void get_user_input(typval_T *argvars, typval_T *rettv, int inputdialog, int secret); /* vim: set ft=c : */ diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index b0914d906..ee6641835 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -373,6 +373,14 @@ func Test_compl_feedkeys() set completeopt& endfunc +func s:ComplInCmdwin_GlobalCompletion(a, l, p) + return 'global' +endfunc + +func s:ComplInCmdwin_LocalCompletion(a, l, p) + return 'local' +endfunc + func Test_compl_in_cmdwin() CheckFeature cmdwin @@ -411,6 +419,47 @@ func Test_compl_in_cmdwin() call feedkeys("q::GetInput b:test_\<Tab>\<CR>:q\<CR>", 'tx!') call assert_equal('b:test_', input) + + " Argument completion of buffer-local command + func s:ComplInCmdwin_GlobalCompletionList(a, l, p) + return ['global'] + endfunc + + func s:ComplInCmdwin_LocalCompletionList(a, l, p) + return ['local'] + endfunc + + func s:ComplInCmdwin_CheckCompletion(arg) + call assert_equal('local', a:arg) + endfunc + + com! -nargs=1 -complete=custom,<SID>ComplInCmdwin_GlobalCompletion + \ TestCommand call s:ComplInCmdwin_CheckCompletion(<q-args>) + com! -buffer -nargs=1 -complete=custom,<SID>ComplInCmdwin_LocalCompletion + \ TestCommand call s:ComplInCmdwin_CheckCompletion(<q-args>) + call feedkeys("q:iTestCommand \<Tab>\<CR>", 'tx!') + + com! -nargs=1 -complete=customlist,<SID>ComplInCmdwin_GlobalCompletionList + \ TestCommand call s:ComplInCmdwin_CheckCompletion(<q-args>) + com! -buffer -nargs=1 -complete=customlist,<SID>ComplInCmdwin_LocalCompletionList + \ TestCommand call s:ComplInCmdwin_CheckCompletion(<q-args>) + + call feedkeys("q:iTestCommand \<Tab>\<CR>", 'tx!') + + func! s:ComplInCmdwin_CheckCompletion(arg) + call assert_equal('global', a:arg) + endfunc + new + call feedkeys("q:iTestCommand \<Tab>\<CR>", 'tx!') + quit + + delfunc s:ComplInCmdwin_GlobalCompletion + delfunc s:ComplInCmdwin_LocalCompletion + delfunc s:ComplInCmdwin_GlobalCompletionList + delfunc s:ComplInCmdwin_LocalCompletionList + delfunc s:ComplInCmdwin_CheckCompletion + + delcom -buffer TestCommand delcom TestCommand delcom GetInput unlet w:test_winvar diff --git a/src/usercmd.c b/src/usercmd.c index 0050647ab..332f99536 100644 --- a/src/usercmd.c +++ b/src/usercmd.c @@ -141,7 +141,11 @@ find_ucmd( /* * Look for buffer-local user commands first, then global ones. */ - gap = &curbuf->b_ucmds; + gap = +#ifdef FEAT_CMDWIN + is_in_cmdwin() ? &prevwin->w_buffer->b_ucmds : +#endif + &curbuf->b_ucmds; for (;;) { for (j = 0; j < gap->ga_len; ++j) @@ -303,7 +307,7 @@ get_user_commands(expand_T *xp UNUSED, int idx) // In cmdwin, the alternative buffer should be used. buf_T *buf = #ifdef FEAT_CMDWIN - (cmdwin_type != 0 && get_cmdline_type() == NUL) ? prevwin->w_buffer : + is_in_cmdwin() ? prevwin->w_buffer : #endif curbuf; @@ -330,10 +334,9 @@ get_user_command_name(int idx, int cmdidx) // In cmdwin, the alternative buffer should be used. buf_T *buf = #ifdef FEAT_CMDWIN - (cmdwin_type != 0 && get_cmdline_type() == NUL) - ? prevwin->w_buffer : + is_in_cmdwin() ? prevwin->w_buffer : #endif - curbuf; + curbuf; if (idx < buf->b_ucmds.ga_len) return USER_CMD_GA(&buf->b_ucmds, idx)->uc_name; @@ -420,10 +423,9 @@ uc_list(char_u *name, size_t name_len) // In cmdwin, the alternative buffer should be used. gap = #ifdef FEAT_CMDWIN - (cmdwin_type != 0 && get_cmdline_type() == NUL) ? - &prevwin->w_buffer->b_ucmds : + is_in_cmdwin() ? &prevwin->w_buffer->b_ucmds : #endif - &curbuf->b_ucmds; + &curbuf->b_ucmds; for (;;) { for (i = 0; i < gap->ga_len; ++i) diff --git a/src/version.c b/src/version.c index fada36201..b30979a0b 100644 --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3629, +/**/ 3628, /**/ 3627, |