To: vim_dev@googlegroups.com Subject: Patch 8.2.3629 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3629 Problem: Command completion in cmdline window uses global user commands, not local commands for the window where it was opened from. Solution: Use local commands. (closes #9168) Files: src/ex_getln.c, src/proto/ex_getln.pro, src/evalvars.c, src/usercmd.c, src/testdir/test_ins_complete.vim *** ../vim-8.2.3628/src/ex_getln.c 2021-10-17 17:20:20.399745698 +0100 --- src/ex_getln.c 2021-11-20 19:04:33.830004928 +0000 *************** *** 4485,4490 **** --- 4485,4499 ---- 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 /* *** ../vim-8.2.3628/src/proto/ex_getln.pro 2021-10-17 17:20:20.399745698 +0100 --- src/proto/ex_getln.pro 2021-11-20 19:09:38.689499396 +0000 *************** *** 38,43 **** --- 38,44 ---- 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 : */ *** ../vim-8.2.3628/src/evalvars.c 2021-11-02 21:39:40.097064632 +0000 --- src/evalvars.c 2021-11-20 19:03:13.346152946 +0000 *************** *** 2074,2081 **** 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 : #endif &curbuf->b_vars->dv_hashtab; if (bdone < ht->ht_used) --- 2074,2080 ---- ht = #ifdef FEAT_CMDWIN // In cmdwin, the alternative buffer should be used. ! is_in_cmdwin() ? &prevwin->w_buffer->b_vars->dv_hashtab : #endif &curbuf->b_vars->dv_hashtab; if (bdone < ht->ht_used) *************** *** 2093,2100 **** ht = #ifdef FEAT_CMDWIN // In cmdwin, the alternative window should be used. ! (cmdwin_type != 0 && get_cmdline_type() == NUL) ? ! &prevwin->w_vars->dv_hashtab : #endif &curwin->w_vars->dv_hashtab; if (wdone < ht->ht_used) --- 2092,2098 ---- ht = #ifdef FEAT_CMDWIN // In cmdwin, the alternative window should be used. ! is_in_cmdwin() ? &prevwin->w_vars->dv_hashtab : #endif &curwin->w_vars->dv_hashtab; if (wdone < ht->ht_used) *** ../vim-8.2.3628/src/usercmd.c 2021-11-12 11:25:06.291264320 +0000 --- src/usercmd.c 2021-11-20 19:05:09.733941238 +0000 *************** *** 141,147 **** /* * Look for buffer-local user commands first, then global ones. */ ! gap = &curbuf->b_ucmds; for (;;) { for (j = 0; j < gap->ga_len; ++j) --- 141,151 ---- /* * Look for buffer-local user commands first, then global ones. */ ! 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,309 **** // 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; --- 307,313 ---- // In cmdwin, the alternative buffer should be used. buf_T *buf = #ifdef FEAT_CMDWIN ! is_in_cmdwin() ? prevwin->w_buffer : #endif curbuf; *************** *** 330,339 **** // 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; --- 334,342 ---- // In cmdwin, the alternative buffer should be used. buf_T *buf = #ifdef FEAT_CMDWIN ! is_in_cmdwin() ? prevwin->w_buffer : #endif ! curbuf; if (idx < buf->b_ucmds.ga_len) return USER_CMD_GA(&buf->b_ucmds, idx)->uc_name; *************** *** 420,429 **** // 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) --- 423,431 ---- // In cmdwin, the alternative buffer should be used. gap = #ifdef FEAT_CMDWIN ! is_in_cmdwin() ? &prevwin->w_buffer->b_ucmds : #endif ! &curbuf->b_ucmds; for (;;) { for (i = 0; i < gap->ga_len; ++i) *** ../vim-8.2.3628/src/testdir/test_ins_complete.vim 2021-08-31 18:12:47.757554157 +0100 --- src/testdir/test_ins_complete.vim 2021-11-20 19:11:59.765286373 +0000 *************** *** 373,378 **** --- 373,386 ---- 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,416 **** --- 419,465 ---- call feedkeys("q::GetInput b:test_\\:q\", '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,ComplInCmdwin_GlobalCompletion + \ TestCommand call s:ComplInCmdwin_CheckCompletion() + com! -buffer -nargs=1 -complete=custom,ComplInCmdwin_LocalCompletion + \ TestCommand call s:ComplInCmdwin_CheckCompletion() + call feedkeys("q:iTestCommand \\", 'tx!') + + com! -nargs=1 -complete=customlist,ComplInCmdwin_GlobalCompletionList + \ TestCommand call s:ComplInCmdwin_CheckCompletion() + com! -buffer -nargs=1 -complete=customlist,ComplInCmdwin_LocalCompletionList + \ TestCommand call s:ComplInCmdwin_CheckCompletion() + + call feedkeys("q:iTestCommand \\", 'tx!') + + func! s:ComplInCmdwin_CheckCompletion(arg) + call assert_equal('global', a:arg) + endfunc + new + call feedkeys("q:iTestCommand \\", '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 *** ../vim-8.2.3628/src/version.c 2021-11-20 13:45:37.814729588 +0000 --- src/version.c 2021-11-20 19:00:31.242476601 +0000 *************** *** 759,760 **** --- 759,762 ---- { /* Add new patch number below this line */ + /**/ + 3629, /**/ -- My girlfriend told me I should be more affectionate. So I got TWO girlfriends. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///