mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
patch 9.0.0482: "g0" moves to wrong location with virtual text "above"
Problem: "g0" moves to wrong location with virtual text "above". Solution: Compensate for the extra columns. (closes #11141) Also fix "g$"
This commit is contained in:
28
src/move.c
28
src/move.c
@@ -470,19 +470,29 @@ check_top_offset(void)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update w_curswant.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
update_curswant_force(void)
|
||||||
|
{
|
||||||
|
validate_virtcol();
|
||||||
|
curwin->w_curswant = curwin->w_virtcol
|
||||||
|
#ifdef FEAT_PROP_POPUP
|
||||||
|
- curwin->w_virtcol_first_char
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
curwin->w_set_curswant = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update w_curswant if w_set_curswant is set.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
update_curswant(void)
|
update_curswant(void)
|
||||||
{
|
{
|
||||||
if (curwin->w_set_curswant)
|
if (curwin->w_set_curswant)
|
||||||
{
|
update_curswant_force();
|
||||||
validate_virtcol();
|
|
||||||
curwin->w_curswant = curwin->w_virtcol
|
|
||||||
#ifdef FEAT_PROP_POPUP
|
|
||||||
- curwin->w_virtcol_first_char
|
|
||||||
#endif
|
|
||||||
;
|
|
||||||
curwin->w_set_curswant = FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
48
src/normal.c
48
src/normal.c
@@ -5491,9 +5491,8 @@ nv_visual(cmdarg_T *cap)
|
|||||||
{
|
{
|
||||||
if (resel_VIsual_line_count <= 1)
|
if (resel_VIsual_line_count <= 1)
|
||||||
{
|
{
|
||||||
validate_virtcol();
|
update_curswant_force();
|
||||||
curwin->w_curswant = curwin->w_virtcol
|
curwin->w_curswant += resel_VIsual_vcol * cap->count0 - 1;
|
||||||
+ resel_VIsual_vcol * cap->count0 - 1;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
curwin->w_curswant = resel_VIsual_vcol;
|
curwin->w_curswant = resel_VIsual_vcol;
|
||||||
@@ -5506,9 +5505,8 @@ nv_visual(cmdarg_T *cap)
|
|||||||
}
|
}
|
||||||
else if (VIsual_mode == Ctrl_V)
|
else if (VIsual_mode == Ctrl_V)
|
||||||
{
|
{
|
||||||
validate_virtcol();
|
update_curswant_force();
|
||||||
curwin->w_curswant = curwin->w_virtcol
|
curwin->w_curswant += + resel_VIsual_vcol * cap->count0 - 1;
|
||||||
+ resel_VIsual_vcol * cap->count0 - 1;
|
|
||||||
coladvance(curwin->w_curswant);
|
coladvance(curwin->w_curswant);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -5735,13 +5733,19 @@ nv_g_home_m_cmd(cmdarg_T *cap)
|
|||||||
cap->oap->inclusive = FALSE;
|
cap->oap->inclusive = FALSE;
|
||||||
if (curwin->w_p_wrap && curwin->w_width != 0)
|
if (curwin->w_p_wrap && curwin->w_width != 0)
|
||||||
{
|
{
|
||||||
int width1 = curwin->w_width - curwin_col_off();
|
int width1 = curwin->w_width - curwin_col_off();
|
||||||
int width2 = width1 + curwin_col_off2();
|
int width2 = width1 + curwin_col_off2();
|
||||||
|
int virtcol;
|
||||||
|
|
||||||
validate_virtcol();
|
validate_virtcol();
|
||||||
|
virtcol = curwin->w_virtcol
|
||||||
|
#ifdef FEAT_PROP_POPUP
|
||||||
|
- curwin->w_virtcol_first_char
|
||||||
|
#endif
|
||||||
|
;
|
||||||
i = 0;
|
i = 0;
|
||||||
if (curwin->w_virtcol >= (colnr_T)width1 && width2 > 0)
|
if (virtcol >= (colnr_T)width1 && width2 > 0)
|
||||||
i = (curwin->w_virtcol - width1) / width2 * width2 + width1;
|
i = (virtcol - width1) / width2 * width2 + width1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
i = curwin->w_leftcol;
|
i = curwin->w_leftcol;
|
||||||
@@ -5815,24 +5819,32 @@ nv_g_dollar_cmd(cmdarg_T *cap)
|
|||||||
{
|
{
|
||||||
int width1 = curwin->w_width - col_off;
|
int width1 = curwin->w_width - col_off;
|
||||||
int width2 = width1 + curwin_col_off2();
|
int width2 = width1 + curwin_col_off2();
|
||||||
|
int virtcol;
|
||||||
|
|
||||||
validate_virtcol();
|
validate_virtcol();
|
||||||
|
virtcol = curwin->w_virtcol
|
||||||
|
#ifdef FEAT_PROP_POPUP
|
||||||
|
- curwin->w_virtcol_first_char
|
||||||
|
#endif
|
||||||
|
;
|
||||||
i = width1 - 1;
|
i = width1 - 1;
|
||||||
if (curwin->w_virtcol >= (colnr_T)width1)
|
if (virtcol >= (colnr_T)width1)
|
||||||
i += ((curwin->w_virtcol - width1) / width2 + 1)
|
i += ((virtcol - width1) / width2 + 1)
|
||||||
* width2;
|
* width2;
|
||||||
coladvance((colnr_T)i);
|
coladvance((colnr_T)i);
|
||||||
|
|
||||||
// Make sure we stick in this column.
|
// Make sure we stick in this column.
|
||||||
validate_virtcol();
|
update_curswant_force();
|
||||||
curwin->w_curswant = curwin->w_virtcol;
|
|
||||||
curwin->w_set_curswant = FALSE;
|
|
||||||
if (curwin->w_cursor.col > 0 && curwin->w_p_wrap)
|
if (curwin->w_cursor.col > 0 && curwin->w_p_wrap)
|
||||||
{
|
{
|
||||||
// Check for landing on a character that got split at
|
// Check for landing on a character that got split at
|
||||||
// the end of the line. We do not want to advance to
|
// the end of the line. We do not want to advance to
|
||||||
// the next screen line.
|
// the next screen line.
|
||||||
if (curwin->w_virtcol > (colnr_T)i)
|
if (curwin->w_virtcol
|
||||||
|
#ifdef FEAT_PROP_POPUP
|
||||||
|
- curwin->w_virtcol_first_char
|
||||||
|
#endif
|
||||||
|
> (colnr_T)i)
|
||||||
--curwin->w_cursor.col;
|
--curwin->w_cursor.col;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5860,9 +5872,7 @@ nv_g_dollar_cmd(cmdarg_T *cap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make sure we stick in this column.
|
// Make sure we stick in this column.
|
||||||
validate_virtcol();
|
update_curswant_force();
|
||||||
curwin->w_curswant = curwin->w_virtcol;
|
|
||||||
curwin->w_set_curswant = FALSE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
void redraw_for_cursorline(win_T *wp);
|
void redraw_for_cursorline(win_T *wp);
|
||||||
void update_topline_redraw(void);
|
void update_topline_redraw(void);
|
||||||
void update_topline(void);
|
void update_topline(void);
|
||||||
|
void update_curswant_force(void);
|
||||||
void update_curswant(void);
|
void update_curswant(void);
|
||||||
void check_cursor_moved(win_T *wp);
|
void check_cursor_moved(win_T *wp);
|
||||||
void changed_window_setting(void);
|
void changed_window_setting(void);
|
||||||
|
9
src/testdir/dumps/Test_prop_with_text_above_1a.dump
Normal file
9
src/testdir/dumps/Test_prop_with_text_above_1a.dump
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| @42
|
||||||
|
|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| @41
|
||||||
|
|o+0&#ffffff0|n|e| |t|w>o| @52
|
||||||
|
|t|h|r|e@1| |f|o|u|r| @49
|
||||||
|
@3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| @43
|
||||||
|
|f+0&#ffffff0|i|v|e| |s|i|x| @51
|
||||||
|
|~+0#4040ff13&| @58
|
||||||
|
|~| @58
|
||||||
|
| +0#0000000&@41|1|,|7|-|1|2|7| @6|A|l@1|
|
9
src/testdir/dumps/Test_prop_with_text_above_1b.dump
Normal file
9
src/testdir/dumps/Test_prop_with_text_above_1b.dump
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
|f+0&#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| @42
|
||||||
|
|s+0&#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| @41
|
||||||
|
>o+0&#ffffff0|n|e| |t|w|o| @52
|
||||||
|
|t|h|r|e@1| |f|o|u|r| @49
|
||||||
|
@3|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| @43
|
||||||
|
|f+0&#ffffff0|i|v|e| |s|i|x| @51
|
||||||
|
|~+0#4040ff13&| @58
|
||||||
|
|~| @58
|
||||||
|
| +0#0000000&@41|1|,|1|-|1|2|1| @6|A|l@1|
|
@@ -2869,6 +2869,11 @@ func Test_props_with_text_above()
|
|||||||
let buf = RunVimInTerminal('-S XscriptPropsWithTextAbove', #{rows: 9, cols: 60})
|
let buf = RunVimInTerminal('-S XscriptPropsWithTextAbove', #{rows: 9, cols: 60})
|
||||||
call VerifyScreenDump(buf, 'Test_prop_with_text_above_1', {})
|
call VerifyScreenDump(buf, 'Test_prop_with_text_above_1', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "ggg$")
|
||||||
|
call VerifyScreenDump(buf, 'Test_prop_with_text_above_1a', {})
|
||||||
|
call term_sendkeys(buf, "g0")
|
||||||
|
call VerifyScreenDump(buf, 'Test_prop_with_text_above_1b', {})
|
||||||
|
|
||||||
call term_sendkeys(buf, "ggI")
|
call term_sendkeys(buf, "ggI")
|
||||||
call VerifyScreenDump(buf, 'Test_prop_with_text_above_2', {})
|
call VerifyScreenDump(buf, 'Test_prop_with_text_above_2', {})
|
||||||
call term_sendkeys(buf, "inserted \<Esc>")
|
call term_sendkeys(buf, "inserted \<Esc>")
|
||||||
|
@@ -703,6 +703,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 */
|
||||||
|
/**/
|
||||||
|
482,
|
||||||
/**/
|
/**/
|
||||||
481,
|
481,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user