mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 9.0.1923: curswant wrong on click with 've' and 'wrap' set
Problem: curswant wrong on click with 've' and 'wrap' set Solution: Add w_leftcol to mouse click column. closes: #13142 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: zeertzjq <zeertzjq@outlook.com>
This commit is contained in:
committed by
Christian Brabandt
parent
a7aba6ca50
commit
db54e989b5
@@ -3852,7 +3852,14 @@ win_line(
|
|||||||
else
|
else
|
||||||
ScreenAttrs[wlv.off] = wlv.char_attr;
|
ScreenAttrs[wlv.off] = wlv.char_attr;
|
||||||
|
|
||||||
|
if (wlv.draw_state > WL_NR
|
||||||
|
#ifdef FEAT_DIFF
|
||||||
|
&& wlv.filler_todo <= 0
|
||||||
|
#endif
|
||||||
|
)
|
||||||
ScreenCols[wlv.off] = wlv.vcol;
|
ScreenCols[wlv.off] = wlv.vcol;
|
||||||
|
else
|
||||||
|
ScreenCols[wlv.off] = -1;
|
||||||
|
|
||||||
if (has_mbyte && (*mb_char2cells)(mb_c) > 1)
|
if (has_mbyte && (*mb_char2cells)(mb_c) > 1)
|
||||||
{
|
{
|
||||||
@@ -3865,19 +3872,21 @@ win_line(
|
|||||||
else
|
else
|
||||||
// DBCS: Put second byte in the second screen char.
|
// DBCS: Put second byte in the second screen char.
|
||||||
ScreenLines[wlv.off] = mb_c & 0xff;
|
ScreenLines[wlv.off] = mb_c & 0xff;
|
||||||
|
|
||||||
if (wlv.draw_state > WL_NR
|
if (wlv.draw_state > WL_NR
|
||||||
#ifdef FEAT_DIFF
|
#ifdef FEAT_DIFF
|
||||||
&& wlv.filler_todo <= 0
|
&& wlv.filler_todo <= 0
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
++wlv.vcol;
|
ScreenCols[wlv.off] = ++wlv.vcol;
|
||||||
|
else
|
||||||
|
ScreenCols[wlv.off] = -1;
|
||||||
|
|
||||||
// When "wlv.tocol" is halfway a character, set it to the end
|
// When "wlv.tocol" is halfway a character, set it to the end
|
||||||
// of the character, otherwise highlighting won't stop.
|
// of the character, otherwise highlighting won't stop.
|
||||||
if (wlv.tocol == wlv.vcol)
|
if (wlv.tocol == wlv.vcol)
|
||||||
++wlv.tocol;
|
++wlv.tocol;
|
||||||
|
|
||||||
ScreenCols[wlv.off] = wlv.vcol;
|
|
||||||
|
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
if (wp->w_p_rl)
|
if (wp->w_p_rl)
|
||||||
{
|
{
|
||||||
|
11
src/mouse.c
11
src/mouse.c
@@ -2115,11 +2115,16 @@ retnomove:
|
|||||||
else
|
else
|
||||||
off_r = off_m - 1;
|
off_r = off_m - 1;
|
||||||
}
|
}
|
||||||
col = ScreenCols[off_r] + (off_click - off_r);
|
colnr_T eol_vcol = ScreenCols[off_r];
|
||||||
|
if (eol_vcol < 0)
|
||||||
|
// Empty line or whole line before w_leftcol,
|
||||||
|
// with columns before buffer text
|
||||||
|
eol_vcol = curwin->w_leftcol - 1;
|
||||||
|
col = eol_vcol + (off_click - off_r);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
// Clicking on an empty line
|
// Empty line or whole line before w_leftcol
|
||||||
col = prev_col - curwin->w_wincol;
|
col = prev_col - curwin->w_wincol + curwin->w_leftcol;
|
||||||
}
|
}
|
||||||
else if (col_from_screen >= 0)
|
else if (col_from_screen >= 0)
|
||||||
{
|
{
|
||||||
|
@@ -18,8 +18,8 @@
|
|||||||
* displayed (excluding text written by external commands).
|
* displayed (excluding text written by external commands).
|
||||||
* ScreenAttrs[off] Contains the associated attributes.
|
* ScreenAttrs[off] Contains the associated attributes.
|
||||||
* ScreenCols[off] Contains the virtual columns in the line. -1 means not
|
* ScreenCols[off] Contains the virtual columns in the line. -1 means not
|
||||||
* available (below last line), MAXCOL means after the end
|
* available or before buffer text, MAXCOL means after the
|
||||||
* of the line.
|
* end of the line.
|
||||||
*
|
*
|
||||||
* LineOffset[row] Contains the offset into ScreenLines*[], ScreenAttrs[]
|
* LineOffset[row] Contains the offset into ScreenLines*[], ScreenAttrs[]
|
||||||
* and ScreenCols[] for each line.
|
* and ScreenCols[] for each line.
|
||||||
|
@@ -599,6 +599,61 @@ func Test_virtualedit_mouse()
|
|||||||
call feedkeys("\<LeftMouse>", "xt")
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
call assert_equal([0, 1, 10, 2, 15], getcurpos())
|
call assert_equal([0, 1, 10, 2, 15], getcurpos())
|
||||||
|
|
||||||
|
setlocal nowrap
|
||||||
|
call setline(2, repeat('a', 19))
|
||||||
|
normal! j14zl
|
||||||
|
redraw
|
||||||
|
call test_setmouse(row, 21 + 1)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 1, 10, 2, 15], getcurpos())
|
||||||
|
call test_setmouse(row, 21 + 11)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 1, 10, 12, 25], getcurpos())
|
||||||
|
call test_setmouse(row + 1, 21 + 1)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 2, 15, 0, 15], getcurpos())
|
||||||
|
call test_setmouse(row + 1, 21 + 11)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 2, 20, 5, 25], getcurpos())
|
||||||
|
|
||||||
|
setlocal number numberwidth=2
|
||||||
|
redraw
|
||||||
|
call test_setmouse(row, 21 + 3)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 1, 10, 2, 15], getcurpos())
|
||||||
|
call test_setmouse(row, 21 + 13)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 1, 10, 12, 25], getcurpos())
|
||||||
|
call test_setmouse(row + 1, 21 + 3)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 2, 15, 0, 15], getcurpos())
|
||||||
|
call test_setmouse(row + 1, 21 + 13)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 2, 20, 5, 25], getcurpos())
|
||||||
|
setlocal nonumber
|
||||||
|
|
||||||
|
if has('signs')
|
||||||
|
sign define Sign1 text=口
|
||||||
|
sign place 1 name=Sign1 line=1
|
||||||
|
sign place 2 name=Sign1 line=2
|
||||||
|
redraw
|
||||||
|
call test_setmouse(row, 21 + 3)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 1, 10, 2, 15], getcurpos())
|
||||||
|
call test_setmouse(row, 21 + 13)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 1, 10, 12, 25], getcurpos())
|
||||||
|
call test_setmouse(row + 1, 21 + 3)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 2, 15, 0, 15], getcurpos())
|
||||||
|
call test_setmouse(row + 1, 21 + 13)
|
||||||
|
call feedkeys("\<LeftMouse>", "xt")
|
||||||
|
call assert_equal([0, 2, 20, 5, 25], getcurpos())
|
||||||
|
sign unplace 1
|
||||||
|
sign unplace 2
|
||||||
|
sign undefine Sign1
|
||||||
|
endif
|
||||||
|
|
||||||
bwipe!
|
bwipe!
|
||||||
let &mouse = save_mouse
|
let &mouse = save_mouse
|
||||||
set virtualedit&
|
set virtualedit&
|
||||||
|
@@ -699,6 +699,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1923,
|
||||||
/**/
|
/**/
|
||||||
1922,
|
1922,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user