# HG changeset patch # User Bram Moolenaar # Date 1616429704 -3600 # Node ID c784e176334cf6764fd894bc6348e98622f1534c # Parent 3e3376cc7bb7d70d1ccd903fcbdaa6643a69e80a patch 8.2.2640: screenstring() returns non-existing composing characters Commit: https://github.com/vim/vim/commit/f1387285e2ebe5cb3688d729fc6fd01a169a76c1 Author: Bram Moolenaar Date: Mon Mar 22 17:11:15 2021 +0100 patch 8.2.2640: screenstring() returns non-existing composing characters Problem: screenstring() returns non-existing composing characters. Solution: Only use composing characters if there is a base character. diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -7902,7 +7902,7 @@ f_screenstring(typval_T *argvars, typval c = ScreenLines[off]; buflen += mb_char2bytes(c, buf); - if (enc_utf8) + if (enc_utf8 && ScreenLinesUC[off] != 0) for (i = 0; i < Screen_mco && ScreenLinesC[i][off] != 0; ++i) buflen += mb_char2bytes(ScreenLinesC[i][off], buf + buflen); diff --git a/src/testdir/test_listchars.vim b/src/testdir/test_listchars.vim --- a/src/testdir/test_listchars.vim +++ b/src/testdir/test_listchars.vim @@ -146,7 +146,7 @@ func Test_listchars() set list " Non-breaking space let nbsp = nr2char(0xa0) - call append(0, [ ">".nbsp."<" ]) + call append(0, [ ">" .. nbsp .. "<" ]) let expected = '>X< ' @@ -193,12 +193,8 @@ func Test_listchars_unicode() set list let nbsp = nr2char(0xa0) - call append(0, [ - \ "a\tb c".nbsp."d" - \ ]) - let expected = [ - \ 'a←↔↔↔↔↔→b␣c≠d⇔' - \ ] + call append(0, ["a\tb c" .. nbsp .. "d"]) + let expected = ['a←↔↔↔↔↔→b␣c≠d⇔'] redraw! call cursor(1, 1) call assert_equal(expected, ScreenLines(1, virtcol('$'))) @@ -221,10 +217,10 @@ func Test_listchars_composing() let nbsp1 = nr2char(0xa0) let nbsp2 = nr2char(0x202f) call append(0, [ - \ " \u3099\t \u309A".nbsp1.nbsp1."\u0302".nbsp2.nbsp2."\u0302", + \ " \u3099\t \u309A" .. nbsp1 .. nbsp1 .. "\u0302" .. nbsp2 .. nbsp2 .. "\u0302", \ ]) let expected = [ - \ "_ \u3099^I \u309A=".nbsp1."\u0302=".nbsp2."\u0302$" + \ "_ \u3099^I \u309A=" .. nbsp1 .. "\u0302=" .. nbsp2 .. "\u0302$" \ ] redraw! call cursor(1, 1) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2640, +/**/ 2639, /**/ 2638,