aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/window.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-11-29 13:24:24 +0800
committerGitHub <noreply@github.com>2023-11-29 13:24:24 +0800
commit640680cccead28c28b1b789c254fc83d55979c08 (patch)
tree92aef0917ea0de65bc65ee72e9fe4f246214566a /src/nvim/window.c
parent64b53b71ba5d804b2c8cf186be68931b2621f53c (diff)
downloadrneovim-640680cccead28c28b1b789c254fc83d55979c08.tar.gz
rneovim-640680cccead28c28b1b789c254fc83d55979c08.tar.bz2
rneovim-640680cccead28c28b1b789c254fc83d55979c08.zip
vim-patch:9.0.2134: ml_get error when scrolling (#26264)
Problem: ml_get error when scrolling after delete Solution: mark topline to be validated in main_loop if it is larger than current buffers line count reset_lnums() is called after e.g. TextChanged autocommands and it may accidentally cause curwin->w_topline to become invalid, e.g. if the autocommand has deleted some lines. So verify that curwin->w_topline points to a valid line and if not, mark the window to have w_topline recalculated in main_loop() in update_topline() after reset_lnums() returns. fixes: vim/vim#13568 fixes: vim/vim#13578 https://github.com/vim/vim/commit/c4ffeddfe5bd1824650e9b911ed9245bf56c69e3 The error doesn't happen in Nvim because Nvim triggers TextChanged after calling update_topline(). Co-authored-by: Christian Brabandt <cb@256bit.org>
Diffstat (limited to 'src/nvim/window.c')
-rw-r--r--src/nvim/window.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/nvim/window.c b/src/nvim/window.c
index ce038d2723..bcf245ef93 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -7101,8 +7101,9 @@ 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 and it was
- // set.
+ // Restore the value if the autocommand didn't change it and it was set.
+ // Note: This triggers e.g. on BufReadPre, when the buffer is not yet
+ // loaded, so cannot validate the buffer line
if (equalpos(wp->w_save_cursor.w_cursor_corr, wp->w_cursor)
&& wp->w_save_cursor.w_cursor_save.lnum != 0) {
wp->w_cursor = wp->w_save_cursor.w_cursor_save;
@@ -7111,6 +7112,9 @@ void reset_lnums(void)
&& wp->w_save_cursor.w_topline_save != 0) {
wp->w_topline = wp->w_save_cursor.w_topline_save;
}
+ if (wp->w_save_cursor.w_topline_save > wp->w_buffer->b_ml.ml_line_count) {
+ wp->w_valid &= ~VALID_TOPLINE;
+ }
}
}
}