Patch 8.2.3414
Problem:    fullcommand() gives the wrong name if there is a buffer-local user
            command. (Naohiro Ono)
Solution:   Use a separate function to get the user command name.
            (closes #8840)
Files:      src/usercmd.c, src/proto/usercmd.pro, src/ex_docmd.c,
            src/testdir/test_cmdline.vim


*** ../vim-8.2.3413/src/usercmd.c       2021-08-04 16:09:19.969646556 +0200
--- src/usercmd.c       2021-09-08 14:05:16.037620248 +0200
***************
*** 289,295 ****
  }
  
      char_u *
! get_user_command_name(int idx)
  {
      return get_user_commands(NULL, idx - (int)CMD_SIZE);
  }
--- 289,295 ----
  }
  
      char_u *
! expand_user_command_name(int idx)
  {
      return get_user_commands(NULL, idx - (int)CMD_SIZE);
  }
***************
*** 315,320 ****
--- 315,346 ----
      return NULL;
  }
  
+ /*
+  * Get the name of user command "idx".  "cmdidx" can be CMD_USER or
+  * CMD_USER_BUF.
+  * Returns NULL if the command is not found.
+  */
+     char_u *
+ get_user_command_name(int idx, int cmdidx)
+ {
+     if (cmdidx == CMD_USER && idx < ucmds.ga_len)
+       return USER_CMD(idx)->uc_name;
+     if (cmdidx == CMD_USER_BUF)
+     {
+       // 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;
+     }
+     return NULL;
+ }
+ 
  /*
   * Function given to ExpandGeneric() to obtain the list of user address type
   * names.
*** ../vim-8.2.3413/src/proto/usercmd.pro       2021-08-01 14:52:05.558645405 
+0200
--- src/proto/usercmd.pro       2021-09-08 14:05:18.309615060 +0200
***************
*** 1,8 ****
  /* usercmd.c */
  char_u *find_ucmd(exarg_T *eap, char_u *p, int *full, expand_T *xp, int 
*complp);
  char_u *set_context_in_user_cmd(expand_T *xp, char_u *arg_in);
! char_u *get_user_command_name(int idx);
  char_u *get_user_commands(expand_T *xp, int idx);
  char_u *get_user_cmd_addr_type(expand_T *xp, int idx);
  char_u *get_user_cmd_flags(expand_T *xp, int idx);
  char_u *get_user_cmd_nargs(expand_T *xp, int idx);
--- 1,9 ----
  /* usercmd.c */
  char_u *find_ucmd(exarg_T *eap, char_u *p, int *full, expand_T *xp, int 
*complp);
  char_u *set_context_in_user_cmd(expand_T *xp, char_u *arg_in);
! char_u *expand_user_command_name(int idx);
  char_u *get_user_commands(expand_T *xp, int idx);
+ char_u *get_user_command_name(int idx, int cmdidx);
  char_u *get_user_cmd_addr_type(expand_T *xp, int idx);
  char_u *get_user_cmd_flags(expand_T *xp, int idx);
  char_u *get_user_cmd_nargs(expand_T *xp, int idx);
*** ../vim-8.2.3413/src/ex_docmd.c      2021-09-06 17:10:55.073336145 +0200
--- src/ex_docmd.c      2021-09-08 14:29:08.921625735 +0200
***************
*** 3895,3902 ****
      }
  
      rettv->vval.v_string = vim_strsave(IS_USER_CMDIDX(ea.cmdidx)
!                                   ? get_user_commands(NULL, ea.useridx)
!                                   : cmdnames[ea.cmdidx].cmd_name);
  }
  #endif
  
--- 3895,3902 ----
      }
  
      rettv->vval.v_string = vim_strsave(IS_USER_CMDIDX(ea.cmdidx)
!                                ? get_user_command_name(ea.useridx, ea.cmdidx)
!                                : cmdnames[ea.cmdidx].cmd_name);
  }
  #endif
  
***************
*** 5519,5525 ****
  get_command_name(expand_T *xp UNUSED, int idx)
  {
      if (idx >= (int)CMD_SIZE)
!       return get_user_command_name(idx);
      return cmdnames[idx].cmd_name;
  }
  
--- 5519,5525 ----
  get_command_name(expand_T *xp UNUSED, int idx)
  {
      if (idx >= (int)CMD_SIZE)
!       return expand_user_command_name(idx);
      return cmdnames[idx].cmd_name;
  }
  
*** ../vim-8.2.3413/src/testdir/test_cmdline.vim        2021-09-01 
13:03:31.422768900 +0200
--- src/testdir/test_cmdline.vim        2021-09-08 14:07:55.165266243 +0200
***************
*** 482,487 ****
--- 482,494 ----
    call assert_equal('', fullcommand(test_null_string()))
  
    call assert_equal('syntax', 'syn'->fullcommand())
+ 
+   command -buffer BufferLocalCommand :
+   command GlobalCommand :
+   call assert_equal('GlobalCommand', fullcommand('GlobalCom'))
+   call assert_equal('BufferLocalCommand', fullcommand('BufferL'))
+   delcommand BufferLocalCommand
+   delcommand GlobalCommand
  endfunc
  
  func Test_shellcmd_completion()
*** ../vim-8.2.3413/src/version.c       2021-09-08 12:31:31.862351834 +0200
--- src/version.c       2021-09-08 14:02:06.894068560 +0200
***************
*** 757,758 ****
--- 757,760 ----
  {   /* Add new patch number below this line */
+ /**/
+     3414,
  /**/

-- 
The goal of science is to build better mousetraps.
The goal of nature is to build better mice.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202109081230.188CUG3f1895493%40masaka.moolenaar.net.

Raspunde prin e-mail lui