Mercurial > vim
view src/testdir/test_gn.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 | 381bd66762ea |
children |
line wrap: on
line source
" Test for gn command func Test_gn_command() noautocmd new " replace a single char by itself quoted: call setline('.', 'abc x def x ghi x jkl') let @/ = 'x' exe "norm! cgn'x'\<esc>.." call assert_equal("abc 'x' def 'x' ghi 'x' jkl", getline('.')) sil! %d_ " simple search match call setline('.', 'foobar') let @/ = 'foobar' exe "norm! gncsearchmatch" call assert_equal('searchmatch', getline('.')) sil! %d _ " replace a multi-line match call setline('.', ['', 'one', 'two']) let @/ = 'one\_s*two\_s' exe "norm! gnceins\<CR>zwei" call assert_equal(['','eins','zwei'], getline(1,'$')) sil! %d _ " test count argument call setline('.', ['', 'abcdx | abcdx | abcdx']) let @/ = '[a]bcdx' exe "norm! 2gnd" call assert_equal(['','abcdx | | abcdx'], getline(1,'$')) sil! %d _ " join lines call setline('.', ['join ', 'lines']) let @/ = '$' exe "norm! 0gnd" call assert_equal(['join lines'], getline(1,'$')) sil! %d _ " zero-width match call setline('.', ['', 'zero width pattern']) let @/ = '\>\zs' exe "norm! 0gnd" call assert_equal(['', 'zerowidth pattern'], getline(1,'$')) sil! %d _ " delete first and last chars call setline('.', ['delete first and last chars']) let @/ = '^' exe "norm! 0gnd$" let @/ = '\zs' exe "norm! gnd" call assert_equal(['elete first and last char'], getline(1,'$')) sil! %d _ " using visual mode call setline('.', ['', 'uniquepattern uniquepattern']) exe "norm! /[u]niquepattern/s\<cr>vlgnd" call assert_equal(['', ' uniquepattern'], getline(1,'$')) sil! %d _ " backwards search call setline('.', ['my very excellent mother just served us nachos']) let @/ = 'mother' exe "norm! $cgNmongoose" call assert_equal(['my very excellent mongoose just served us nachos'], getline(1,'$')) sil! %d _ " search for single char call setline('.', ['','for (i=0; i<=10; i++)']) let @/ = 'i' exe "norm! cgnj" call assert_equal(['','for (j=0; i<=10; i++)'], getline(1,'$')) sil! %d _ " search hex char call setline('.', ['','Y']) set noignorecase let @/ = '\%x59' exe "norm! gnd" call assert_equal(['',''], getline(1,'$')) sil! %d _ " test repeating gdn call setline('.', ['', '1', 'Johnny', '2', 'Johnny', '3']) let @/ = 'Johnny' exe "norm! dgn." call assert_equal(['','1', '', '2', '', '3'], getline(1,'$')) sil! %d _ " test repeating gUgn call setline('.', ['', '1', 'Depp', '2', 'Depp', '3']) let @/ = 'Depp' exe "norm! gUgn." call assert_equal(['', '1', 'DEPP', '2', 'DEPP', '3'], getline(1,'$')) sil! %d _ " test using look-ahead assertions call setline('.', ['a:10', '', 'a:1', '', 'a:20']) let @/ = 'a:0\@!\zs\d\+' exe "norm! 2nygno\<esc>p" call assert_equal(['a:10', '', 'a:1', '1', '', 'a:20'], getline(1,'$')) sil! %d _ " test using nowrapscan set nowrapscan call setline(1, 'foo bar baz') exe "norm! /bar/e\<cr>" exe "norm! gnd" call assert_equal(['foo baz'], getline(1,'$')) sil! %d_ " search upwards with nowrapscan set call setline('.', ['foo', 'bar', 'foo', 'baz']) set nowrapscan let @/ = 'foo' $ norm! dgN call assert_equal(['foo', 'bar', '', 'baz'], getline(1,'$')) sil! %d_ " search using the \zs atom call setline(1, [' nnoremap', '', 'nnoremap']) set wrapscan&vim let @/ = '\_s\zsnnoremap' $ norm! cgnmatch call assert_equal([' nnoremap', '', 'match'], getline(1,'$')) sil! %d_ " make sure it works correctly for one-char wide search items call setline('.', ['abcdefghi']) let @/ = 'a' exe "norm! 0fhvhhgNgU" call assert_equal(['ABCDEFGHi'], getline(1,'$')) call setline('.', ['abcdefghi']) let @/ = 'b' " this gn wraps around the end of the file exe "norm! 0fhvhhgngU" call assert_equal(['aBCDEFGHi'], getline(1,'$')) sil! %d _ call setline('.', ['abcdefghi']) let @/ = 'f' exe "norm! 0vllgngU" call assert_equal(['ABCDEFghi'], getline(1,'$')) sil! %d _ call setline('.', ['12345678']) let @/ = '5' norm! gg0f7vhhhhgnd call assert_equal(['12348'], getline(1,'$')) sil! %d _ call setline('.', ['12345678']) let @/ = '5' norm! gg0f2vf7gNd call assert_equal(['1678'], getline(1,'$')) sil! %d _ set wrapscan&vim " Without 'wrapscan', in visual mode, running gn without a match should fail " but the visual mode should be kept. set nowrapscan call setline('.', 'one two') let @/ = 'one' call assert_beeps('normal 0wvlgn') exe "normal y" call assert_equal('tw', @") " with exclusive selection, run gn and gN set selection=exclusive normal 0gny call assert_equal('one', @") normal 0wgNy call assert_equal('one', @") set selection& endfunc func Test_gN_repeat() new call setline(1, 'this list is a list with a list of a list.') /list normal $gNgNgNx call assert_equal('list with a list of a list', @") bwipe! endfunc func Test_gN_then_gn() new call setline(1, 'this list is a list with a list of a last.') /l.st normal $gNgNgnx call assert_equal('last', @") call setline(1, 'this list is a list with a lust of a last.') /l.st normal $gNgNgNgnx call assert_equal('lust of a last', @") bwipe! endfunc func Test_gn_multi_line() new call setline(1, [ \ 'func Tm1()', \ ' echo "one"', \ 'endfunc', \ 'func Tm2()', \ ' echo "two"', \ 'endfunc', \ 'func Tm3()', \ ' echo "three"', \ 'endfunc', \]) /\v^func Tm\d\(\)\n.*\zs".*"\ze$ normal jgnrx call assert_equal(' echo xxxxx', getline(5)) bwipe! endfunc " vim: shiftwidth=2 sts=2 expandtab