Mercurial > vim
diff src/window.c @ 16401:3b2db762a509 v8.1.1205
patch 8.1.1205: a BufReadPre autocommand may cause the cursor to move
commit https://github.com/vim/vim/commit/a68e59590905da9b4448ff1fcac929ad1a18da9e
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Apr 25 22:22:01 2019 +0200
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 25 Apr 2019 22:30:05 +0200 |
parents | b3bc3ba07bef |
children | 840fa633ad64 |
line wrap: on
line diff
--- a/src/window.c +++ b/src/window.c @@ -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; } }