patch 9.1.0344: Cursor wrong after using setcellwidth() in terminal Commit: https://github.com/vim/vim/commit/e20fa59903525e15cecd680a2f32ece8a5d1bc0c Author: mikoto2000 <mikoto2...@gmail.com> Date: Wed Apr 17 22:06:54 2024 +0200
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 <mikoto2...@gmail.com> Signed-off-by: Christian Brabandt <c...@256bit.org> Fix CUI `setcellwidths` characters draw behavior to same GUI behavior. diff --git a/src/mbyte.c b/src/mbyte.c index 406d1093f..07446ca56 100644 --- a/src/mbyte.c +++ b/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) /* diff --git a/src/proto/mbyte.pro b/src/proto/mbyte.pro index 7883b3b4c..c57c94c8a 100644 --- a/src/proto/mbyte.pro +++ b/src/proto/mbyte.pro @@ -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); diff --git a/src/screen.c b/src/screen.c index 71ddbcaab..a8b4559b1 100644 --- a/src/screen.c +++ b/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 diff --git a/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_1.dump b/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_1.dump new file mode 100644 index 000000000..73f441812 --- /dev/null +++ b/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_1.dump @@ -0,0 +1,6 @@ +>âžś+0&#ffffff0@49 +@10| @39 +|âžś@49 +@10| @39 +|~+0#4040ff13&| @48 +| +0#0000000&@31|1|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_2.dump b/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_2.dump new file mode 100644 index 000000000..2b575f6b3 --- /dev/null +++ b/src/testdir/dumps/Test_setcellwidths_with_non_ambiwidth_character_dump_2.dump @@ -0,0 +1,6 @@ +>âžś+0&#ffffff0| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| +|âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| +|âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| @30 +|âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| |âžś| +|@+0#4040ff13&@2| @46 +| +0#0000000&@31|1|,|1| @10|T|o|p| diff --git a/src/testdir/test_utf8.vim b/src/testdir/test_utf8.vim index df0abd354..3fd83cf79 100644 --- a/src/testdir/test_utf8.vim +++ b/src/testdir/test_utf8.vim @@ -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 diff --git a/src/version.c b/src/version.c index 3c1eae66a..d4f82ba58 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 344, /**/ 343, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/vim_dev/E1rxBgM-00GUGU-Sq%40256bit.org.