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.