Patch 8.1.0619
Problem:    :echomsg and :echoerr do not handle List and Dict like :echo does.
            (Daniel Hahler)
Solution:   Be more tolerant about the expression result type.
Files:      src/eval.c, src/proto/eval.pro, src/evalfunc.c,
            src/proto/evalfunc.pro, runtime/doc/eval.txt,
            src/testdir/test_messages.vim, src/message.c


*** ../vim-8.1.0618/src/eval.c  2018-12-21 16:04:16.312437516 +0100
--- src/eval.c  2018-12-22 12:25:00.231184150 +0100
***************
*** 7163,7168 ****
--- 7163,7192 ----
  }
  
  /*
+  * Turn a typeval into a string.  Similar to tv_get_string_buf() but uses
+  * string() on Dict, List, etc.
+  */
+     char_u *
+ tv_stringify(typval_T *varp, char_u *buf)
+ {
+     if (varp->v_type == VAR_LIST
+           || varp->v_type == VAR_DICT
+           || varp->v_type == VAR_FUNC
+           || varp->v_type == VAR_PARTIAL
+           || varp->v_type == VAR_FLOAT)
+     {
+       typval_T tmp;
+ 
+       f_string(varp, &tmp);
+       tv_get_string_buf(&tmp, buf);
+       clear_tv(varp);
+       *varp = tmp;
+       return tmp.vval.v_string;
+     }
+     return tv_get_string_buf(varp, buf);
+ }
+ 
+ /*
   * Find variable "name" in the list of variables.
   * Return a pointer to it if found, NULL if not found.
   * Careful: "a:0" variables don't have a name.
***************
*** 8142,8148 ****
  
        if (!eap->skip)
        {
!           p = tv_get_string(&rettv);
            len = (int)STRLEN(p);
            if (ga_grow(&ga, len + 2) == FAIL)
            {
--- 8166,8177 ----
  
        if (!eap->skip)
        {
!           char_u   buf[NUMBUFLEN];
! 
!           if (eap->cmdidx == CMD_execute)
!               p = tv_get_string_buf(&rettv, buf);
!           else
!               p = tv_stringify(&rettv, buf);
            len = (int)STRLEN(p);
            if (ga_grow(&ga, len + 2) == FAIL)
            {
*** ../vim-8.1.0618/src/proto/eval.pro  2018-12-21 16:04:16.312437516 +0100
--- src/proto/eval.pro  2018-12-22 12:17:39.702552883 +0100
***************
*** 89,94 ****
--- 89,95 ----
  char_u *tv_get_string_buf(typval_T *varp, char_u *buf);
  char_u *tv_get_string_chk(typval_T *varp);
  char_u *tv_get_string_buf_chk(typval_T *varp, char_u *buf);
+ char_u *tv_stringify(typval_T *varp, char_u *buf);
  dictitem_T *find_var(char_u *name, hashtab_T **htp, int no_autoload);
  dictitem_T *find_var_in_ht(hashtab_T *ht, int htname, char_u *varname, int 
no_autoload);
  hashtab_T *find_var_ht(char_u *name, char_u **varname);
*** ../vim-8.1.0618/src/evalfunc.c      2018-12-21 16:04:16.316437487 +0100
--- src/evalfunc.c      2018-12-22 12:18:56.357958445 +0100
***************
*** 396,402 ****
  #endif
  static void f_strgetchar(typval_T *argvars, typval_T *rettv);
  static void f_stridx(typval_T *argvars, typval_T *rettv);
- static void f_string(typval_T *argvars, typval_T *rettv);
  static void f_strlen(typval_T *argvars, typval_T *rettv);
  static void f_strcharpart(typval_T *argvars, typval_T *rettv);
  static void f_strpart(typval_T *argvars, typval_T *rettv);
--- 396,401 ----
***************
*** 12475,12481 ****
  /*
   * "string()" function
   */
!     static void
  f_string(typval_T *argvars, typval_T *rettv)
  {
      char_u    *tofree;
--- 12474,12480 ----
  /*
   * "string()" function
   */
!     void
  f_string(typval_T *argvars, typval_T *rettv)
  {
      char_u    *tofree;
*** ../vim-8.1.0618/src/proto/evalfunc.pro      2018-05-17 13:52:33.000000000 
+0200
--- src/proto/evalfunc.pro      2018-12-22 12:19:00.705924858 +0100
***************
*** 9,14 ****
--- 9,15 ----
  void mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv);
  float_T vim_round(float_T f);
  long do_searchpair(char_u *spat, char_u *mpat, char_u *epat, int dir, 
typval_T *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long 
time_limit);
+ void f_string(typval_T *argvars, typval_T *rettv);
  char_u *get_callback(typval_T *arg, partial_T **pp);
  void free_callback(char_u *callback, partial_T *partial);
  /* vim: set ft=c : */
*** ../vim-8.1.0618/runtime/doc/eval.txt        2018-12-21 15:16:57.475579814 
+0100
--- runtime/doc/eval.txt        2018-12-22 13:13:03.694052571 +0100
***************
*** 9214,9220 ****
                error with try/catch cannot be used (because it skips over
                following code).
                {expr} is used literally, not as a pattern.
!               There is currently no way to revert this.
  
  test_null_channel()                                   *test_null_channel()*
                Return a Channel that is null. Only useful for testing.
--- 9233,9240 ----
                error with try/catch cannot be used (because it skips over
                following code).
                {expr} is used literally, not as a pattern.
!               When the {expr} is the string "RESET" then the list of ignored
!               errors is made empty.
  
  test_null_channel()                                   *test_null_channel()*
                Return a Channel that is null. Only useful for testing.
***************
*** 10978,10985 ****
                        The parsing works slightly different from |:echo|,
                        more like |:execute|.  All the expressions are first
                        evaluated and concatenated before echoing anything.
!                       The expressions must evaluate to a Number or String, a
!                       Dictionary or List causes an error.
                        Uses the highlighting set by the |:echohl| command.
                        Example: >
                :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
--- 11000,11007 ----
                        The parsing works slightly different from |:echo|,
                        more like |:execute|.  All the expressions are first
                        evaluated and concatenated before echoing anything.
!                       If expressions does not evaluate to a Number or
!                       String, string() is used to turn it into a string.
                        Uses the highlighting set by the |:echohl| command.
                        Example: >
                :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
***************
*** 10990,10996 ****
                        message in the |message-history|.  When used in a
                        script or function the line number will be added.
                        Spaces are placed between the arguments as with the
!                       :echo command.  When used inside a try conditional,
                        the message is raised as an error exception instead
                        (see |try-echoerr|).
                        Example: >
--- 11012,11018 ----
                        message in the |message-history|.  When used in a
                        script or function the line number will be added.
                        Spaces are placed between the arguments as with the
!                       |:echomsg| command.  When used inside a try conditional,
                        the message is raised as an error exception instead
                        (see |try-echoerr|).
                        Example: >
*** ../vim-8.1.0618/src/testdir/test_messages.vim       2018-12-02 
14:55:04.904731741 +0100
--- src/testdir/test_messages.vim       2018-12-22 13:16:02.344747032 +0100
***************
*** 1,4 ****
! " Tests for :messages
  
  function Test_messages()
    let oldmore = &more
--- 1,4 ----
! " Tests for :messages, :echomsg, :echoerr
  
  function Test_messages()
    let oldmore = &more
***************
*** 64,66 ****
--- 64,94 ----
    call feedkeys(":message \<C-A>\<C-B>\"\<CR>", 'tx')
    call assert_equal('"message clear', @:)
  endfunc
+ 
+ func Test_echomsg()
+   call assert_equal("\nhello", execute(':echomsg "hello"'))
+   call assert_equal("\n", execute(':echomsg ""'))
+   call assert_equal("\n12345", execute(':echomsg 12345'))
+   call assert_equal("\n[]", execute(':echomsg []'))
+   call assert_equal("\n[1, 2, 3]", execute(':echomsg [1, 2, 3]'))
+   call assert_equal("\n{}", execute(':echomsg {}'))
+   call assert_equal("\n{'a': 1, 'b': 2}", execute(':echomsg {"a": 1, "b": 
2}'))
+   if has('float')
+     call assert_equal("\n1.23", execute(':echomsg 1.23'))
+   endif
+   call assert_match("function('<lambda>\\d*')", execute(':echomsg {-> 1234}'))
+ endfunc
+ 
+ func Test_echoerr()
+   call test_ignore_error('IgNoRe')
+   call assert_equal("\nIgNoRe hello", execute(':echoerr "IgNoRe hello"'))
+   call assert_equal("\n12345 IgNoRe", execute(':echoerr 12345 "IgNoRe"'))
+   call assert_equal("\n[1, 2, 'IgNoRe']", execute(':echoerr [1, 2, 
"IgNoRe"]'))
+   call assert_equal("\n{'IgNoRe': 2, 'a': 1}", execute(':echoerr {"a": 1, 
"IgNoRe": 2}'))
+   if has('float')
+     call assert_equal("\n1.23 IgNoRe", execute(':echoerr 1.23 "IgNoRe"'))
+   endif
+   call test_ignore_error('<lambda>')
+   call assert_match("function('<lambda>\\d*')", execute(':echoerr {-> 1234}'))
+   call test_ignore_error('RESET')
+ endfunc
*** ../vim-8.1.0618/src/message.c       2018-12-21 16:04:16.316437487 +0100
--- src/message.c       2018-12-22 13:13:16.209961171 +0100
***************
*** 553,559 ****
      if (ignore_error_list.ga_itemsize == 0)
        ga_init2(&ignore_error_list, sizeof(char_u *), 1);
  
!     ga_add_string(&ignore_error_list, error);
  }
  
      static int
--- 553,562 ----
      if (ignore_error_list.ga_itemsize == 0)
        ga_init2(&ignore_error_list, sizeof(char_u *), 1);
  
!     if (STRCMP("RESET", error) == 0)
!       ga_clear_strings(&ignore_error_list);
!     else
!       ga_add_string(&ignore_error_list, error);
  }
  
      static int
*** ../vim-8.1.0618/src/version.c       2018-12-21 20:55:18.892739645 +0100
--- src/version.c       2018-12-22 13:16:38.876479919 +0100
***************
*** 801,802 ****
--- 801,804 ----
  {   /* Add new patch number below this line */
+ /**/
+     619,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
38. You wake up at 3 a.m. to go to the bathroom and stop and check your e-mail
    on the way back to bed.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui