vim-patch:8.1.1732: completion in cmdwin does not work for buffer-local commands

Problem:    Completion in cmdwin does not work for buffer-local commands.
Solution:   Use the right buffer. (closes vim/vim#4711)
f03e328348
This commit is contained in:
Jan Edmund Lazo
2019-11-24 21:50:24 -05:00
parent edb194f330
commit 7a0a2eb310
2 changed files with 35 additions and 7 deletions

View File

@@ -5133,9 +5133,11 @@ static void uc_list(char_u *name, size_t name_len)
ucmd_T *cmd; ucmd_T *cmd;
int len; int len;
uint32_t a; uint32_t a;
garray_T *gap;
gap = &curbuf->b_ucmds; // In cmdwin, the alternative buffer should be used.
garray_T *gap = (cmdwin_type != 0 && get_cmdline_type() == NUL)
? &prevwin->w_buffer->b_ucmds
: &curbuf->b_ucmds;
for (;; ) { for (;; ) {
for (i = 0; i < gap->ga_len; ++i) { for (i = 0; i < gap->ga_len; ++i) {
cmd = USER_CMD_GA(gap, i); cmd = USER_CMD_GA(gap, i);
@@ -5984,13 +5986,21 @@ char_u *get_user_cmd_addr_type(expand_T *xp, int idx)
/* /*
* Function given to ExpandGeneric() to obtain the list of user command names. * Function given to ExpandGeneric() to obtain the list of user command names.
*/ */
char_u *get_user_commands(expand_T *xp, int idx) char_u *get_user_commands(expand_T *xp FUNC_ATTR_UNUSED, int idx)
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
{ {
if (idx < curbuf->b_ucmds.ga_len) // In cmdwin, the alternative buffer should be used.
return USER_CMD_GA(&curbuf->b_ucmds, idx)->uc_name; const buf_T *const buf = (cmdwin_type != 0 && get_cmdline_type() == NUL)
idx -= curbuf->b_ucmds.ga_len; ? prevwin->w_buffer
if (idx < ucmds.ga_len) : curbuf;
if (idx < buf->b_ucmds.ga_len) {
return USER_CMD_GA(&buf->b_ucmds, idx)->uc_name;
}
idx -= buf->b_ucmds.ga_len;
if (idx < ucmds.ga_len) {
return USER_CMD(idx)->uc_name; return USER_CMD(idx)->uc_name;
}
return NULL; return NULL;
} }

View File

@@ -285,3 +285,21 @@ func Test_compl_feedkeys()
bwipe! bwipe!
set completeopt& set completeopt&
endfunc endfunc
func Test_compl_in_cmdwin()
set wildmenu wildchar=<Tab>
com! -nargs=1 -complete=command GetInput let input = <q-args>
com! -buffer TestCommand echo 'TestCommand'
let input = ''
call feedkeys("q:iGetInput T\<C-x>\<C-v>\<CR>", 'tx!')
call assert_equal('TestCommand', input)
let input = ''
call feedkeys("q::GetInput T\<Tab>\<CR>:q\<CR>", 'tx!')
call assert_equal('T', input)
delcom TestCommand
delcom GetInput
set wildmenu& wildchar&
endfunc