vim-patch:8.2.4002: first char typed in Select mode can be wrong

Problem:    First char typed in Select mode can be wrong.
Solution:   Escape special bytes in the input buffer. (closes vim/vim#9469)
6cac77016b

The `buf` should already be large enough, but I'll change its size
anyway in case future patches change the meaning of `MB_MAXBYTES` macro.

`fix_input_buffer()` cannot be used here because of the `using_script()`
check, and there is already equivalent code in its place.
This commit is contained in:
zeertzjq 2022-01-24 12:46:52 +08:00
parent 8f1efb018b
commit 5c897b6d0c
2 changed files with 53 additions and 1 deletions

View File

@ -984,7 +984,7 @@ int ins_typebuf(char_u *str, int noremap, int offset, bool nottyped, bool silent
/// @return the length of what was inserted
int ins_char_typebuf(int c, int modifier)
{
char_u buf[MB_MAXBYTES + 4];
char_u buf[MB_MAXBYTES * 3 + 4];
int len = 0;
if (modifier != 0) {
buf[0] = K_SPECIAL;

View File

@ -1,5 +1,6 @@
" Tests for Unicode manipulations
source check.vim
source view_util.vim
" Visual block Insert adjusts for multi-byte char
@ -148,4 +149,55 @@ func Test_print_overlong()
bwipe!
endfunc
func Test_recording_with_select_mode_utf8()
call Run_test_recording_with_select_mode_utf8()
endfunc
func Run_test_recording_with_select_mode_utf8()
new
" No escaping
call feedkeys("qacc12345\<Esc>gH哦\<Esc>q", "tx")
call assert_equal("哦", getline(1))
call assert_equal("cc12345\<Esc>gH哦\<Esc>", @a)
call setline(1, 'asdf')
normal! @a
call assert_equal("哦", getline(1))
" 固 is 0xE5 0x9B 0xBA where 0x9B is CSI
call feedkeys("qacc12345\<Esc>gH固\<Esc>q", "tx")
call assert_equal("固", getline(1))
call assert_equal("cc12345\<Esc>gH固\<Esc>", @a)
call setline(1, 'asdf')
normal! @a
call assert_equal("固", getline(1))
" 四 is 0xE5 0x9B 0x9B where 0x9B is CSI
call feedkeys("qacc12345\<Esc>gH四\<Esc>q", "tx")
call assert_equal("四", getline(1))
call assert_equal("cc12345\<Esc>gH四\<Esc>", @a)
call setline(1, 'asdf')
normal! @a
call assert_equal("四", getline(1))
" 倒 is 0xE5 0x80 0x92 where 0x80 is K_SPECIAL
call feedkeys("qacc12345\<Esc>gH倒\<Esc>q", "tx")
call assert_equal("倒", getline(1))
call assert_equal("cc12345\<Esc>gH倒\<Esc>", @a)
call setline(1, 'asdf')
normal! @a
call assert_equal("倒", getline(1))
bwipe!
endfunc
" This must be done as one of the last tests, because it starts the GUI, which
" cannot be undone.
func Test_zz_recording_with_select_mode_utf8_gui()
CheckCanRunGui
gui -f
call Run_test_recording_with_select_mode_utf8()
endfunc
" vim: shiftwidth=2 sts=2 expandtab