# HG changeset patch # User Bram Moolenaar # Date 1651687203 -7200 # Node ID 141fb1d233ba6e655fd7edb489d521bb07fa2ada # Parent 9d93cac8b406e8e5dcbcccb8de09dbbb4a5d8680 patch 8.2.4867: listing of mapping with K_SPECIAL is wrong Commit: https://github.com/vim/vim/commit/ac402f4d64bec6b6efd809fef52f5b34627bf947 Author: zeertzjq Date: Wed May 4 18:51:43 2022 +0100 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 https://github.com/vim/vim/issues/10351) diff --git a/src/map.c b/src/map.c --- 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 --- a/src/message.c +++ b/src/message.c @@ -1800,19 +1800,29 @@ str2special( if (has_mbyte && !IS_SPECIAL(c)) { - int len = (*mb_ptr2len)(str); - - // For multi-byte characters check for an illegal byte. - if (MB_BYTE2LEN(*str) > len) + char_u *p; + + *sp = str; + // Try to un-escape a multi-byte character after modifiers. + p = mb_unescape(sp); + + 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 --- 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 --- 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,