0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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)
This commit is contained in:
Bram Moolenaar
2021-09-08 14:29:46 +02:00
parent a9e3d56087
commit 80c88eac5a
5 changed files with 41 additions and 5 deletions

View File

@@ -3895,7 +3895,7 @@ f_fullcommand(typval_T *argvars, typval_T *rettv)
} }
rettv->vval.v_string = vim_strsave(IS_USER_CMDIDX(ea.cmdidx) rettv->vval.v_string = vim_strsave(IS_USER_CMDIDX(ea.cmdidx)
? get_user_commands(NULL, ea.useridx) ? get_user_command_name(ea.useridx, ea.cmdidx)
: cmdnames[ea.cmdidx].cmd_name); : cmdnames[ea.cmdidx].cmd_name);
} }
#endif #endif
@@ -5519,7 +5519,7 @@ check_more(
get_command_name(expand_T *xp UNUSED, int idx) get_command_name(expand_T *xp UNUSED, int idx)
{ {
if (idx >= (int)CMD_SIZE) if (idx >= (int)CMD_SIZE)
return get_user_command_name(idx); return expand_user_command_name(idx);
return cmdnames[idx].cmd_name; return cmdnames[idx].cmd_name;
} }

View File

@@ -1,8 +1,9 @@
/* usercmd.c */ /* usercmd.c */
char_u *find_ucmd(exarg_T *eap, char_u *p, int *full, expand_T *xp, int *complp); 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 *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_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_addr_type(expand_T *xp, int idx);
char_u *get_user_cmd_flags(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); char_u *get_user_cmd_nargs(expand_T *xp, int idx);

View File

@@ -482,6 +482,13 @@ func Test_fullcommand()
call assert_equal('', fullcommand(test_null_string())) call assert_equal('', fullcommand(test_null_string()))
call assert_equal('syntax', 'syn'->fullcommand()) 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 endfunc
func Test_shellcmd_completion() func Test_shellcmd_completion()

View File

@@ -289,7 +289,7 @@ set_context_in_user_cmd(expand_T *xp, char_u *arg_in)
} }
char_u * char_u *
get_user_command_name(int idx) expand_user_command_name(int idx)
{ {
return get_user_commands(NULL, idx - (int)CMD_SIZE); return get_user_commands(NULL, idx - (int)CMD_SIZE);
} }
@@ -315,6 +315,32 @@ get_user_commands(expand_T *xp UNUSED, int idx)
return NULL; 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 * Function given to ExpandGeneric() to obtain the list of user address type
* names. * names.

View File

@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3414,
/**/ /**/
3413, 3413,
/**/ /**/