From ac402f4d64bec6b6efd809fef52f5b34627bf947 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 4 May 2022 18:51:43 +0100 Subject: patch 8.2.4867: listing of mapping with K_SPECIAL is wrong Problem: Listing of mapping with K_SPECIAL is wrong. Solution: Adjust escaping of special characters. (closes #10351) --- src/map.c | 12 +----------- src/message.c | 26 ++++++++++++++++++-------- src/testdir/test_mapping.vim | 20 ++++++++++++++++++++ src/version.c | 2 ++ 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("", 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 + call assert_equal(['n foo '], + \ 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 foo + call assert_equal(['n foo'], + \ execute('nmap ')->trim()->split("\n")) + " map to CTRL-V exe "nmap ,k \" call assert_equal(['n ,k '], diff --git a/src/version.c b/src/version.c index 17bcfd1f4f..d04a226688 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4867, /**/ 4866, /**/ -- cgit v1.2.3