# HG changeset patch # User Bram Moolenaar # Date 1563825605 -7200 # Node ID fa6c9047ec70ad3bc4af71bec2a1f4fc3c076212 # Parent ed03a1fb37ce98e80cee82ea8444b0673028a303 patch 8.1.1732: completion in cmdwin does not work for buffer-local commands commit https://github.com/vim/vim/commit/f03e328348f87e1fe8ce4aad2a6a4237b9f78ce3 Author: Bram Moolenaar Date: Mon Jul 22 21:55:18 2019 +0200 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 https://github.com/vim/vim/issues/4711) diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -313,3 +313,21 @@ func Test_compl_feedkeys() bwipe! set completeopt& endfunc + +func Test_compl_in_cmdwin() + set wildmenu wildchar= + com! -nargs=1 -complete=command GetInput let input = + com! -buffer TestCommand echo 'TestCommand' + + let input = '' + call feedkeys("q:iGetInput T\\\", 'tx!') + call assert_equal('TestCommand', input) + + let input = '' + call feedkeys("q::GetInput T\\:q\", 'tx!') + call assert_equal('T', input) + + delcom TestCommand + delcom GetInput + set wildmenu& wildchar& +endfunc diff --git a/src/usercmd.c b/src/usercmd.c --- a/src/usercmd.c +++ b/src/usercmd.c @@ -309,9 +309,16 @@ get_user_command_name(int idx) char_u * get_user_commands(expand_T *xp UNUSED, int idx) { - if (idx < curbuf->b_ucmds.ga_len) - return USER_CMD_GA(&curbuf->b_ucmds, idx)->uc_name; - idx -= curbuf->b_ucmds.ga_len; + // In cmdwin, the alternative buffer should be used. + buf_T *buf = +#ifdef FEAT_CMDWIN + (cmdwin_type != 0 && get_cmdline_type() == NUL) ? prevwin->w_buffer : +#endif + 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 NULL; @@ -395,7 +402,13 @@ uc_list(char_u *name, size_t name_len) long a; garray_T *gap; - gap = &curbuf->b_ucmds; + /* In cmdwin, the alternative buffer should be used. */ + gap = +#ifdef FEAT_CMDWIN + (cmdwin_type != 0 && get_cmdline_type() == NUL) ? + &prevwin->w_buffer->b_ucmds : +#endif + &curbuf->b_ucmds; for (;;) { for (i = 0; i < gap->ga_len; ++i) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -778,6 +778,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1732, +/**/ 1731, /**/ 1730,