vim-patch:9.1.1891: g<End> does not move to last non-blank in visual mode (#36354)

Problem:  In visual mode, g<End> does not move to the last non-blank
          character when the end of a line is on the same line as the
          cursor (after v9.0.1753)
Solution: Move the cursor back by one position if it lands after the
          line (varsidry)

fixes: vim/vim#18657
closes: vim/vim#18658

adc85151f3
(cherry picked from commit b92b95e2c2)
This commit is contained in:
varsidry
2025-11-01 02:37:12 +01:00
committed by github-actions[bot]
parent 8b95dd2630
commit 7790dca2eb
3 changed files with 14 additions and 2 deletions

View File

@@ -790,7 +790,8 @@ tag char note action in Normal mode ~
|g@| g@{motion} call 'operatorfunc' |g@| g@{motion} call 'operatorfunc'
|g~| g~{motion} 2 swap case for Nmove text |g~| g~{motion} 2 swap case for Nmove text
|g<Down>| g<Down> 1 same as "gj" |g<Down>| g<Down> 1 same as "gj"
|g<End>| g<End> 1 same as "g$" |g<End>| g<End> 1 same as "g$" but go to the rightmost
non-blank character instead
|g<Home>| g<Home> 1 same as "g0" |g<Home>| g<Home> 1 same as "g0"
|g<LeftMouse>| g<LeftMouse> same as <C-LeftMouse> |g<LeftMouse>| g<LeftMouse> same as <C-LeftMouse>
g<MiddleMouse> same as <C-MiddleMouse> g<MiddleMouse> same as <C-MiddleMouse>

View File

@@ -5360,7 +5360,7 @@ static void nv_g_dollar_cmd(cmdarg_T *cap)
if (flag) { if (flag) {
do { do {
i = gchar_cursor(); i = gchar_cursor();
} while (ascii_iswhite(i) && oneleft() == OK); } while (ascii_iswhite_or_nul(i) && oneleft() == OK);
curwin->w_valid &= ~VALID_WCOL; curwin->w_valid &= ~VALID_WCOL;
} }
} }

View File

@@ -4186,6 +4186,17 @@ func Test_normal33_g_cmd_nonblank()
call assert_equal(20, col('.')) call assert_equal(20, col('.'))
exe "normal 0g\<kEnd>" exe "normal 0g\<kEnd>"
call assert_equal(11, col('.')) call assert_equal(11, col('.'))
" Test visual mode at end of line
normal 0$bvg$y
call assert_equal(80, col("'>"))
exe "normal 0$bvg\<End>y"
call assert_equal(71, col("'>"))
setlocal nowrap virtualedit=all
exe "normal 0$\<C-v>llg\<End>y"
call assert_equal(71, col("'<"))
exe "normal 0$llvg\<End>y"
call assert_equal(71, col("'<"))
bw! bw!
endfunc endfunc