Mercurial > vim
view src/testdir/test_scrollbind.vim @ 34379:37b4c89ba420 v9.1.0116
patch 9.1.0116: win_split_ins may not check available room
Commit: https://github.com/vim/vim/commit/0fd44a5ad81ade342cb54d8984965bdedd2272c8
Author: Sean Dewar <6256228+seandewar@users.noreply.github.com>
Date: Tue Feb 20 20:28:15 2024 +0100
patch 9.1.0116: win_split_ins may not check available room
Problem: win_split_ins has no check for E36 when moving an existing
window
Solution: check for room and fix the issues in f_win_splitmove()
(Sean Dewar)
win_split_ins has no check for E36 when moving an existing window,
allowing for layouts with many overlapping zero-sized windows to be
created (which may also cause drawing issues with tablines and such).
f_win_splitmove also has some bugs.
So check for room and fix the issues in f_win_splitmove. Handle failure
in the two relevant win_split_ins callers by restoring the original
layout, and factor the common logic into win_splitmove.
Don't check for room when opening an autocommand window, as it's a
temporary window that's rarely interacted with or drawn anyhow, and is
rather important for some autocommands.
Issues fixed in f_win_splitmove:
- Error if splitting is disallowed.
- Fix heap-use-after-frees if autocommands fired from switching to "targetwin"
close "wp" or "oldwin".
- Fix splitting the wrong window if autocommands fired from switching to
"targetwin" switch to a different window.
- Ensure -1 is returned for all errors.
Also handle allocation failure a bit earlier in make_snapshot (callers,
except win_splitmove, don't really care if a snapshot can't be made, so
just ignore the return value).
Note: Test_smoothscroll_in_zero_width_window failed after these changes with
E36, as it was using the previous behaviour to create a zero-width window.
I've fixed the test such that it fails with UBSAN as expected when v9.0.1367 is
reverted (and simplified it too).
related: #14042
Signed-off-by: Sean Dewar <6256228+seandewar@users.noreply.github.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 20 Feb 2024 22:30:04 +0100 |
parents | d8fdafc4b390 |
children |
line wrap: on
line source
" Test for 'scrollbind' causing an unexpected scroll of one of the windows. func Test_scrollbind() " We don't want the status line to cause problems: set laststatus=0 let totalLines = &lines * 20 let middle = totalLines / 2 new | only for i in range(1, totalLines) call setline(i, 'LINE ' . i) endfor exe string(middle) normal zt normal M aboveleft vert new for i in range(1, totalLines) call setline(i, 'line ' . i) endfor exe string(middle) normal zt normal M " Execute the following two commands at once to reproduce the problem. setl scb | wincmd p setl scb wincmd w let topLineLeft = line('w0') wincmd p let topLineRight = line('w0') setl noscrollbind wincmd p setl noscrollbind call assert_equal(0, topLineLeft - topLineRight) endfunc " Test for 'scrollbind' func Test_scrollbind_opt() new | only set noscrollbind set scrollopt=ver,jump scrolloff=2 nowrap noequalalways splitbelow " Insert the text used for the test append start of window 1 . line 01 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 01 . line 02 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 02 . line 03 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 03 . line 04 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 04 . line 05 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 05 . line 06 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 06 . line 07 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 07 . line 08 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 08 . line 09 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 09 . line 10 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 10 . line 11 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 11 . line 12 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 12 . line 13 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 13 . line 14 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 14 . line 15 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 15 end of window 1 start of window 2 . line 01 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 01 . line 02 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 02 . line 03 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 03 . line 04 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 04 . line 05 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 05 . line 06 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 06 . line 07 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 07 . line 08 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 08 . line 09 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 09 . line 10 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 10 . line 11 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 11 . line 12 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 12 . line 13 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 13 . line 14 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 14 . line 15 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 15 . line 16 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 16 end of window 2 . " Test using two windows open to one buffer, one extra empty window split new wincmd t resize 8 call search('^start of window 1$') normal zt set scrollbind wincmd j resize 7 call search('^start of window 2$') normal zt set scrollbind " -- start of tests -- " Test scrolling down normal L5jHyy wincmd b | normal pr0 wincmd t | normal Hyy wincmd b | normal pr1 wincmd t | normal L6jHyy wincmd b | normal pr2 wincmd k | normal Hyy wincmd b | normal pr3 " Test scrolling up wincmd t | normal H4k wincmd j | normal H wincmd t | normal Hyy wincmd b | normal pr4 wincmd k | normal Hyy wincmd b | normal pr5 wincmd k | normal 3k wincmd t | normal H wincmd j | normal Hyy wincmd b | normal pr6 wincmd t | normal Hyy wincmd b | normal pr7 " Test horizontal scrolling set scrollopt+=hor normal gg"zyyG"zpG wincmd t | normal 015zly$ wincmd b | normal p"zpG wincmd k | normal y$ wincmd b | normal p"zpG wincmd k | normal 10jH7zhg0y$ wincmd b | normal p"zpG wincmd t | normal Hg0y$ wincmd b | normal p"zpG set scrollopt-=hor wincmd b call assert_equal([ \ '', \ '0 line 05 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 05', \ '1 line 05 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 05', \ '2 line 11 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 11', \ '3 line 11 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 11', \ '4 line 06 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 06', \ '5 line 06 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 06', \ '6 line 02 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 02', \ '7 line 02 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 02', \ '56789ABCDEFGHIJKLMNOPQRSTUVWXYZ 02', \ 'UTSRQPONMLKJIHGREDCBA9876543210 02', \ '. line 11 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 11', \ '. line 11 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 11', \ ''], getline(1, '$')) enew! " ****** tests using two different buffers ***** wincmd t | wincmd j | close wincmd t | set noscrollbind /start of window 2$/,/^end of window 2$/y new wincmd t | wincmd j | normal 4"zpGp wincmd t call search('^start of window 1$') normal zt set scrollbind wincmd j call search('^start of window 2$') normal zt set scrollbind " -- start of tests -- " Test scrolling down normal L5jHyy wincmd b | normal pr0 wincmd t | normal Hyy wincmd b | normal pr1 wincmd t | normal L6jHyy wincmd b | normal pr2 wincmd k | normal Hyy wincmd b | normal pr3 " Test scrolling up wincmd t | normal H4k wincmd j | normal H wincmd t | normal Hyy wincmd b | normal pr4 wincmd k | normal Hyy wincmd b | normal pr5 wincmd k | normal 3k wincmd t | normal H wincmd j | normal Hyy wincmd b | normal pr6 wincmd t | normal Hyy wincmd b | normal pr7 " Test horizontal scrolling set scrollopt+=hor normal gg"zyyG"zpG wincmd t | normal 015zly$ wincmd b | normal p"zpG wincmd k | normal y$ wincmd b | normal p"zpG wincmd k | normal 10jH7zhg0y$ wincmd b | normal p"zpG wincmd t | normal Hg0y$ wincmd b | normal p"zpG set scrollopt-=hor wincmd b call assert_equal([ \ '', \ '0 line 05 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 05', \ '1 line 05 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 05', \ '2 line 11 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 11', \ '3 line 11 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 11', \ '4 line 06 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 06', \ '5 line 06 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 06', \ '6 line 02 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 02', \ '7 line 02 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 02', \ '56789ABCDEFGHIJKLMNOPQRSTUVWXYZ 02', \ 'UTSRQPONMLKJIHGREDCBA9876543210 02', \ '. line 10 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 10', \ '. line 10 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 10', \ ''], getline(1, '$')) enew! " Test 'syncbind' wincmd t | set noscrollbind | normal ggL wincmd j | set noscrollbind | normal ggL set scrollbind wincmd t | set scrollbind | normal G wincmd j | normal G syncbind normal Hk wincmd t | normal H wincmd j | normal Hyy wincmd b | normal p wincmd t | normal yy wincmd b | normal p wincmd t | set noscrollbind | normal ggL wincmd j | set noscrollbind normal ggL set scrollbind wincmd t | set scrollbind wincmd t | normal G wincmd j | normal G wincmd t | syncbind | normal Hk wincmd j | normal H wincmd t | normal Hyy wincmd b | normal p wincmd t | wincmd j | normal yy wincmd b | normal p wincmd t | normal H3k wincmd j | normal H wincmd t | normal Hyy wincmd b | normal p wincmd t | wincmd j | normal yy wincmd b | normal p wincmd b call assert_equal([ \ '', \ '. line 16 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 16', \ 'start of window 2', \ 'start of window 2', \ '. line 16 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 16', \ '. line 15 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 15', \ '. line 12 ZYXWVUTSRQPONMLKJIHGREDCBA9876543210 12', \ ], getline(1, '$')) enew! new | only! set scrollbind& scrollopt& scrolloff& wrap& equalalways& splitbelow& endfunc " vim: shiftwidth=2 sts=2 expandtab