forked from aniani/vim
patch 9.1.0344: Cursor wrong after using setcellwidth() in terminal
Problem: Cursor wrong after using setcellwidth() in terminal (mikoto2000) Solution: output additional spaces, so the behaviour matches the GUI (mikoto2000) fixes: #14539 closes: #14540 Signed-off-by: mikoto2000 <mikoto2000@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org> Fix CUI `setcellwidths` characters draw behavior to same GUI behavior.
This commit is contained in:
parent
acdfb8a979
commit
e20fa59903
14
src/mbyte.c
14
src/mbyte.c
@ -5542,6 +5542,20 @@ string_convert_ext(
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return 1 or 2 when "c" is in the cellwidth table.
|
||||||
|
* Return 0 if not.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
get_cellwidth(int c UNUSED)
|
||||||
|
{
|
||||||
|
#ifdef FEAT_EVAL
|
||||||
|
return cw_value(c);
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(FEAT_EVAL) || defined(PROTO)
|
#if defined(FEAT_EVAL) || defined(PROTO)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -85,6 +85,7 @@ int convert_input(char_u *ptr, int len, int maxlen);
|
|||||||
int convert_input_safe(char_u *ptr, int len, int maxlen, char_u **restp, int *restlenp);
|
int convert_input_safe(char_u *ptr, int len, int maxlen, char_u **restp, int *restlenp);
|
||||||
char_u *string_convert(vimconv_T *vcp, char_u *ptr, int *lenp);
|
char_u *string_convert(vimconv_T *vcp, char_u *ptr, int *lenp);
|
||||||
char_u *string_convert_ext(vimconv_T *vcp, char_u *ptr, int *lenp, int *unconvlenp);
|
char_u *string_convert_ext(vimconv_T *vcp, char_u *ptr, int *lenp, int *unconvlenp);
|
||||||
|
int get_cellwidth(int c);
|
||||||
void f_setcellwidths(typval_T *argvars, typval_T *rettv);
|
void f_setcellwidths(typval_T *argvars, typval_T *rettv);
|
||||||
void f_getcellwidths(typval_T *argvars, typval_T *rettv);
|
void f_getcellwidths(typval_T *argvars, typval_T *rettv);
|
||||||
void f_charclass(typval_T *argvars, typval_T *rettv);
|
void f_charclass(typval_T *argvars, typval_T *rettv);
|
||||||
|
19
src/screen.c
19
src/screen.c
@ -1981,7 +1981,24 @@ screen_char(unsigned off, int row, int col)
|
|||||||
{
|
{
|
||||||
char_u buf[MB_MAXBYTES + 1];
|
char_u buf[MB_MAXBYTES + 1];
|
||||||
|
|
||||||
if (utf_ambiguous_width(ScreenLinesUC[off]))
|
if (get_cellwidth(ScreenLinesUC[off]) > 1)
|
||||||
|
{
|
||||||
|
// If the width is set to 2 with `setcellwidths`
|
||||||
|
|
||||||
|
#ifdef FEAT_GUI
|
||||||
|
if (!gui.in_use)
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
// Clear the two screen cells. If the character is actually
|
||||||
|
// single width it won't change the second cell.
|
||||||
|
out_str((char_u *)" ");
|
||||||
|
term_windgoto(row, col);
|
||||||
|
screen_cur_col = 9999;
|
||||||
|
#ifdef FEAT_GUI
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else if (utf_ambiguous_width(ScreenLinesUC[off]))
|
||||||
{
|
{
|
||||||
if (*p_ambw == 'd'
|
if (*p_ambw == 'd'
|
||||||
#ifdef FEAT_GUI
|
#ifdef FEAT_GUI
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
>➜+0&#ffffff0@49
|
||||||
|
@10| @39
|
||||||
|
|➜@49
|
||||||
|
@10| @39
|
||||||
|
|~+0#4040ff13&| @48
|
||||||
|
| +0#0000000&@31|1|,|1| @10|A|l@1|
|
@ -0,0 +1,6 @@
|
|||||||
|
>➜+0&#ffffff0| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜|
|
||||||
|
|➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜|
|
||||||
|
|➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| @30
|
||||||
|
|➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜|
|
||||||
|
|@+0#4040ff13&@2| @46
|
||||||
|
| +0#0000000&@31|1|,|1| @10|T|o|p|
|
@ -300,6 +300,28 @@ func Test_setcellwidths_dump()
|
|||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
" When `setcellwidth` is used on characters that are not targets of `ambiwidth`.
|
||||||
|
func Test_setcellwidths_with_non_ambiwidth_character_dump()
|
||||||
|
CheckRunVimInTerminal
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
call setline(1, [repeat("\u279c", 60), repeat("\u279c", 60)])
|
||||||
|
set ambiwidth=single
|
||||||
|
END
|
||||||
|
call writefile(lines, 'XCellwidthsWithNonAmbiwidthCharacter', 'D')
|
||||||
|
let buf = RunVimInTerminal('-S XCellwidthsWithNonAmbiwidthCharacter', {'rows': 6, 'cols': 50})
|
||||||
|
call term_sendkeys(buf, ":call setcellwidths([[0x279c, 0x279c, 1]])\<CR>")
|
||||||
|
call term_sendkeys(buf, ":echo\<CR>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_setcellwidths_with_non_ambiwidth_character_dump_1', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, ":call setcellwidths([[0x279c, 0x279c, 2]])\<CR>")
|
||||||
|
call term_sendkeys(buf, ":echo\<CR>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_setcellwidths_with_non_ambiwidth_character_dump_2', {})
|
||||||
|
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
" For some reason this test causes Test_customlist_completion() to fail on CI,
|
" For some reason this test causes Test_customlist_completion() to fail on CI,
|
||||||
" so run it as the last test.
|
" so run it as the last test.
|
||||||
func Test_zz_ambiwidth_hl_dump()
|
func Test_zz_ambiwidth_hl_dump()
|
||||||
@ -321,7 +343,6 @@ func Test_zz_ambiwidth_hl_dump()
|
|||||||
call term_sendkeys(buf, ":echo\<CR>")
|
call term_sendkeys(buf, ":echo\<CR>")
|
||||||
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_1', {})
|
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_1', {})
|
||||||
|
|
||||||
if 0 " Enable after #14539 is fixed
|
|
||||||
call term_sendkeys(buf, ":call setcellwidths([[0x2103, 0x2103, 2]])\<CR>")
|
call term_sendkeys(buf, ":call setcellwidths([[0x2103, 0x2103, 2]])\<CR>")
|
||||||
call term_sendkeys(buf, ":echo\<CR>")
|
call term_sendkeys(buf, ":echo\<CR>")
|
||||||
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_2', {})
|
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_2', {})
|
||||||
@ -329,7 +350,6 @@ func Test_zz_ambiwidth_hl_dump()
|
|||||||
call term_sendkeys(buf, ":call setcellwidths([[0x2103, 0x2103, 1]])\<CR>")
|
call term_sendkeys(buf, ":call setcellwidths([[0x2103, 0x2103, 1]])\<CR>")
|
||||||
call term_sendkeys(buf, ":echo\<CR>")
|
call term_sendkeys(buf, ":echo\<CR>")
|
||||||
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_1', {})
|
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_1', {})
|
||||||
endif
|
|
||||||
|
|
||||||
call StopVimInTerminal(buf)
|
call StopVimInTerminal(buf)
|
||||||
endfunc
|
endfunc
|
||||||
|
@ -704,6 +704,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 */
|
||||||
|
/**/
|
||||||
|
344,
|
||||||
/**/
|
/**/
|
||||||
343,
|
343,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user