Mercurial > vim
changeset 13402:338b15c63e2c v8.0.1575
patch 8.0.1575: crash when using virtual replace
commit https://github.com/vim/vim/commit/63e82db6fc910b2d8f1cd018894e50e8b4448155
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Mar 6 12:10:48 2018 +0100
patch 8.0.1575: crash when using virtual replace
Problem: Crash when using virtual replace.
Solution: Adjust orig_line_count. Add more tests. (Christian Brabandt)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 06 Mar 2018 12:15:05 +0100 |
parents | 78cb47786195 |
children | a9a9583a17e7 |
files | src/edit.c src/testdir/test_visual.vim src/version.c |
diffstat | 3 files changed, 69 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/edit.c +++ b/src/edit.c @@ -8907,7 +8907,17 @@ ins_del(void) || do_join(2, FALSE, TRUE, FALSE, FALSE) == FAIL) vim_beep(BO_BS); else + { curwin->w_cursor.col = temp; +#ifdef FEAT_VREPLACE + /* Adjust orig_line_count in case more lines have been deleted than + * have been added. That makes sure, that open_line() later + * can access all buffer lines correctly */ + if (State & VREPLACE_FLAG && + orig_line_count > curbuf->b_ml.ml_line_count) + orig_line_count = curbuf->b_ml.ml_line_count; +#endif + } } else if (del_char(FALSE) == FAIL) /* delete char under cursor */ vim_beep(BO_BS);
--- a/src/testdir/test_visual.vim +++ b/src/testdir/test_visual.vim @@ -70,13 +70,13 @@ func TriggerTheProblem() exe "normal \<Esc>" catch /^Vim\%((\a\+)\)\=:E315/ echom 'Snap! E315 error!' - let g:msg='Snap! E315 error!' + let g:msg = 'Snap! E315 error!' endtry endfunc func Test_visual_mode_reset() enew - let g:msg="Everything's fine." + let g:msg = "Everything's fine." enew setl buftype=nofile call append(line('$'), 'Delete this line.') @@ -186,4 +186,59 @@ func Test_virtual_replace() call assert_equal(['AB......CDEFGHI.Jkl', \ 'AB IJKLMNO QRst'], getline(12, 13)) enew! + set noai bs&vim t_kD&vim t_kb&vim endfunc + +" Test Virtual replace mode. +func Test_virtual_replace2() + enew! + set bs=2 + exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz" + call cursor(1,1) + " Test 1: Test that del deletes the newline + exe "normal gR0\<del> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" + call assert_equal(['0 1', + \ 'A', + \ 'BCDEFGHIJ', + \ ' KL', + \ 'MNO', + \ 'PQR', + \ ], getline(1, 6)) + " Test 2: + " a newline is not deleted, if no newline has been added in virtual replace mode + %d_ + call setline(1, ['abcd', 'efgh', 'ijkl']) + call cursor(2,1) + exe "norm! gR1234\<cr>5\<bs>\<bs>\<bs>" + call assert_equal(['abcd', + \ '123h', + \ 'ijkl'], getline(1, '$')) + " Test 3: + " a newline is deleted, if a newline has been inserted before in virtual replace mode + %d_ + call setline(1, ['abcd', 'efgh', 'ijkl']) + call cursor(2,1) + exe "norm! gR1234\<cr>\<cr>56\<bs>\<bs>\<bs>" + call assert_equal(['abcd', + \ '1234', + \ 'ijkl'], getline(1, '$')) + " Test 4: + " delete add a newline, delete it, add it again and check undo + %d_ + call setline(1, ['abcd', 'efgh', 'ijkl']) + call cursor(2,1) + " break undo sequence explicitly + let &ul = &ul + exe "norm! gR1234\<cr>\<bs>\<del>56\<cr>" + let &ul = &ul + call assert_equal(['abcd', + \ '123456', + \ ''], getline(1, '$')) + norm! u + call assert_equal(['abcd', + \ 'efgh', + \ 'ijkl'], getline(1, '$')) + " clean up + %d_ + set bs&vim +endfunc