summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-05-29 19:18:01 +0200
committerBram Moolenaar <Bram@vim.org>2021-05-29 19:18:01 +0200
commit74ede80aeb272ac81d41a256057c4f250372dd00 (patch)
tree8174d5c488076e8fb910d88ed08b85fafba6d2a9
parenta06e345af5b8261c072c95b0446e67cfda439848 (diff)
downloadvim-git-74ede80aeb272ac81d41a256057c4f250372dd00.tar.gz
patch 8.2.2904: "g$" causes scroll if half a double width char is visiblev8.2.2904
Problem: "g$" causes scroll if half a double width char is visible. Solution: Advance to the last fully visible character. (closes #8254)
-rw-r--r--src/normal.c11
-rw-r--r--src/testdir/test_normal.vim28
-rw-r--r--src/version.c2
3 files changed, 38 insertions, 3 deletions
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
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2904,
+/**/
2903,
/**/
2902,