summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-05-04 18:51:43 +0100
committerBram Moolenaar <Bram@vim.org>2022-05-04 18:51:43 +0100
commitac402f4d64bec6b6efd809fef52f5b34627bf947 (patch)
tree8cf3a9097adc75b03a37e67d74162b7b1706a9ac
parent47d4e317f85e4aeb3799d962f173bd0f1e7bc71c (diff)
patch 8.2.4867: listing of mapping with K_SPECIAL is wrongv8.2.4867
Problem: Listing of mapping with K_SPECIAL is wrong. Solution: Adjust escaping of special characters. (closes #10351)
-rw-r--r--src/map.c12
-rw-r--r--src/message.c26
-rw-r--r--src/testdir/test_mapping.vim20
-rw-r--r--src/version.c2
4 files changed, 41 insertions, 19 deletions
diff --git a/src/map.c b/src/map.c
index 6ea73ebce2..762cce2d5f 100644
--- a/src/map.c
+++ b/src/map.c
@@ -189,17 +189,7 @@ showmap(
if (*mp->m_str == NUL)
msg_puts_attr("<Nop>", HL_ATTR(HLF_8));
else
- {
- // Remove escaping of CSI, because "m_str" is in a format to be used
- // as typeahead.
- char_u *s = vim_strsave(mp->m_str);
- if (s != NULL)
- {
- vim_unescape_csi(s);
- msg_outtrans_special(s, FALSE, 0);
- vim_free(s);
- }
- }
+ msg_outtrans_special(mp->m_str, FALSE, 0);
#ifdef FEAT_EVAL
if (p_verbose > 0)
last_set_msg(mp->m_script_ctx);
diff --git a/src/message.c b/src/message.c
index 2499723e4d..b5b00f33fe 100644
--- a/src/message.c
+++ b/src/message.c
@@ -1800,19 +1800,29 @@ str2special(
if (has_mbyte && !IS_SPECIAL(c))
{
- int len = (*mb_ptr2len)(str);
+ char_u *p;
+
+ *sp = str;
+ // Try to un-escape a multi-byte character after modifiers.
+ p = mb_unescape(sp);
- // For multi-byte characters check for an illegal byte.
- if (MB_BYTE2LEN(*str) > len)
+ if (p == NULL)
{
- transchar_nonprint(curbuf, buf, c);
- *sp = str + 1;
- return buf;
+ int len = (*mb_ptr2len)(str);
+
+ // Check for an illegal byte.
+ if (MB_BYTE2LEN(*str) > len)
+ {
+ transchar_nonprint(curbuf, buf, c);
+ *sp = str + 1;
+ return buf;
+ }
+ *sp = str + len;
+ p = str;
}
// Since 'special' is TRUE the multi-byte character 'c' will be
// processed by get_special_key_name()
- c = (*mb_ptr2char)(str);
- *sp = str + len;
+ c = (*mb_ptr2char)(p);
}
else
*sp = str + 1;
diff --git a/src/testdir/test_mapping.vim b/src/testdir/test_mapping.vim
index 7f768cf80f..e886424fb1 100644
--- a/src/testdir/test_mapping.vim
+++ b/src/testdir/test_mapping.vim
@@ -482,6 +482,26 @@ func Test_list_mappings()
call assert_match("\tLast set from .*/test_mapping.vim line \\d\\+$",
\ execute('verbose map ,n')->trim()->split("\n")[1])
+ " character with K_SPECIAL byte in rhs
+ nmap foo …
+ call assert_equal(['n foo …'],
+ \ execute('nmap foo')->trim()->split("\n"))
+
+ " modified character with K_SPECIAL byte in rhs
+ nmap foo <M-…>
+ call assert_equal(['n foo <M-…>'],
+ \ execute('nmap foo')->trim()->split("\n"))
+
+ " character with K_SPECIAL byte in lhs
+ nmap … foo
+ call assert_equal(['n … foo'],
+ \ execute('nmap …')->trim()->split("\n"))
+
+ " modified character with K_SPECIAL byte in lhs
+ nmap <M-…> foo
+ call assert_equal(['n <M-…> foo'],
+ \ execute('nmap <M-…>')->trim()->split("\n"))
+
" map to CTRL-V
exe "nmap ,k \<C-V>"
call assert_equal(['n ,k <Nop>'],
diff --git a/src/version.c b/src/version.c
index 17bcfd1f4f..d04a226688 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4867,
+/**/
4866,
/**/
4865,