forked from aniani/vim
patch 9.1.0186: cursor pos wrong on mouse click after eol with 'rl', 've' and conceal
Problem: Wrong cursor position when clicking after end of line with 'rightleft', 'virtualedit' and conceal. Solution: Set values in ScreenCols[] also with SLF_RIGHTLEFT. Also fix off-by-one cursor position with 'colorcolumn' (zeertzjq). closes: #14218 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
f6272551bd
commit
deb2204bff
@@ -975,15 +975,14 @@ draw_screen_line(win_T *wp, winlinevars_T *wlv)
|
|||||||
++wlv->off;
|
++wlv->off;
|
||||||
++wlv->col;
|
++wlv->col;
|
||||||
}
|
}
|
||||||
|
++wlv->vcol;
|
||||||
|
|
||||||
if (VCOL_HLC >= rightmost_vcol
|
if (VCOL_HLC > rightmost_vcol
|
||||||
# ifdef LINE_ATTR
|
# ifdef LINE_ATTR
|
||||||
&& wlv->line_attr == 0
|
&& wlv->line_attr == 0
|
||||||
# endif
|
# endif
|
||||||
&& wlv->win_attr == 0)
|
&& wlv->win_attr == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
++wlv->vcol;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -18,8 +18,7 @@
|
|||||||
* 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 or before buffer text, MAXCOL means after the
|
* available or before buffer text.
|
||||||
* 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.
|
||||||
@@ -509,6 +508,8 @@ screen_line(
|
|||||||
// Clear rest first, because it's left of the text.
|
// Clear rest first, because it's left of the text.
|
||||||
if (clear_width > 0)
|
if (clear_width > 0)
|
||||||
{
|
{
|
||||||
|
int clear_start = col;
|
||||||
|
|
||||||
while (col <= endcol && ScreenLines[off_to] == ' '
|
while (col <= endcol && ScreenLines[off_to] == ' '
|
||||||
&& ScreenAttrs[off_to] == 0
|
&& ScreenAttrs[off_to] == 0
|
||||||
&& (!enc_utf8 || ScreenLinesUC[off_to] == 0))
|
&& (!enc_utf8 || ScreenLinesUC[off_to] == 0))
|
||||||
@@ -519,6 +520,10 @@ screen_line(
|
|||||||
if (col <= endcol)
|
if (col <= endcol)
|
||||||
screen_fill(row, row + 1, col + coloff,
|
screen_fill(row, row + 1, col + coloff,
|
||||||
endcol + coloff + 1, ' ', ' ', 0);
|
endcol + coloff + 1, ' ', ' ', 0);
|
||||||
|
|
||||||
|
for (int i = endcol; i >= clear_start; i--)
|
||||||
|
ScreenCols[off_to + (i - col)] =
|
||||||
|
(flags & SLF_INC_VCOL) ? ++last_vcol : last_vcol;
|
||||||
}
|
}
|
||||||
col = endcol + 1;
|
col = endcol + 1;
|
||||||
off_to = LineOffset[row] + col + coloff;
|
off_to = LineOffset[row] + col + coloff;
|
||||||
|
@@ -464,6 +464,53 @@ func Test_conceal_mouse_click()
|
|||||||
call test_setmouse(1, 32)
|
call test_setmouse(1, 32)
|
||||||
call feedkeys("\<LeftMouse>", "tx")
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
call assert_equal([0, 1, 24, 12, 36], getcurpos())
|
call assert_equal([0, 1, 24, 12, 36], getcurpos())
|
||||||
|
" Behavior should also be the same with 'colorcolumn'.
|
||||||
|
setlocal colorcolumn=30
|
||||||
|
redraw
|
||||||
|
call test_setmouse(1, 31)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 24, 11, 35], getcurpos())
|
||||||
|
call test_setmouse(1, 32)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 24, 12, 36], getcurpos())
|
||||||
|
setlocal colorcolumn&
|
||||||
|
|
||||||
|
if has('rightleft')
|
||||||
|
setlocal rightleft
|
||||||
|
call assert_equal([
|
||||||
|
\ ' ereh kcilc laecnoc',
|
||||||
|
\ ], ScreenLines(1, 40))
|
||||||
|
" Click on the space between "this" and "click" puts cursor there.
|
||||||
|
call test_setmouse(1, 41 - 9)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 13, 0, 13], getcurpos())
|
||||||
|
" Click on 'h' of "here" puts cursor there.
|
||||||
|
call test_setmouse(1, 41 - 16)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 20, 0, 20], getcurpos())
|
||||||
|
" Click on 'e' of "here" puts cursor there.
|
||||||
|
call test_setmouse(1, 41 - 19)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 23, 0, 23], getcurpos())
|
||||||
|
" Click after end of line puts cursor there with 'virtualedit'.
|
||||||
|
call test_setmouse(1, 41 - 20)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 24, 0, 24], getcurpos())
|
||||||
|
call test_setmouse(1, 41 - 21)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 24, 1, 25], getcurpos())
|
||||||
|
call test_setmouse(1, 41 - 22)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 24, 2, 26], getcurpos())
|
||||||
|
call test_setmouse(1, 41 - 31)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 24, 11, 35], getcurpos())
|
||||||
|
call test_setmouse(1, 41 - 32)
|
||||||
|
call feedkeys("\<LeftMouse>", "tx")
|
||||||
|
call assert_equal([0, 1, 24, 12, 36], getcurpos())
|
||||||
|
setlocal rightleft&
|
||||||
|
endif
|
||||||
|
|
||||||
set virtualedit&
|
set virtualedit&
|
||||||
|
|
||||||
" Test with a wrapped line.
|
" Test with a wrapped line.
|
||||||
|
@@ -704,6 +704,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 */
|
||||||
|
/**/
|
||||||
|
186,
|
||||||
/**/
|
/**/
|
||||||
185,
|
185,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user