# HG changeset patch # User Bram Moolenaar # Date 1631104205 -7200 # Node ID 589226a5f317d11ba41aa8883d7b63fcac00a31d # Parent 912ae2bec55b5f0e9d2039d325a0bd120d5c1077 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command Commit: https://github.com/vim/vim/commit/80c88eac5a81dd9f1a96fc80cb8aab6c84fe7b86 Author: Bram Moolenaar Date: Wed Sep 8 14:29:46 2021 +0200 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command 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) diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -3895,8 +3895,8 @@ f_fullcommand(typval_T *argvars, typval_ } rettv->vval.v_string = vim_strsave(IS_USER_CMDIDX(ea.cmdidx) - ? get_user_commands(NULL, ea.useridx) - : cmdnames[ea.cmdidx].cmd_name); + ? get_user_command_name(ea.useridx, ea.cmdidx) + : cmdnames[ea.cmdidx].cmd_name); } #endif @@ -5519,7 +5519,7 @@ check_more( get_command_name(expand_T *xp UNUSED, int idx) { if (idx >= (int)CMD_SIZE) - return get_user_command_name(idx); + return expand_user_command_name(idx); return cmdnames[idx].cmd_name; } diff --git a/src/proto/usercmd.pro b/src/proto/usercmd.pro --- a/src/proto/usercmd.pro +++ b/src/proto/usercmd.pro @@ -1,8 +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 *get_user_command_name(int idx); +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); diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -482,6 +482,13 @@ func Test_fullcommand() 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() diff --git a/src/usercmd.c b/src/usercmd.c --- a/src/usercmd.c +++ b/src/usercmd.c @@ -289,7 +289,7 @@ set_context_in_user_cmd(expand_T *xp, ch } char_u * -get_user_command_name(int idx) +expand_user_command_name(int idx) { return get_user_commands(NULL, idx - (int)CMD_SIZE); } @@ -316,6 +316,32 @@ get_user_commands(expand_T *xp UNUSED, i } /* + * 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. */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3414, +/**/ 3413, /**/ 3412,