Mercurial > vim
changeset 28686:141fb1d233ba v8.2.4867
patch 8.2.4867: listing of mapping with K_SPECIAL is wrong
Commit: https://github.com/vim/vim/commit/ac402f4d64bec6b6efd809fef52f5b34627bf947
Author: zeertzjq <zeertzjq@outlook.com>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 04 May 2022 20:00:03 +0200 |
parents | 9d93cac8b406 |
children | b7aa8a9e166a |
files | src/map.c src/message.c src/testdir/test_mapping.vim src/version.c |
diffstat | 4 files changed, 42 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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;
--- 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>'],