From 74ede80aeb272ac81d41a256057c4f250372dd00 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 29 May 2021 19:18:01 +0200 Subject: patch 8.2.2904: "g$" causes scroll if half a double width char is visible Problem: "g$" causes scroll if half a double width char is visible. Solution: Advance to the last fully visible character. (closes #8254) --- src/normal.c | 11 +++++++++++ src/testdir/test_normal.vim | 28 +++++++++++++++++++++++++--- src/version.c | 2 ++ 3 files changed, 38 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/normal.c b/src/normal.c index 92135c18c..a7b32c649 100644 --- a/src/normal.c +++ b/src/normal.c @@ -6144,6 +6144,17 @@ nv_g_cmd(cmdarg_T *cap) i = curwin->w_leftcol + curwin->w_width - col_off - 1; coladvance((colnr_T)i); + // if the character doesn't fit move one back + if (curwin->w_cursor.col > 0 + && (*mb_ptr2cells)(ml_get_cursor()) > 1) + { + colnr_T vcol; + + getvvcol(curwin, &curwin->w_cursor, NULL, NULL, &vcol); + if (vcol >= curwin->w_leftcol + curwin->w_width - col_off) + --curwin->w_cursor.col; + } + // Make sure we stick in this column. validate_virtcol(); curwin->w_curswant = curwin->w_virtcol; diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim index 72a7253ff..f6e60a8ae 100644 --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -2201,9 +2201,9 @@ func Test_normal33_g_cmd2() %d 15vsp set wrap listchars= sbr= - let lineA='abcdefghijklmnopqrstuvwxyz' - let lineB='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' - let lineC='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + let lineA = 'abcdefghijklmnopqrstuvwxyz' + let lineB = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' + let lineC = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' $put =lineA $put =lineB @@ -2238,6 +2238,28 @@ func Test_normal33_g_cmd2() call assert_equal('l', getreg(0)) call assert_beeps('normal 5g$') + " Test for g$ with double-width character half displayed + vsplit + 9wincmd | + setlocal nowrap nonumber + call setline(2, 'asdfasdfヨ') + 2 + normal 0g$ + call assert_equal(8, col('.')) + 10wincmd | + normal 0g$ + call assert_equal(9, col('.')) + + setlocal signcolumn=yes + 11wincmd | + normal 0g$ + call assert_equal(8, col('.')) + 12wincmd | + normal 0g$ + call assert_equal(9, col('.')) + + close + " Test for g_ call assert_beeps('normal! 100g_') call setline(2, [' foo ', ' foobar ']) diff --git a/src/version.c b/src/version.c index c94183bfd..b95a96908 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 */ +/**/ + 2904, /**/ 2903, /**/ -- cgit v1.2.1