Mercurial > vim
view src/testdir/test_filechanged.vim @ 34686:83875247fbc0 v9.1.0224
patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text
Commit: https://github.com/vim/vim/commit/515f734e687f28f7199b2a8042197624d9f3ec15
Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Date: Thu Mar 28 12:01:14 2024 +0100
patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text
Problem: If a line has "right" & "below" virtual text properties,
where the "below" property may be stored first due to lack of
ordering between them, then the line height is calculated to
be 1 more and causes the cursor to far over the line.
Solution: Remove some unnecessary setting of a
`next_right_goes_below = TRUE` flag for "below" and "above"
text properties. (Dylan Thacker-Smith)
I modified a regression test I recently added to cover this case,
leveraging the fact that "after", "right" & "below" text properties are
being stored in the reverse of the order they are added in. The
previous version of this regression test was crafted to workaround this
issue so it can be addressed by this separate patch.
closes: #14317
Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 28 Mar 2024 12:15:03 +0100 |
parents | a7a9e8b9af89 |
children | 49637bd5c863 |
line wrap: on
line source
" Tests for when a file was changed outside of Vim. source check.vim func Test_FileChangedShell_reload() CheckUnix augroup testreload au FileChangedShell Xchanged_r let g:reason = v:fcs_reason | let v:fcs_choice = 'reload' augroup END new Xchanged_r call setline(1, 'reload this') write " Need to wait until the timestamp would change by at least a second. sleep 2 silent !echo 'extra line' >>Xchanged_r checktime call assert_equal('changed', g:reason) call assert_equal(2, line('$')) call assert_equal('extra line', getline(2)) " Only triggers once let g:reason = '' checktime call assert_equal('', g:reason) " When deleted buffer is not reloaded silent !rm Xchanged_r let g:reason = '' checktime call assert_equal('deleted', g:reason) call assert_equal(2, line('$')) call assert_equal('extra line', getline(2)) " When recreated buffer is reloaded call setline(1, 'buffer is changed') silent !echo 'new line' >>Xchanged_r let g:reason = '' checktime call assert_equal('conflict', g:reason) call assert_equal(1, line('$')) call assert_equal('new line', getline(1)) " Only mode changed silent !chmod +x Xchanged_r let g:reason = '' checktime call assert_equal('mode', g:reason) call assert_equal(1, line('$')) call assert_equal('new line', getline(1)) " Only time changed sleep 2 silent !touch Xchanged_r let g:reason = '' checktime call assert_equal('time', g:reason) call assert_equal(1, line('$')) call assert_equal('new line', getline(1)) if has('persistent_undo') " With an undo file the reload can be undone and a change before the " reload. set undofile call setline(2, 'before write') write call setline(2, 'after write') sleep 2 silent !echo 'different line' >>Xchanged_r let g:reason = '' checktime call assert_equal('conflict', g:reason) call assert_equal(3, line('$')) call assert_equal('before write', getline(2)) call assert_equal('different line', getline(3)) " undo the reload undo call assert_equal(2, line('$')) call assert_equal('after write', getline(2)) " undo the change before reload undo call assert_equal(2, line('$')) call assert_equal('before write', getline(2)) set noundofile endif au! testreload bwipe! call delete(undofile('Xchanged_r')) call delete('Xchanged_r') endfunc func Test_FileChangedShell_edit() CheckUnix new Xchanged_r call setline(1, 'reload this') set fileformat=unix write " File format changed, reload (content only, no 'ff' etc) augroup testreload au! au FileChangedShell Xchanged_r let g:reason = v:fcs_reason | let v:fcs_choice = 'reload' augroup END call assert_equal(&fileformat, 'unix') call writefile(["line1\r", "line2\r"], 'Xchanged_r', 'D') let g:reason = '' checktime call assert_equal('changed', g:reason) call assert_equal(&fileformat, 'unix') call assert_equal("line1\r", getline(1)) call assert_equal("line2\r", getline(2)) %s/\r write " File format changed, reload with 'ff', etc augroup testreload au! au FileChangedShell Xchanged_r let g:reason = v:fcs_reason | let v:fcs_choice = 'edit' augroup END call assert_equal(&fileformat, 'unix') call writefile(["line1\r", "line2\r"], 'Xchanged_r') let g:reason = '' checktime call assert_equal('changed', g:reason) call assert_equal(&fileformat, 'dos') call assert_equal('line1', getline(1)) call assert_equal('line2', getline(2)) set fileformat=unix write au! testreload bwipe! call delete(undofile('Xchanged_r')) endfunc func Test_FileChangedShell_edit_dialog() CheckNotGui CheckUnix " Using low level feedkeys() does not work on MS-Windows. new Xchanged_r call setline(1, 'reload this') set fileformat=unix write " File format changed, reload (content only) via prompt augroup testreload au! au FileChangedShell Xchanged_r let g:reason = v:fcs_reason | let v:fcs_choice = 'ask' augroup END call assert_equal(&fileformat, 'unix') call writefile(["line1\r", "line2\r"], 'Xchanged_r', 'D') let g:reason = '' call feedkeys('L', 'L') " load file content only checktime call assert_equal('changed', g:reason) call assert_equal(&fileformat, 'unix') call assert_equal("line1\r", getline(1)) call assert_equal("line2\r", getline(2)) %s/\r write " File format changed, reload (file and options) via prompt augroup testreload au! au FileChangedShell Xchanged_r let g:reason = v:fcs_reason | let v:fcs_choice = 'ask' augroup END call assert_equal(&fileformat, 'unix') call writefile(["line1\r", "line2\r"], 'Xchanged_r') let g:reason = '' call feedkeys('a', 'L') " load file content and options checktime call assert_equal('changed', g:reason) call assert_equal(&fileformat, 'dos') call assert_equal("line1", getline(1)) call assert_equal("line2", getline(2)) set fileformat=unix write au! testreload bwipe! call delete(undofile('Xchanged_r')) endfunc func Test_file_changed_dialog() CheckUnix CheckNotGui au! FileChangedShell new Xchanged_d call setline(1, 'reload this') write " Need to wait until the timestamp would change by at least a second. sleep 2 silent !echo 'extra line' >>Xchanged_d call feedkeys('L', 'L') checktime call assert_match('W11:', v:warningmsg) call assert_equal(2, line('$')) call assert_equal('reload this', getline(1)) call assert_equal('extra line', getline(2)) " delete buffer, only shows an error, no prompt silent !rm Xchanged_d checktime call assert_match('E211:', v:warningmsg) call assert_equal(2, line('$')) call assert_equal('extra line', getline(2)) let v:warningmsg = 'empty' " change buffer, recreate the file and reload call setline(1, 'buffer is changed') silent !echo 'new line' >Xchanged_d call feedkeys('L', 'L') checktime call assert_match('W12:', v:warningmsg) call assert_equal(1, line('$')) call assert_equal('new line', getline(1)) " Only mode changed, reload silent !chmod +x Xchanged_d call feedkeys('L', 'L') checktime call assert_match('W16:', v:warningmsg) call assert_equal(1, line('$')) call assert_equal('new line', getline(1)) " Only time changed, no prompt sleep 2 silent !touch Xchanged_d let v:warningmsg = '' checktime Xchanged_d call assert_equal('', v:warningmsg) call assert_equal(1, line('$')) call assert_equal('new line', getline(1)) " File created after starting to edit it call delete('Xchanged_d') new Xchanged_d call writefile(['one'], 'Xchanged_d', 'D') call feedkeys('L', 'L') checktime Xchanged_d call assert_equal(['one'], getline(1, '$')) close! bwipe! endfunc " Test for editing a new buffer from a FileChangedShell autocmd func Test_FileChangedShell_newbuf() call writefile(['one', 'two'], 'Xchfile', 'D') new Xchfile augroup testnewbuf autocmd FileChangedShell * enew augroup END call writefile(['red'], 'Xchfile') call assert_fails('checktime', 'E811:') au! testnewbuf endfunc " vim: shiftwidth=2 sts=2 expandtab