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)
}
else
{
- len += (*mb_char2bytes)(c, buf + len);
- buf[len] = NUL;
+ char_u *p = buf + len;
+ 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);
return len;
p += 2;
i -= 2;
}
-# ifndef MSWIN
// When the GUI is not used CSI needs to be escaped.
else if (!gui.in_use && p[0] == CSI)
{
*p = (int)KE_CSI;
len += 2;
}
-# endif
else
#endif
if (p[0] == NUL || (p[0] == K_SPECIAL
" Tests for Unicode manipulations
+source check.vim
source view_util.vim
" Visual block Insert adjusts for multi-byte char
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