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 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)
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
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);
|
||||
int get_cellwidth(int c);
|
||||
void f_setcellwidths(typval_T *argvars, typval_T *rettv);
|
||||
void f_getcellwidths(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];
|
||||
|
||||
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'
|
||||
#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)
|
||||
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,
|
||||
" so run it as the last test.
|
||||
func Test_zz_ambiwidth_hl_dump()
|
||||
@ -321,7 +343,6 @@ func Test_zz_ambiwidth_hl_dump()
|
||||
call term_sendkeys(buf, ":echo\<CR>")
|
||||
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, ":echo\<CR>")
|
||||
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, ":echo\<CR>")
|
||||
call VerifyScreenDump(buf, 'Test_ambiwidth_hl_dump_1', {})
|
||||
endif
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
endfunc
|
||||
|
@ -704,6 +704,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
344,
|
||||
/**/
|
||||
343,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user