forked from aniani/vim
updated for version 7.3.283
Problem: An expression mapping with a multi-byte character containing a 0x80 byte gets messed up. (ZyX) Solution: Unescape the expression before evaluating it (Yukihiro Nakadaira)
This commit is contained in:
parent
1db1f77d4a
commit
f6f4a01ab1
@ -3262,9 +3262,9 @@ do_map(maptype, arg, mode, abbrev)
|
|||||||
validate_maphash();
|
validate_maphash();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* find end of keys and skip CTRL-Vs (and backslashes) in it
|
* Find end of keys and skip CTRL-Vs (and backslashes) in it.
|
||||||
* Accept backslash like CTRL-V when 'cpoptions' does not contain 'B'.
|
* Accept backslash like CTRL-V when 'cpoptions' does not contain 'B'.
|
||||||
* with :unmap white space is included in the keys, no argument possible
|
* with :unmap white space is included in the keys, no argument possible.
|
||||||
*/
|
*/
|
||||||
p = keys;
|
p = keys;
|
||||||
do_backslash = (vim_strchr(p_cpo, CPO_BSLASH) == NULL);
|
do_backslash = (vim_strchr(p_cpo, CPO_BSLASH) == NULL);
|
||||||
@ -4506,12 +4506,23 @@ eval_map_expr(str, c)
|
|||||||
{
|
{
|
||||||
char_u *res;
|
char_u *res;
|
||||||
char_u *p;
|
char_u *p;
|
||||||
|
char_u *expr;
|
||||||
char_u *save_cmd;
|
char_u *save_cmd;
|
||||||
pos_T save_cursor;
|
pos_T save_cursor;
|
||||||
|
|
||||||
|
/* Remove escaping of CSI, because "str" is in a format to be used as
|
||||||
|
* typeahead. */
|
||||||
|
expr = vim_strsave(str);
|
||||||
|
if (expr == NULL)
|
||||||
|
return NULL;
|
||||||
|
vim_unescape_csi(expr);
|
||||||
|
|
||||||
save_cmd = save_cmdline_alloc();
|
save_cmd = save_cmdline_alloc();
|
||||||
if (save_cmd == NULL)
|
if (save_cmd == NULL)
|
||||||
|
{
|
||||||
|
vim_free(expr);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Forbid changing text or using ":normal" to avoid most of the bad side
|
/* Forbid changing text or using ":normal" to avoid most of the bad side
|
||||||
* effects. Also restore the cursor position. */
|
* effects. Also restore the cursor position. */
|
||||||
@ -4521,7 +4532,7 @@ eval_map_expr(str, c)
|
|||||||
#endif
|
#endif
|
||||||
set_vim_var_char(c); /* set v:char to the typed character */
|
set_vim_var_char(c); /* set v:char to the typed character */
|
||||||
save_cursor = curwin->w_cursor;
|
save_cursor = curwin->w_cursor;
|
||||||
p = eval_to_string(str, NULL, FALSE);
|
p = eval_to_string(expr, NULL, FALSE);
|
||||||
--textlock;
|
--textlock;
|
||||||
#ifdef FEAT_EX_EXTRA
|
#ifdef FEAT_EX_EXTRA
|
||||||
--ex_normal_lock;
|
--ex_normal_lock;
|
||||||
@ -4529,8 +4540,11 @@ eval_map_expr(str, c)
|
|||||||
curwin->w_cursor = save_cursor;
|
curwin->w_cursor = save_cursor;
|
||||||
|
|
||||||
restore_cmdline_alloc(save_cmd);
|
restore_cmdline_alloc(save_cmd);
|
||||||
|
vim_free(expr);
|
||||||
|
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
/* Escape CSI in the result to be able to use the string as typeahead. */
|
||||||
res = vim_strsave_escape_csi(p);
|
res = vim_strsave_escape_csi(p);
|
||||||
vim_free(p);
|
vim_free(p);
|
||||||
|
|
||||||
|
@ -709,6 +709,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
283,
|
||||||
/**/
|
/**/
|
||||||
282,
|
282,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user