patch 9.0.2022: getmousepos() returns wrong index for TAB char
Problem: When clicking in the middle of a TAB, getmousepos() returns
the column of the next char instead of the TAB.
Solution: Break out of the loop when the vcol to find is inside current
char. Fix invalid memory access when calling virtcol2col() on
an empty line.
closes: #13321
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
diff --git a/src/testdir/test_cursor_func.vim b/src/testdir/test_cursor_func.vim
index 4fc5928..3cdf4cb 100644
--- a/src/testdir/test_cursor_func.vim
+++ b/src/testdir/test_cursor_func.vim
@@ -573,6 +573,11 @@
call assert_equal(8, virtcol2col(0, 1, 7))
call assert_equal(8, virtcol2col(0, 1, 8))
+ " These used to cause invalid memory access
+ call setline(1, '')
+ call assert_equal(0, virtcol2col(0, 1, 1))
+ call assert_equal(0, virtcol2col(0, 1, 2))
+
let w = winwidth(0)
call setline(2, repeat('a', w + 2))
let win_nosbr = win_getid()
diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim
index bf0bf90..50b7fb2 100644
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -3366,6 +3366,46 @@
\ line: 1,
\ column: 1,
\ }, getmousepos())
+ call test_setmouse(1, 2)
+ call assert_equal(#{
+ \ screenrow: 1,
+ \ screencol: 2,
+ \ winid: win_getid(),
+ \ winrow: 1,
+ \ wincol: 2,
+ \ line: 1,
+ \ column: 1,
+ \ }, getmousepos())
+ call test_setmouse(1, 8)
+ call assert_equal(#{
+ \ screenrow: 1,
+ \ screencol: 8,
+ \ winid: win_getid(),
+ \ winrow: 1,
+ \ wincol: 8,
+ \ line: 1,
+ \ column: 1,
+ \ }, getmousepos())
+ call test_setmouse(1, 9)
+ call assert_equal(#{
+ \ screenrow: 1,
+ \ screencol: 9,
+ \ winid: win_getid(),
+ \ winrow: 1,
+ \ wincol: 9,
+ \ line: 1,
+ \ column: 2,
+ \ }, getmousepos())
+ call test_setmouse(1, 12)
+ call assert_equal(#{
+ \ screenrow: 1,
+ \ screencol: 12,
+ \ winid: win_getid(),
+ \ winrow: 1,
+ \ wincol: 12,
+ \ line: 1,
+ \ column: 2,
+ \ }, getmousepos())
call test_setmouse(1, 25)
call assert_equal(#{
\ screenrow: 1,