Mercurial > vim
view src/testdir/test_backspace_opt.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 | e7ab58f57ea3 |
children |
line wrap: on
line source
" Tests for 'backspace' settings func Test_backspace_option() set backspace= call assert_equal('', &backspace) set backspace=indent call assert_equal('indent', &backspace) set backspace=eol call assert_equal('eol', &backspace) set backspace=start call assert_equal('start', &backspace) set backspace=nostop call assert_equal('nostop', &backspace) " Add the value set backspace= set backspace=indent call assert_equal('indent', &backspace) set backspace+=eol call assert_equal('indent,eol', &backspace) set backspace+=start call assert_equal('indent,eol,start', &backspace) set backspace+=nostop call assert_equal('indent,eol,start,nostop', &backspace) " Delete the value set backspace-=nostop call assert_equal('indent,eol,start', &backspace) set backspace-=indent call assert_equal('eol,start', &backspace) set backspace-=start call assert_equal('eol', &backspace) set backspace-=eol call assert_equal('', &backspace) " Check the error call assert_fails('set backspace=ABC', 'E474:') call assert_fails('set backspace+=def', 'E474:') " NOTE: Vim doesn't check following error... "call assert_fails('set backspace-=ghi', 'E474:') " Check backwards compatibility with version 5.4 and earlier set backspace=0 call assert_equal('0', &backspace) set backspace=1 call assert_equal('1', &backspace) set backspace=2 call assert_equal('2', &backspace) set backspace=3 call assert_equal('3', &backspace) call assert_fails('set backspace=4', 'E474:') call assert_fails('set backspace=10', 'E474:') " Cleared when 'compatible' is set set compatible call assert_equal('', &backspace) set nocompatible viminfo+=nviminfo endfunc " Test with backspace set to the non-compatible setting func Test_backspace_ctrl_u() new call append(0, [ \ "1 this shouldn't be deleted", \ "2 this shouldn't be deleted", \ "3 this shouldn't be deleted", \ "4 this should be deleted", \ "5 this shouldn't be deleted", \ "6 this shouldn't be deleted", \ "7 this shouldn't be deleted", \ "8 this shouldn't be deleted (not touched yet)"]) call cursor(2, 1) set compatible set backspace=2 exe "normal Avim1\<C-U>\<Esc>\<CR>" exe "normal Avim2\<C-G>u\<C-U>\<Esc>\<CR>" set cpo-=< inoremap <c-u> <left><c-u> exe "normal Avim3\<*C-U>\<Esc>\<CR>" iunmap <c-u> exe "normal Avim4\<C-U>\<C-U>\<Esc>\<CR>" " Test with backspace set to the compatible setting set backspace= visualbell exe "normal A vim5\<Esc>A\<C-U>\<C-U>\<Esc>\<CR>" exe "normal A vim6\<Esc>Azwei\<C-G>u\<C-U>\<Esc>\<CR>" inoremap <c-u> <left><c-u> exe "normal A vim7\<*C-U>\<*C-U>\<Esc>\<CR>" call assert_equal([ \ "1 this shouldn't be deleted", \ "2 this shouldn't be deleted", \ "3 this shouldn't be deleted", \ "4 this should be deleted3", \ "", \ "6 this shouldn't be deleted vim5", \ "7 this shouldn't be deleted vim6", \ "8 this shouldn't be deleted (not touched yet) vim7", \ ""], getline(1, '$')) " Reset values set compatible&vim set visualbell&vim set backspace&vim " Test new nostop option %d_ let expected = "foo bar foobar" call setline(1, expected) call cursor(1, 8) exe ":norm! ianotherone\<c-u>" call assert_equal(expected, getline(1)) call cursor(1, 8) exe ":norm! ianothertwo\<c-w>" call assert_equal(expected, getline(1)) let content = getline(1) for value in ['indent,nostop', 'eol,nostop', 'indent,eol,nostop', 'indent,eol,start,nostop'] exe ":set bs=".. value %d _ call setline(1, content) let expected = " foobar" call cursor(1, 8) exe ":norm! ianotherone\<c-u>" call assert_equal(expected, getline(1), 'CTRL-U backspace value: '.. &bs) let expected = "foo foobar" call setline(1, content) call cursor(1, 8) exe ":norm! ianothertwo\<c-w>" call assert_equal(expected, getline(1), 'CTRL-W backspace value: '.. &bs) endfor " Reset options set compatible&vim set visualbell&vim set backspace&vim close! endfunc " Test for setting 'backspace' to a number value (for backward compatibility) func Test_backspace_number_value() new set backspace=0 call setline(1, ['one two', 'three four']) call cursor(2, 1) exe "normal! A\<C-W>\<C-U>" call assert_equal('three four', getline(2)) set backspace=1 exe "normal! A\<CR>five\<C-W>\<C-U>\<C-W>\<C-U>" call assert_equal(['one two', 'three four'], getline(1, '$')) set backspace=2 call cursor(2, 7) exe "normal! ihalf\<C-U>" call assert_equal('three four', getline(2)) set backspace=3 call cursor(2, 7) exe "normal! ihalf\<C-U>" call assert_equal('four', getline(2)) bw! set backspace& endfunc " vim: shiftwidth=2 sts=2 expandtab