mirror of
https://github.com/vim/vim
synced 2025-07-16 09:12:00 +00:00
patch 9.1.1402: multi-byte mappings not properly stored in session file
Problem: multi-byte mappings not properly stored in session file Solution: unescape the mapping before writing out the mapping, prefer single-byte mapping name if possible (Miguel Barro) closes: #17355 Signed-off-by: GuyBrush <miguel.barro@live.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
1a8be6b447
commit
5b07aff2f6
13
src/map.c
13
src/map.c
@ -2180,7 +2180,18 @@ put_escstr(FILE *fd, char_u *strstart, int what)
|
||||
{
|
||||
modifiers = str[2];
|
||||
str += 3;
|
||||
c = *str;
|
||||
|
||||
// Modifiers can be applied too to multi-byte characters.
|
||||
p = mb_unescape(&str);
|
||||
|
||||
if (p == NULL)
|
||||
c = *str;
|
||||
else
|
||||
{
|
||||
// retrieve codepoint (character number) from unescaped string
|
||||
c = (*mb_ptr2char)(p);
|
||||
--str;
|
||||
}
|
||||
}
|
||||
if (c == K_SPECIAL)
|
||||
{
|
||||
|
@ -1213,7 +1213,7 @@ handle_x_keys(int key)
|
||||
get_special_key_name(int c, int modifiers)
|
||||
{
|
||||
static char_u string[MAX_KEY_NAME_LEN + 1];
|
||||
int i, idx;
|
||||
int i, idx, len;
|
||||
int table_idx;
|
||||
|
||||
string[0] = '<';
|
||||
@ -1286,10 +1286,11 @@ get_special_key_name(int c, int modifiers)
|
||||
// Not a special key, only modifiers, output directly
|
||||
else
|
||||
{
|
||||
if (has_mbyte && (*mb_char2len)(c) > 1)
|
||||
idx += (*mb_char2bytes)(c, string + idx);
|
||||
else if (vim_isprintc(c))
|
||||
len = (*mb_char2len)(c);
|
||||
if (len == 1 && vim_isprintc(c))
|
||||
string[idx++] = c;
|
||||
else if (has_mbyte && len > 1)
|
||||
idx += (*mb_char2bytes)(c, string + idx);
|
||||
else
|
||||
{
|
||||
char_u *s = transchar(c);
|
||||
|
@ -102,4 +102,35 @@ func Test_mksession_utf8()
|
||||
set sessionoptions& splitbelow& fileencoding&
|
||||
endfunc
|
||||
|
||||
func Test_session_multibyte_mappings()
|
||||
|
||||
" some characters readily available on european keyboards
|
||||
let entries = [
|
||||
\ ['n', '<M-ç>', '<M-ç>'],
|
||||
\ ['n', '<M-º>', '<M-º>'],
|
||||
\ ['n', '<M-¡>', '<M-¡>'],
|
||||
\ ]
|
||||
for entry in entries
|
||||
exe entry[0] .. 'map ' .. entry[1] .. ' ' .. entry[2]
|
||||
endfor
|
||||
|
||||
mkvimrc Xtestvimrc
|
||||
|
||||
nmapclear
|
||||
|
||||
for entry in entries
|
||||
call assert_equal('', maparg(entry[1], entry[0]))
|
||||
endfor
|
||||
|
||||
source Xtestvimrc
|
||||
|
||||
for entry in entries
|
||||
call assert_equal(entry[2], maparg(entry[1], entry[0]))
|
||||
endfor
|
||||
|
||||
nmapclear
|
||||
|
||||
call delete('Xtestvimrc')
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -709,6 +709,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1402,
|
||||
/**/
|
||||
1401,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user