diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-11-29 13:24:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-29 13:24:24 +0800 |
commit | 640680cccead28c28b1b789c254fc83d55979c08 (patch) | |
tree | 92aef0917ea0de65bc65ee72e9fe4f246214566a /test/functional | |
parent | 64b53b71ba5d804b2c8cf186be68931b2621f53c (diff) | |
download | rneovim-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 'test/functional')
-rw-r--r-- | test/functional/autocmd/autocmd_oldtest_spec.lua | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/test/functional/autocmd/autocmd_oldtest_spec.lua b/test/functional/autocmd/autocmd_oldtest_spec.lua index 29a6171269..dfd746a06e 100644 --- a/test/functional/autocmd/autocmd_oldtest_spec.lua +++ b/test/functional/autocmd/autocmd_oldtest_spec.lua @@ -1,10 +1,12 @@ local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') local clear = helpers.clear local eq = helpers.eq local meths = helpers.meths local funcs = helpers.funcs local exec = helpers.exec +local feed = helpers.feed describe('oldtests', function() before_each(clear) @@ -81,4 +83,44 @@ describe('oldtests', function() funcs.delete(fname) funcs.delete('Xout') end) + + -- oldtest: Test_delete_ml_get_errors() + it('no ml_get error with TextChanged autocommand and delete', function() + local screen = Screen.new(75, 10) + screen:attach() + screen:set_default_attr_ids({ + [1] = {background = Screen.colors.Cyan}; + }) + exec([[ + set noshowcmd noruler scrolloff=0 + source test/old/testdir/samples/matchparen.vim + edit test/old/testdir/samples/box.txt + ]]) + feed('249GV<C-End>d') + screen:expect{grid=[[ + const auto themeEmoji = _forPeer->themeEmoji(); | + if (themeEmoji.isEmpty()) { | + return nonCustom; | + } | + const auto &themes = _forPeer->owner().cloudThemes(); | + const auto theme = themes.themeForEmoji(themeEmoji); | + if (!theme) {1:{} | + return nonCustom; | + {1:^}} | + 353 fewer lines | + ]]} + feed('<PageUp>') + screen:expect{grid=[[ + | + auto BackgroundBox::Inner::resolveResetCustomPaper() const | + -> std::optional<Data::WallPaper> { | + if (!_forPeer) { | + return {}; | + } | + const auto nonCustom = Window::Theme::Background()->paper(); | + const auto themeEmoji = _forPeer->themeEmoji(); | + ^if (themeEmoji.isEmpty()) { | + 353 fewer lines | + ]]} + end) end) |