forked from aniani/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)
This commit is contained in:
@@ -384,7 +384,8 @@ static int on_text(const char bytes[], size_t len, void *user)
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
width += this_width;
|
if (i == glyph_starts || this_width > width)
|
||||||
|
width = this_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
chars[glyph_ends - glyph_starts] = 0;
|
chars[glyph_ends - glyph_starts] = 0;
|
||||||
|
|||||||
9
src/testdir/dumps/Test_terminal_combining.dump
Normal file
9
src/testdir/dumps/Test_terminal_combining.dump
Normal file
@@ -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
|
||||||
@@ -965,7 +965,7 @@ func Test_terminal_composing_unicode()
|
|||||||
call assert_equal("b", l[1].chars)
|
call assert_equal("b", l[1].chars)
|
||||||
call assert_equal("c", l[2].chars)
|
call assert_equal("c", l[2].chars)
|
||||||
|
|
||||||
" multibyte + composing
|
" multibyte + composing: がぎぐげご
|
||||||
let txt = "\u304b\u3099\u304e\u304f\u3099\u3052\u3053\u3099"
|
let txt = "\u304b\u3099\u304e\u304f\u3099\u3052\u3053\u3099"
|
||||||
call term_sendkeys(buf, "echo " . txt)
|
call term_sendkeys(buf, "echo " . txt)
|
||||||
call TermWait(buf, 25)
|
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)
|
call WaitForAssert({-> assert_equal(txt, term_getline(buf, lnum[1] + 1))}, 1000)
|
||||||
let l = term_scrape(buf, lnum[1] + 1)
|
let l = term_scrape(buf, lnum[1] + 1)
|
||||||
call assert_equal("\u304b\u3099", l[0].chars)
|
call assert_equal("\u304b\u3099", l[0].chars)
|
||||||
call assert_equal("\u304e", l[2].chars)
|
call assert_equal(2, l[0].width)
|
||||||
call assert_equal("\u304f\u3099", l[3].chars)
|
call assert_equal("\u304e", l[1].chars)
|
||||||
call assert_equal("\u3052", l[5].chars)
|
call assert_equal(2, l[1].width)
|
||||||
call assert_equal("\u3053\u3099", l[6].chars)
|
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
|
" \u00a0 + composing
|
||||||
let txt = "abc\u00a0\u0308"
|
let txt = "abc\u00a0\u0308"
|
||||||
@@ -1244,6 +1249,26 @@ func Test_open_term_from_cmd()
|
|||||||
call delete('Xopenterm')
|
call delete('Xopenterm')
|
||||||
endfunc
|
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\<CR>")
|
||||||
|
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('Xonedouble')
|
||||||
|
call delete('Xcombining')
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_terminal_popup_with_cmd()
|
func Test_terminal_popup_with_cmd()
|
||||||
" this was crashing
|
" this was crashing
|
||||||
let buf = term_start(&shell, #{hidden: v:true})
|
let buf = term_start(&shell, #{hidden: v:true})
|
||||||
|
|||||||
@@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
2487,
|
||||||
/**/
|
/**/
|
||||||
2486,
|
2486,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user