]> granicus.if.org Git - vim/commitdiff
patch 8.2.3629: command completion in cmdline window uses global commands v8.2.3629
authormityu <mityu.mail@gmail.com>
Sat, 20 Nov 2021 19:13:39 +0000 (19:13 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 20 Nov 2021 19:13:39 +0000 (19:13 +0000)
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)

src/evalvars.c
src/ex_getln.c
src/proto/ex_getln.pro
src/testdir/test_ins_complete.vim
src/usercmd.c
src/version.c

index 6851eef9b7af5d348d5e438334511a82f04037d8..afbab79ff461ee226a2b1165ecb3a03f81ecfee9 100644 (file)
@@ -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)
index 258548ed8a1897d6f1aa8c2ec48aebbbe4230907..2616afc42a67ed5816ccc79520d4203da4d3f589 100644 (file)
@@ -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
 
 /*
index d047e39dab44c0bd814cf5993b82e053d43c2c67..d6f19110e733c5dbe130927fe4f746b5408f216c 100644 (file)
@@ -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 : */
index b0914d906792fed34bdea909bb05122ff6b37b6d..ee6641835be7e1a6ef74cb344ea426518a61df42 100644 (file)
@@ -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
index 0050647ab449d4f5420b7b373d06b00eb59cbe5f..332f995364520acc128841f6a9bbab8c9fb905af 100644 (file)
@@ -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)
index fada36201946a87b30fda145edbb7bf743d8fd3c..b30979a0b7e2c2fbde818e4bcd02e3dce1c38fa3 100644 (file)
@@ -757,6 +757,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3629,
 /**/
     3628,
 /**/