diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/eval.c | 11 | ||||
| -rw-r--r-- | src/nvim/testdir/test_ins_complete.vim | 24 | 
2 files changed, 32 insertions, 3 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index a2490be355..cccf1e50ff 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -2994,7 +2994,6 @@ char_u *get_user_var_name(expand_T *xp, int idx)    static size_t tdone;    static size_t vidx;    static hashitem_T   *hi; -  hashtab_T           *ht;    if (idx == 0) {      gdone = bdone = wdone = vidx = 0; @@ -3015,7 +3014,10 @@ char_u *get_user_var_name(expand_T *xp, int idx)    }    // b: variables -  ht = &curbuf->b_vars->dv_hashtab; +  // In cmdwin, the alternative buffer should be used. +  hashtab_T *ht = (cmdwin_type != 0 && get_cmdline_type() == NUL) +    ? &prevwin->w_buffer->b_vars->dv_hashtab +    : &curbuf->b_vars->dv_hashtab;    if (bdone < ht->ht_used) {      if (bdone++ == 0)        hi = ht->ht_array; @@ -3027,7 +3029,10 @@ char_u *get_user_var_name(expand_T *xp, int idx)    }    // w: variables -  ht = &curwin->w_vars->dv_hashtab; +  // In cmdwin, the alternative window should be used. +  ht = (cmdwin_type != 0 && get_cmdline_type() == NUL) +    ? &prevwin->w_vars->dv_hashtab +    : &curwin->w_vars->dv_hashtab;    if (wdone < ht->ht_used) {      if (wdone++ == 0)        hi = ht->ht_array; diff --git a/src/nvim/testdir/test_ins_complete.vim b/src/nvim/testdir/test_ins_complete.vim index 1339a9f25d..b8632b9595 100644 --- a/src/nvim/testdir/test_ins_complete.vim +++ b/src/nvim/testdir/test_ins_complete.vim @@ -327,7 +327,10 @@ 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 w:test_winvar = 'winvar' +  let b:test_bufvar = 'bufvar' +  " User-defined commands    let input = ''    call feedkeys("q:iGetInput T\<C-x>\<C-v>\<CR>", 'tx!')    call assert_equal('TestCommand', input) @@ -336,8 +339,29 @@ func Test_compl_in_cmdwin()    call feedkeys("q::GetInput T\<Tab>\<CR>:q\<CR>", 'tx!')    call assert_equal('T', input) +  com! -nargs=1 -complete=var GetInput let input = <q-args> +  " Window-local variables +  let input = '' +  call feedkeys("q:iGetInput w:test_\<C-x>\<C-v>\<CR>", 'tx!') +  call assert_equal('w:test_winvar', input) + +  let input = '' +  call feedkeys("q::GetInput w:test_\<Tab>\<CR>:q\<CR>", 'tx!') +  call assert_equal('w:test_', input) + +  " Buffer-local variables +  let input = '' +  call feedkeys("q:iGetInput b:test_\<C-x>\<C-v>\<CR>", 'tx!') +  call assert_equal('b:test_bufvar', input) + +  let input = '' +  call feedkeys("q::GetInput b:test_\<Tab>\<CR>:q\<CR>", 'tx!') +  call assert_equal('b:test_', input) +    delcom TestCommand    delcom GetInput +  unlet w:test_winvar +  unlet b:test_bufvar    set wildmenu& wildchar&  endfunc  | 
