diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-05-04 18:51:43 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-05-04 18:51:43 +0100 |
commit | ac402f4d64bec6b6efd809fef52f5b34627bf947 (patch) | |
tree | 8cf3a9097adc75b03a37e67d74162b7b1706a9ac | |
parent | 47d4e317f85e4aeb3799d962f173bd0f1e7bc71c (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.c | 12 | ||||
-rw-r--r-- | src/message.c | 26 | ||||
-rw-r--r-- | src/testdir/test_mapping.vim | 20 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 41 insertions, 19 deletions
@@ -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, |