Mercurial > vim
changeset 29964:444dd4cc49d6 v9.0.0320
patch 9.0.0320: command line type of CmdlineChange differs from getcmdtype()
Commit: https://github.com/vim/vim/commit/54acb90d9e672315e3bd13f8dc71f828df97c868
Author: zeertzjq <zeertzjq@outlook.com>
Date: Mon Aug 29 16:21:25 2022 +0100
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 https://github.com/vim/vim/issues/11005)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 29 Aug 2022 17:30:03 +0200 |
parents | ee373646730e |
children | 2c4538a21c2d |
files | src/ex_getln.c src/proto/ex_getln.pro src/testdir/test_cmdline.vim src/version.c |
diffstat | 4 files changed, 61 insertions(+), 65 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -4114,6 +4114,30 @@ get_ccline_ptr(void) } #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) /* * Get the current command line in allocated memory. @@ -4187,22 +4211,7 @@ f_getcmdpos(typval_T *argvars UNUSED, ty { cmdline_info_T *p = get_ccline_ptr(); - rettv->vval.v_number = 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; + rettv->vval.v_number = p != NULL ? p->cmdpos + 1 : 0; } /* @@ -4211,16 +4220,32 @@ get_cmdline_screen_pos(void) void 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". // Returns 1 when failed, 0 when OK. - int + static int set_cmdline_str(char_u *str, int pos) { cmdline_info_T *p = get_ccline_ptr(); - int cmdline_type; int len; if (p == NULL) @@ -4237,8 +4262,7 @@ set_cmdline_str(char_u *str, int pos) redrawcmd(); // Trigger CmdlineChanged autocommands. - cmdline_type = ccline.cmdfirstc == NUL ? '-' : ccline.cmdfirstc; - trigger_cmd_autocmd(cmdline_type, EVENT_CMDLINECHANGED); + trigger_cmd_autocmd(get_cmdline_type(), EVENT_CMDLINECHANGED); return 0; } @@ -4310,48 +4334,6 @@ f_setcmdpos(typval_T *argvars, typval_T } #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. */
--- a/src/proto/ex_getln.pro +++ b/src/proto/ex_getln.pro @@ -34,10 +34,9 @@ void f_getcmdcompltype(typval_T *argvars void f_getcmdline(typval_T *argvars, typval_T *rettv); void f_getcmdpos(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_setcmdpos(typval_T *argvars, typval_T *rettv); -void f_getcmdtype(typval_T *argvars, typval_T *rettv); int get_cmdline_firstc(void); int get_list_range(char_u **str, int *num1, int *num2); char *check_cedit(void);
--- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -3264,9 +3264,13 @@ endfunc func Test_setcmdline() func SetText(text, pos) + autocmd CmdlineChanged * let g:cmdtype = expand('<afile>') call assert_equal(0, setcmdline(a:text)) call assert_equal(a:text, getcmdline()) 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(a:text, getcmdline()) @@ -3282,6 +3286,13 @@ func Test_setcmdline() call feedkeys(":\<C-R>=SetText('set rtp?', 2)\<CR>\<CR>", 'xt') 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. call assert_equal(1, 'foo'->setcmdline()) @@ -3294,6 +3305,8 @@ func Test_setcmdline() com! -nargs=* -complete=custom,CustomComplete DoCmd : call feedkeys(":DoCmd \<C-A>\<C-B>\"\<CR>", 'tx') call assert_equal('"DoCmd January February Mars', @:) + delcom DoCmd + delfunc CustomComplete " Called in <expr> cnoremap <expr>a setcmdline('let foo=')