vim-patch:8.1.1205: BufReadPre may move the cursor #9980

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 vim/vim#4302, closes vim/vim#4294)
a68e595909
This commit is contained in:
Justin M. Keyes
2019-05-08 18:01:21 +02:00
committed by GitHub
parent d36ef9339f
commit 8330cc22af
4 changed files with 92 additions and 11 deletions

View File

@@ -5963,16 +5963,40 @@ void 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(void)
{
FOR_ALL_TAB_WINDOWS(tp, wp) {
if (wp->w_buffer == curbuf) {
// Restore the value if the autocommand didn't change it.
if (equalpos(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;
}
}
}
}
/*
* A snapshot of the window sizes, to restore them after closing the help