view src/testdir/test_gn.vim @ 33713:9aa03e12b2b5 v9.0.2090

patch 9.0.2090: complete_info() skips entries with 'noselect' Commit: https://github.com/vim/vim/commit/57f9ce1a0977da13e5923214086795ffa2d28ce1 Author: Christian Brabandt <cb@256bit.org> Date: Sat Nov 4 09:58:14 2023 +0100 patch 9.0.2090: complete_info() skips entries with 'noselect' Problem: complete_info() skips entries with 'noselect' Solution: Check, if first entry is at original text state Unfortunately, Commit daef8c74375141974d61b85199b383017644978c introduced a regression, that when ':set completeopt+=noselect' is set and no completion item has been selected yet, it did not fill the complete_info['items'] list. This happened, because the current match item did not have the CP_ORIGINAL_TEXT flag set and then the cp->prev pointer did point to the original flag item, which caused the following while loop to not being run but being skipped instead. So when the 'noselect' is set, only start with to the previous selection item, if the initial completion item has the CP_ORIGINAL_TEXT flag set, else use the 2nd previous item instead. fixes: #13451 closes: #13452 Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sat, 04 Nov 2023 10:15:04 +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