forked from aniani/vim
patch 8.2.3074: popup_atcursor() uses wrong position with concealing
Problem: popup_atcursor() uses wrong position with concealing. Solution: Keep w_wcol in conceal_check_cursor_line(). (closes #8476)
This commit is contained in:
15
src/edit.c
15
src/edit.c
@@ -147,6 +147,9 @@ edit(
|
|||||||
#ifdef FEAT_JOB_CHANNEL
|
#ifdef FEAT_JOB_CHANNEL
|
||||||
int cmdchar_todo = cmdchar;
|
int cmdchar_todo = cmdchar;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef FEAT_CONCEAL
|
||||||
|
int cursor_line_was_concealed;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Remember whether editing was restarted after CTRL-O.
|
// Remember whether editing was restarted after CTRL-O.
|
||||||
did_restart_edit = restart_edit;
|
did_restart_edit = restart_edit;
|
||||||
@@ -222,9 +225,9 @@ edit(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FEAT_CONCEAL
|
#ifdef FEAT_CONCEAL
|
||||||
// Check if the cursor line needs redrawing before changing State. If
|
// Check if the cursor line was concealed before changing State.
|
||||||
// 'concealcursor' is "n" it needs to be redrawn without concealing.
|
cursor_line_was_concealed = curwin->w_p_cole > 0
|
||||||
conceal_check_cursor_line();
|
&& conceal_cursor_line(curwin);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -283,6 +286,12 @@ edit(
|
|||||||
|
|
||||||
stop_insert_mode = FALSE;
|
stop_insert_mode = FALSE;
|
||||||
|
|
||||||
|
#ifdef FEAT_CONCEAL
|
||||||
|
// Check if the cursor line needs redrawing after changing State. If
|
||||||
|
// 'concealcursor' is "n" it needs to be redrawn without concealing.
|
||||||
|
conceal_check_cursor_line(cursor_line_was_concealed);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Need to recompute the cursor position, it might move when the cursor is
|
* Need to recompute the cursor position, it might move when the cursor is
|
||||||
* on a TAB or special character.
|
* on a TAB or special character.
|
||||||
|
|||||||
@@ -5747,8 +5747,8 @@ may_start_select(int c)
|
|||||||
n_start_visual_mode(int c)
|
n_start_visual_mode(int c)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_CONCEAL
|
#ifdef FEAT_CONCEAL
|
||||||
// Check for redraw before changing the state.
|
int cursor_line_was_concealed = curwin->w_p_cole > 0
|
||||||
conceal_check_cursor_line();
|
&& conceal_cursor_line(curwin);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
VIsual_mode = c;
|
VIsual_mode = c;
|
||||||
@@ -5770,8 +5770,8 @@ n_start_visual_mode(int c)
|
|||||||
|
|
||||||
setmouse();
|
setmouse();
|
||||||
#ifdef FEAT_CONCEAL
|
#ifdef FEAT_CONCEAL
|
||||||
// Check for redraw after changing the state.
|
// Check if redraw is needed after changing the state.
|
||||||
conceal_check_cursor_line();
|
conceal_check_cursor_line(cursor_line_was_concealed);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (p_smd && msg_silent == 0)
|
if (p_smd && msg_silent == 0)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* screen.c */
|
/* screen.c */
|
||||||
int conceal_cursor_line(win_T *wp);
|
int conceal_cursor_line(win_T *wp);
|
||||||
void conceal_check_cursor_line(void);
|
void conceal_check_cursor_line(int was_concealed);
|
||||||
int get_wcr_attr(win_T *wp);
|
int get_wcr_attr(win_T *wp);
|
||||||
void win_draw_end(win_T *wp, int c1, int c2, int draw_margin, int row, int endrow, hlf_T hl);
|
void win_draw_end(win_T *wp, int c1, int c2, int draw_margin, int row, int endrow, hlf_T hl);
|
||||||
int compute_foldcolumn(win_T *wp, int col);
|
int compute_foldcolumn(win_T *wp, int col);
|
||||||
|
|||||||
14
src/screen.c
14
src/screen.c
@@ -83,16 +83,26 @@ conceal_cursor_line(win_T *wp)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if the cursor line needs to be redrawn because of 'concealcursor'.
|
* Check if the cursor line needs to be redrawn because of 'concealcursor'.
|
||||||
|
* To be called after changing the state, "was_concealed" is the value of
|
||||||
|
* "conceal_cursor_line()" before the change.
|
||||||
|
* "
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
conceal_check_cursor_line(void)
|
conceal_check_cursor_line(int was_concealed)
|
||||||
{
|
{
|
||||||
if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin))
|
if (curwin->w_p_cole > 0 && conceal_cursor_line(curwin) != was_concealed)
|
||||||
{
|
{
|
||||||
|
int wcol = curwin->w_wcol;
|
||||||
|
|
||||||
need_cursor_line_redraw = TRUE;
|
need_cursor_line_redraw = TRUE;
|
||||||
// Need to recompute cursor column, e.g., when starting Visual mode
|
// Need to recompute cursor column, e.g., when starting Visual mode
|
||||||
// without concealing.
|
// without concealing.
|
||||||
curs_columns(TRUE);
|
curs_columns(TRUE);
|
||||||
|
|
||||||
|
// When concealing now w_wcol will be computed wrong, keep the previous
|
||||||
|
// value, it will be updated in win_line().
|
||||||
|
if (!was_concealed)
|
||||||
|
curwin->w_wcol = wcol;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
|-+0&#ffffff0@59| @14
|
|-+0&#ffffff0@59| @14
|
||||||
|-@59| @14
|
|-@59| @14
|
||||||
|-@25|%|-@16>@|-@14| @14
|
|-@25|%|-@16|@|-@14| @14
|
||||||
|-@25|f+0#0000001#ffd7ff255|i|R|S|t| |-+0#0000000#ffffff0@6|F+0#0000001#ffd7ff255|i|r|s|t| |-+0#0000000#ffffff0@14| @14
|
|-@25|f+0#0000001#ffd7ff255|i|R|S|t| |-+0#0000000#ffffff0@6|F+0#0000001#ffd7ff255|i|r|s|t| |-+0#0000000#ffffff0@14| @14
|
||||||
|-@25|s+0#0000001#ffd7ff255|e|C|O|n|d|-+0#0000000#ffffff0@6|S+0#0000001#ffd7ff255|e|c|o|n|D|-+0#0000000#ffffff0@14| @14
|
|-@25|s+0#0000001#ffd7ff255|e|C|O|n|d|-+0#0000000#ffffff0@6|S+0#0000001#ffd7ff255|e|c|o|n|D|-+0#0000000#ffffff0@14| @14
|
||||||
|-@59| @14
|
|-@59| @14
|
||||||
|-@1|f+0#0000001#ffd7ff255|i|r|s|t| |-+0#0000000#ffffff0@6|F+0#0000001#ffd7ff255|I|r|s|T| |-+0#0000000#ffffff0@38| @14
|
|-@1|f+0#0000001#ffd7ff255|i|r|s|t| |-+0#0000000#ffffff0@6|F+0#0000001#ffd7ff255|I|r|s|T| |-+0#0000000#ffffff0@38| @14
|
||||||
|-@1|s+0#0000001#ffd7ff255|e|c|o|n|d|-+0#0000000#ffffff0@6|S+0#0000001#ffd7ff255|E|c|o|N|D|-+0#0000000#ffffff0@38| @14
|
|-@1|s+0#0000001#ffd7ff255|e|c|o|n|d|-+0#0000000#ffffff0@6|S+0#0000001#ffd7ff255|E|c|o|N|D|-+0#0000000#ffffff0@6|m+0#0000001#ffd7ff255|a|r|k|-+0#0000000#ffffff0@27| @14
|
||||||
|-@1|#|-@16|&|-@38| @14
|
|-@1|#|-@16|&|-@4| @1>X|-@21| @23
|
||||||
|-@59| @14
|
|-@59| @14
|
||||||
|-@59| @14
|
|-@59| @14
|
||||||
@57|3|,|4|5| @9|T|o|p|
|
@57|9|,|3|8| @9|T|o|p|
|
||||||
|
|||||||
@@ -1462,6 +1462,13 @@ func Test_popup_atcursor_pos()
|
|||||||
\ moved: range(3),
|
\ moved: range(3),
|
||||||
\ mousemoved: range(3),
|
\ mousemoved: range(3),
|
||||||
\ })
|
\ })
|
||||||
|
|
||||||
|
normal 9G27|Rconcealed X
|
||||||
|
syn match Hidden /concealed/ conceal
|
||||||
|
set conceallevel=2 concealcursor=n
|
||||||
|
redraw
|
||||||
|
normal 0fX
|
||||||
|
call popup_atcursor('mark', {})
|
||||||
END
|
END
|
||||||
call writefile(lines, 'XtestPopupAtcursorPos')
|
call writefile(lines, 'XtestPopupAtcursorPos')
|
||||||
let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
|
let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
|
||||||
|
|||||||
2
src/ui.c
2
src/ui.c
@@ -1082,7 +1082,7 @@ ui_cursor_shape_forced(int forced)
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifdef FEAT_CONCEAL
|
# ifdef FEAT_CONCEAL
|
||||||
conceal_check_cursor_line();
|
conceal_check_cursor_line(FALSE);
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -755,6 +755,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 */
|
||||||
|
/**/
|
||||||
|
3074,
|
||||||
/**/
|
/**/
|
||||||
3073,
|
3073,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user