0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 9.0.1694: wrong mapping applied when replaying a char search

Problem: wrong mapping applied when replaying a char search
Solution: Store a NOP after the ESC

closes: #12708
closes: #6350

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
This commit is contained in:
zeertzjq
2023-08-12 00:09:31 +02:00
committed by Christian Brabandt
parent 2d63e4b3cc
commit bacc83009b
5 changed files with 64 additions and 24 deletions

View File

@@ -543,27 +543,35 @@ normal_cmd_get_more_chars(
}
}
// When getting a text character and the next character is a
// multi-byte character, it could be a composing character.
// However, don't wait for it to arrive. Also, do enable mapping,
// because if it's put back with vungetc() it's too late to apply
// mapping.
--no_mapping;
while (enc_utf8 && lang && (c = vpeekc()) > 0
&& (c >= 0x100 || MB_BYTE2LEN(vpeekc()) > 1))
if (enc_utf8 && lang)
{
c = plain_vgetc();
if (!utf_iscomposing(c))
// When getting a text character and the next character is a
// multi-byte character, it could be a composing character.
// However, don't wait for it to arrive. Also, do enable mapping,
// because if it's put back with vungetc() it's too late to apply
// mapping.
--no_mapping;
while ((c = vpeekc()) > 0
&& (c >= 0x100 || MB_BYTE2LEN(vpeekc()) > 1))
{
vungetc(c); // it wasn't, put it back
break;
c = plain_vgetc();
if (!utf_iscomposing(c))
{
vungetc(c); // it wasn't, put it back
break;
}
else if (cap->ncharC1 == 0)
cap->ncharC1 = c;
else
cap->ncharC2 = c;
}
else if (cap->ncharC1 == 0)
cap->ncharC1 = c;
else
cap->ncharC2 = c;
++no_mapping;
// Vim may be in a different mode when the user types the next key,
// but when replaying a recording the next key is already in the
// typeahead buffer, so record a <Nop> before that to prevent the
// vpeekc() above from applying wrong mappings when replaying.
gotchars_nop();
}
++no_mapping;
}
--no_mapping;
--allow_keys;