1
0
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:
mikoto2000 2024-04-17 22:06:54 +02:00 committed by Christian Brabandt
parent acdfb8a979
commit e20fa59903
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
7 changed files with 69 additions and 3 deletions

View File

@ -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)
/*

View File

@ -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);

View File

@ -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

View File

@ -0,0 +1,6 @@
>➜+0&#ffffff0@49
@10| @39
|➜@49
@10| @39
|~+0#4040ff13&| @48
| +0#0000000&@31|1|,|1| @10|A|l@1|

View File

@ -0,0 +1,6 @@
>➜+0&#ffffff0| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜|
|➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜|
|➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| @30
|➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜| |➜|
|@+0#4040ff13&@2| @46
| +0#0000000&@31|1|,|1| @10|T|o|p|

View File

@ -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

View File

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