mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 9.0.0320: command line type of CmdlineChange differs from getcmdtype()
Problem: Command line type of CmdlineChange differs from getcmdtype(). Solution: Use the same type. (closes #11005)
This commit is contained in:
parent
d5c8f11905
commit
54acb90d9e
108
src/ex_getln.c
108
src/ex_getln.c
@ -4114,6 +4114,30 @@ get_ccline_ptr(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(FEAT_EVAL) || defined(FEAT_CMDWIN)
|
||||||
|
/*
|
||||||
|
* Get the current command-line type.
|
||||||
|
* Returns ':' or '/' or '?' or '@' or '>' or '-'
|
||||||
|
* Only works when the command line is being edited.
|
||||||
|
* Returns NUL when something is wrong.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
get_cmdline_type(void)
|
||||||
|
{
|
||||||
|
cmdline_info_T *p = get_ccline_ptr();
|
||||||
|
|
||||||
|
if (p == NULL)
|
||||||
|
return NUL;
|
||||||
|
if (p->cmdfirstc == NUL)
|
||||||
|
return
|
||||||
|
# ifdef FEAT_EVAL
|
||||||
|
(p->input_fn) ? '@' :
|
||||||
|
# endif
|
||||||
|
'-';
|
||||||
|
return p->cmdfirstc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(FEAT_EVAL) || defined(PROTO)
|
#if defined(FEAT_EVAL) || defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* Get the current command line in allocated memory.
|
* Get the current command line in allocated memory.
|
||||||
@ -4187,22 +4211,7 @@ f_getcmdpos(typval_T *argvars UNUSED, typval_T *rettv)
|
|||||||
{
|
{
|
||||||
cmdline_info_T *p = get_ccline_ptr();
|
cmdline_info_T *p = get_ccline_ptr();
|
||||||
|
|
||||||
rettv->vval.v_number = 0;
|
rettv->vval.v_number = p != NULL ? p->cmdpos + 1 : 0;
|
||||||
if (p != NULL)
|
|
||||||
rettv->vval.v_number = p->cmdpos + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the command line cursor screen position.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
get_cmdline_screen_pos(void)
|
|
||||||
{
|
|
||||||
cmdline_info_T *p = get_ccline_ptr();
|
|
||||||
|
|
||||||
if (p == NULL)
|
|
||||||
return -1;
|
|
||||||
return p->cmdspos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -4211,16 +4220,32 @@ get_cmdline_screen_pos(void)
|
|||||||
void
|
void
|
||||||
f_getcmdscreenpos(typval_T *argvars UNUSED, typval_T *rettv)
|
f_getcmdscreenpos(typval_T *argvars UNUSED, typval_T *rettv)
|
||||||
{
|
{
|
||||||
rettv->vval.v_number = get_cmdline_screen_pos() + 1;
|
cmdline_info_T *p = get_ccline_ptr();
|
||||||
|
|
||||||
|
rettv->vval.v_number = p != NULL ? p->cmdspos + 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "getcmdtype()" function
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
f_getcmdtype(typval_T *argvars UNUSED, typval_T *rettv)
|
||||||
|
{
|
||||||
|
rettv->v_type = VAR_STRING;
|
||||||
|
rettv->vval.v_string = alloc(2);
|
||||||
|
if (rettv->vval.v_string != NULL)
|
||||||
|
{
|
||||||
|
rettv->vval.v_string[0] = get_cmdline_type();
|
||||||
|
rettv->vval.v_string[1] = NUL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the command line str to "str".
|
// Set the command line str to "str".
|
||||||
// Returns 1 when failed, 0 when OK.
|
// Returns 1 when failed, 0 when OK.
|
||||||
int
|
static int
|
||||||
set_cmdline_str(char_u *str, int pos)
|
set_cmdline_str(char_u *str, int pos)
|
||||||
{
|
{
|
||||||
cmdline_info_T *p = get_ccline_ptr();
|
cmdline_info_T *p = get_ccline_ptr();
|
||||||
int cmdline_type;
|
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
@ -4237,8 +4262,7 @@ set_cmdline_str(char_u *str, int pos)
|
|||||||
redrawcmd();
|
redrawcmd();
|
||||||
|
|
||||||
// Trigger CmdlineChanged autocommands.
|
// Trigger CmdlineChanged autocommands.
|
||||||
cmdline_type = ccline.cmdfirstc == NUL ? '-' : ccline.cmdfirstc;
|
trigger_cmd_autocmd(get_cmdline_type(), EVENT_CMDLINECHANGED);
|
||||||
trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -4310,48 +4334,6 @@ f_setcmdpos(typval_T *argvars, typval_T *rettv)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(FEAT_EVAL) || defined(FEAT_CMDWIN)
|
|
||||||
/*
|
|
||||||
* Get the current command-line type.
|
|
||||||
* Returns ':' or '/' or '?' or '@' or '>' or '-'
|
|
||||||
* Only works when the command line is being edited.
|
|
||||||
* Returns NUL when something is wrong.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
get_cmdline_type(void)
|
|
||||||
{
|
|
||||||
cmdline_info_T *p = get_ccline_ptr();
|
|
||||||
|
|
||||||
if (p == NULL)
|
|
||||||
return NUL;
|
|
||||||
if (p->cmdfirstc == NUL)
|
|
||||||
return
|
|
||||||
# ifdef FEAT_EVAL
|
|
||||||
(p->input_fn) ? '@' :
|
|
||||||
# endif
|
|
||||||
'-';
|
|
||||||
return p->cmdfirstc;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(FEAT_EVAL) || defined(PROTO)
|
|
||||||
/*
|
|
||||||
* "getcmdtype()" function
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
f_getcmdtype(typval_T *argvars UNUSED, typval_T *rettv)
|
|
||||||
{
|
|
||||||
rettv->v_type = VAR_STRING;
|
|
||||||
rettv->vval.v_string = alloc(2);
|
|
||||||
if (rettv->vval.v_string != NULL)
|
|
||||||
{
|
|
||||||
rettv->vval.v_string[0] = get_cmdline_type();
|
|
||||||
rettv->vval.v_string[1] = NUL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the first character of the current command line.
|
* Return the first character of the current command line.
|
||||||
*/
|
*/
|
||||||
|
@ -34,10 +34,9 @@ void f_getcmdcompltype(typval_T *argvars, typval_T *rettv);
|
|||||||
void f_getcmdline(typval_T *argvars, typval_T *rettv);
|
void f_getcmdline(typval_T *argvars, typval_T *rettv);
|
||||||
void f_getcmdpos(typval_T *argvars, typval_T *rettv);
|
void f_getcmdpos(typval_T *argvars, typval_T *rettv);
|
||||||
void f_getcmdscreenpos(typval_T *argvars, typval_T *rettv);
|
void f_getcmdscreenpos(typval_T *argvars, typval_T *rettv);
|
||||||
int set_cmdline_str(char_u *str, int pos);
|
void f_getcmdtype(typval_T *argvars, typval_T *rettv);
|
||||||
void f_setcmdline(typval_T *argvars, typval_T *rettv);
|
void f_setcmdline(typval_T *argvars, typval_T *rettv);
|
||||||
void f_setcmdpos(typval_T *argvars, typval_T *rettv);
|
void f_setcmdpos(typval_T *argvars, typval_T *rettv);
|
||||||
void f_getcmdtype(typval_T *argvars, typval_T *rettv);
|
|
||||||
int get_cmdline_firstc(void);
|
int get_cmdline_firstc(void);
|
||||||
int get_list_range(char_u **str, int *num1, int *num2);
|
int get_list_range(char_u **str, int *num1, int *num2);
|
||||||
char *check_cedit(void);
|
char *check_cedit(void);
|
||||||
|
@ -3264,9 +3264,13 @@ endfunc
|
|||||||
|
|
||||||
func Test_setcmdline()
|
func Test_setcmdline()
|
||||||
func SetText(text, pos)
|
func SetText(text, pos)
|
||||||
|
autocmd CmdlineChanged * let g:cmdtype = expand('<afile>')
|
||||||
call assert_equal(0, setcmdline(a:text))
|
call assert_equal(0, setcmdline(a:text))
|
||||||
call assert_equal(a:text, getcmdline())
|
call assert_equal(a:text, getcmdline())
|
||||||
call assert_equal(len(a:text) + 1, getcmdpos())
|
call assert_equal(len(a:text) + 1, getcmdpos())
|
||||||
|
call assert_equal(getcmdtype(), g:cmdtype)
|
||||||
|
unlet g:cmdtype
|
||||||
|
autocmd! CmdlineChanged
|
||||||
|
|
||||||
call assert_equal(0, setcmdline(a:text, a:pos))
|
call assert_equal(0, setcmdline(a:text, a:pos))
|
||||||
call assert_equal(a:text, getcmdline())
|
call assert_equal(a:text, getcmdline())
|
||||||
@ -3282,6 +3286,13 @@ func Test_setcmdline()
|
|||||||
call feedkeys(":\<C-R>=SetText('set rtp?', 2)\<CR>\<CR>", 'xt')
|
call feedkeys(":\<C-R>=SetText('set rtp?', 2)\<CR>\<CR>", 'xt')
|
||||||
call assert_equal('set rtp?', @:)
|
call assert_equal('set rtp?', @:)
|
||||||
|
|
||||||
|
call feedkeys(":let g:str = input('? ')\<CR>", 't')
|
||||||
|
call feedkeys("\<C-R>=SetText('foo', 4)\<CR>\<CR>", 'xt')
|
||||||
|
call assert_equal('foo', g:str)
|
||||||
|
unlet g:str
|
||||||
|
|
||||||
|
delfunc SetText
|
||||||
|
|
||||||
" setcmdline() returns 1 when not editing the command line.
|
" setcmdline() returns 1 when not editing the command line.
|
||||||
call assert_equal(1, 'foo'->setcmdline())
|
call assert_equal(1, 'foo'->setcmdline())
|
||||||
|
|
||||||
@ -3294,6 +3305,8 @@ func Test_setcmdline()
|
|||||||
com! -nargs=* -complete=custom,CustomComplete DoCmd :
|
com! -nargs=* -complete=custom,CustomComplete DoCmd :
|
||||||
call feedkeys(":DoCmd \<C-A>\<C-B>\"\<CR>", 'tx')
|
call feedkeys(":DoCmd \<C-A>\<C-B>\"\<CR>", 'tx')
|
||||||
call assert_equal('"DoCmd January February Mars', @:)
|
call assert_equal('"DoCmd January February Mars', @:)
|
||||||
|
delcom DoCmd
|
||||||
|
delfunc CustomComplete
|
||||||
|
|
||||||
" Called in <expr>
|
" Called in <expr>
|
||||||
cnoremap <expr>a setcmdline('let foo=')
|
cnoremap <expr>a setcmdline('let foo=')
|
||||||
|
@ -707,6 +707,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 */
|
||||||
|
/**/
|
||||||
|
320,
|
||||||
/**/
|
/**/
|
||||||
319,
|
319,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user