From: Bram Moolenaar Date: Mon, 8 Feb 2021 20:29:48 +0000 (+0100) Subject: patch 8.2.2487: terminal shows garbage after double-wide character X-Git-Tag: v8.2.2487 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4549dad874244fe933b969e4ac0b41923ee70dc3;p=vim patch 8.2.2487: terminal shows garbage after double-wide character Problem: Terminal shows garbage after double-wide character with a combining character. (Kyoichiro Yamada) Solution: Libvterm: do not add the width of the combining character to the glyph width. (closes #7801) --- diff --git a/src/libvterm/src/state.c b/src/libvterm/src/state.c index 390aa8dce..afb188c7e 100644 --- a/src/libvterm/src/state.c +++ b/src/libvterm/src/state.c @@ -384,7 +384,8 @@ static int on_text(const char bytes[], size_t len, void *user) abort(); } #endif - width += this_width; + if (i == glyph_starts || this_width > width) + width = this_width; } chars[glyph_ends - glyph_starts] = 0; diff --git a/src/testdir/dumps/Test_terminal_combining.dump b/src/testdir/dumps/Test_terminal_combining.dump new file mode 100644 index 000000000..390da0a3c --- /dev/null +++ b/src/testdir/dumps/Test_terminal_combining.dump @@ -0,0 +1,9 @@ +>ポ*0&#ffffff0| +&@72 +|~+0#4040ff13&| @73 +|~| @73 +|!+2#ffffff16#00e0003|/|b|i|n|/|s|h| |[|f|i|n|i|s|h|e|d|]| @37|1|,|1| @11|A|l@1 +| +0#0000000#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|[+1#0000000&|N|o| |N|a|m|e|]| @47|0|,|0|-|1| @9|A|l@1 +| +0&&@74 diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim index 8d47c0886..90241710e 100644 --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -965,7 +965,7 @@ func Test_terminal_composing_unicode() call assert_equal("b", l[1].chars) call assert_equal("c", l[2].chars) - " multibyte + composing + " multibyte + composing: がぎぐげご let txt = "\u304b\u3099\u304e\u304f\u3099\u3052\u3053\u3099" call term_sendkeys(buf, "echo " . txt) call TermWait(buf, 25) @@ -974,10 +974,15 @@ func Test_terminal_composing_unicode() call WaitForAssert({-> assert_equal(txt, term_getline(buf, lnum[1] + 1))}, 1000) let l = term_scrape(buf, lnum[1] + 1) call assert_equal("\u304b\u3099", l[0].chars) - call assert_equal("\u304e", l[2].chars) - call assert_equal("\u304f\u3099", l[3].chars) - call assert_equal("\u3052", l[5].chars) - call assert_equal("\u3053\u3099", l[6].chars) + call assert_equal(2, l[0].width) + call assert_equal("\u304e", l[1].chars) + call assert_equal(2, l[1].width) + call assert_equal("\u304f\u3099", l[2].chars) + call assert_equal(2, l[2].width) + call assert_equal("\u3052", l[3].chars) + call assert_equal(2, l[3].width) + call assert_equal("\u3053\u3099", l[4].chars) + call assert_equal(2, l[4].width) " \u00a0 + composing let txt = "abc\u00a0\u0308" @@ -1244,6 +1249,26 @@ func Test_open_term_from_cmd() call delete('Xopenterm') endfunc +func Test_combining_double_width() + CheckUnix + CheckRunVimInTerminal + + call writefile(["\xe3\x83\x9b\xe3\x82\x9a"], 'Xonedouble') + let lines =<< trim END + call term_start(['/bin/sh', '-c', 'cat Xonedouble']) + END + call writefile(lines, 'Xcombining') + let buf = RunVimInTerminal('-S Xcombining', #{rows: 9}) + + " this opens a window, incsearch should not use the old cursor position + call VerifyScreenDump(buf, 'Test_terminal_combining', {}) + call term_sendkeys(buf, ":q\") + + call StopVimInTerminal(buf) + call delete('Xonedouble') + call delete('Xcombining') +endfunc + func Test_terminal_popup_with_cmd() " this was crashing let buf = term_start(&shell, #{hidden: v:true}) diff --git a/src/version.c b/src/version.c index e203038df..d07c0e3ee 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2487, /**/ 2486, /**/