0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

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 #9469)
This commit is contained in:
zeertzjq
2022-01-04 18:01:21 +00:00
committed by Bram Moolenaar
parent d94fbfc74a
commit 6cac77016b
3 changed files with 67 additions and 5 deletions

View File

@@ -1121,7 +1121,7 @@ ins_typebuf(
int int
ins_char_typebuf(int c, int modifier) ins_char_typebuf(int c, int modifier)
{ {
char_u buf[MB_MAXBYTES + 4]; char_u buf[MB_MAXBYTES * 3 + 4];
int len = 0; int len = 0;
if (modifier != 0) if (modifier != 0)
@@ -1142,8 +1142,18 @@ ins_char_typebuf(int c, int modifier)
} }
else else
{ {
len += (*mb_char2bytes)(c, buf + len); char_u *p = buf + len;
buf[len] = NUL; int char_len = (*mb_char2bytes)(c, p);
#ifdef FEAT_GUI
int save_gui_in_use = gui.in_use;
gui.in_use = FALSE;
#endif
// if the character contains CSI or K_SPECIAL bytes they need escaping
len += fix_input_buffer(p, char_len);
#ifdef FEAT_GUI
gui.in_use = save_gui_in_use;
#endif
} }
(void)ins_typebuf(buf, KeyNoremap, 0, !KeyTyped, cmd_silent); (void)ins_typebuf(buf, KeyNoremap, 0, !KeyTyped, cmd_silent);
return len; return len;
@@ -3644,7 +3654,6 @@ fix_input_buffer(char_u *buf, int len)
p += 2; p += 2;
i -= 2; i -= 2;
} }
# ifndef MSWIN
// When the GUI is not used CSI needs to be escaped. // When the GUI is not used CSI needs to be escaped.
else if (!gui.in_use && p[0] == CSI) else if (!gui.in_use && p[0] == CSI)
{ {
@@ -3654,7 +3663,6 @@ fix_input_buffer(char_u *buf, int len)
*p = (int)KE_CSI; *p = (int)KE_CSI;
len += 2; len += 2;
} }
# endif
else else
#endif #endif
if (p[0] == NUL || (p[0] == K_SPECIAL if (p[0] == NUL || (p[0] == K_SPECIAL

View File

@@ -1,5 +1,6 @@
" Tests for Unicode manipulations " Tests for Unicode manipulations
source check.vim
source view_util.vim source view_util.vim
" Visual block Insert adjusts for multi-byte char " Visual block Insert adjusts for multi-byte char
@@ -206,4 +207,55 @@ func Test_print_overlong()
bwipe! bwipe!
endfunc 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 " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4002,
/**/ /**/
4001, 4001,
/**/ /**/