1
0
forked from aniani/vim

patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move

Problem:    A BufReadPre autocommand may cause the cursor to move.
Solution:   Restore the cursor position after executing the autocommand,
            unless the autocommand moved it. (Christian Brabandt,
            closes #4302, closes #4294)
This commit is contained in:
Bram Moolenaar
2019-04-25 22:22:01 +02:00
parent a561a41a70
commit a68e595909
6 changed files with 97 additions and 1 deletions

View File

@@ -6196,10 +6196,39 @@ check_lnums(int do_curwin)
FOR_ALL_TAB_WINDOWS(tp, wp)
if ((do_curwin || wp != curwin) && wp->w_buffer == curbuf)
{
// save the original cursor position and topline
wp->w_save_cursor.w_cursor_save = wp->w_cursor;
wp->w_save_cursor.w_topline_save = wp->w_topline;
if (wp->w_cursor.lnum > curbuf->b_ml.ml_line_count)
wp->w_cursor.lnum = curbuf->b_ml.ml_line_count;
if (wp->w_topline > curbuf->b_ml.ml_line_count)
wp->w_topline = curbuf->b_ml.ml_line_count;
// save the corrected cursor position and topline
wp->w_save_cursor.w_cursor_corr = wp->w_cursor;
wp->w_save_cursor.w_topline_corr = wp->w_topline;
}
}
/*
* Reset cursor and topline to its stored values from check_lnums().
* check_lnums() must have been called first!
*/
void
reset_lnums()
{
win_T *wp;
tabpage_T *tp;
FOR_ALL_TAB_WINDOWS(tp, wp)
if (wp->w_buffer == curbuf)
{
// Restore the value if the autocommand didn't change it.
if (EQUAL_POS(wp->w_save_cursor.w_cursor_corr, wp->w_cursor))
wp->w_cursor = wp->w_save_cursor.w_cursor_save;
if (wp->w_save_cursor.w_topline_corr == wp->w_topline)
wp->w_topline = wp->w_save_cursor.w_topline_save;
}
}