]> granicus.if.org Git - vim/commitdiff
patch 9.0.0320: command line type of CmdlineChange differs from getcmdtype() v9.0.0320
authorzeertzjq <zeertzjq@outlook.com>
Mon, 29 Aug 2022 15:21:25 +0000 (16:21 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 29 Aug 2022 15:21:25 +0000 (16:21 +0100)
Problem:    Command line type of CmdlineChange differs from getcmdtype().
Solution:   Use the same type. (closes #11005)

src/ex_getln.c
src/proto/ex_getln.pro
src/testdir/test_cmdline.vim
src/version.c

index dadcfef77fe4fa9ffab0ed167c7397cd9e2ea166..2454be71fa0e048338d7c89d0cc1ea70e378f2cf 100644 (file)
@@ -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,40 +4211,41 @@ f_getcmdpos(typval_T *argvars UNUSED, typval_T *rettv)
 {
     cmdline_info_T *p = get_ccline_ptr();
 
-    rettv->vval.v_number = 0;
-    if (p != NULL)
-    rettv->vval.v_number = p->cmdpos + 1;
+    rettv->vval.v_number = p != NULL ? p->cmdpos + 1 : 0;
 }
 
 /*
- * Get the command line cursor screen position.
+ * "getcmdscreenpos()" function
  */
-    static int
-get_cmdline_screen_pos(void)
+    void
+f_getcmdscreenpos(typval_T *argvars UNUSED, typval_T *rettv)
 {
     cmdline_info_T *p = get_ccline_ptr();
 
-    if (p == NULL)
-       return -1;
-    return p->cmdspos;
+    rettv->vval.v_number = p != NULL ? p->cmdspos + 1 : 0;
 }
 
 /*
- * "getcmdscreenpos()" function
+ * "getcmdtype()" function
  */
     void
-f_getcmdscreenpos(typval_T *argvars UNUSED, typval_T *rettv)
+f_getcmdtype(typval_T *argvars UNUSED, typval_T *rettv)
 {
-    rettv->vval.v_number = get_cmdline_screen_pos() + 1;
+    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 *rettv)
 }
 #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.
  */
index 2eb32ab42252264bd120113a9e35dcf1fb63481c..88f0175ae48ad2ff3c9e2cf9e7d21b96e43c0783 100644 (file)
@@ -34,10 +34,9 @@ void f_getcmdcompltype(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_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);
index 81f0c6f0eb2be00e30bf7f179ad17ad03069dae8..f349ae49ed0ef0b38065cdc9b245a504334d2e1a 100644 (file)
@@ -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=')
index f743bb970d72aa7f69f5a3b8eca752b7d7526ccc..121da621b13604c5ca7959228b659515aaa44c30 100644 (file)
@@ -707,6 +707,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    320,
 /**/
     319,
 /**/