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=')
--- a/src/version.c
+++ b/src/version.c
@@ -708,6 +708,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    320,
+/**/
     319,
 /**/
     318,