xref: /vim-8.2.3635/src/testdir/test_search.vim (revision 35a319b7)
14d6f32cbSBram Moolenaar" Test for the search command
24d6f32cbSBram Moolenaar
32e51d9a0SBram Moolenaarsource shared.vim
49d34d902SBram Moolenaarsource screendump.vim
58c5a278fSBram Moolenaarsource check.vim
62e51d9a0SBram Moolenaar
74d6f32cbSBram Moolenaarfunc Test_search_cmdline()
8b68df220SBram Moolenaar  CheckOption incsearch
9b68df220SBram Moolenaar
104d6f32cbSBram Moolenaar  " need to disable char_avail,
114d6f32cbSBram Moolenaar  " so that expansion of commandline works
12eb992cb9SBram Moolenaar  call test_override("char_avail", 1)
134d6f32cbSBram Moolenaar  new
144d6f32cbSBram Moolenaar  call setline(1, ['  1', '  2 these', '  3 the', '  4 their', '  5 there', '  6 their', '  7 the', '  8 them', '  9 these', ' 10 foobar'])
154d6f32cbSBram Moolenaar  " Test 1
164d6f32cbSBram Moolenaar  " CTRL-N / CTRL-P skips through the previous search history
174d6f32cbSBram Moolenaar  set noincsearch
184d6f32cbSBram Moolenaar  :1
194d6f32cbSBram Moolenaar  call feedkeys("/foobar\<cr>", 'tx')
204d6f32cbSBram Moolenaar  call feedkeys("/the\<cr>", 'tx')
214d6f32cbSBram Moolenaar  call assert_equal('the', @/)
221195669fSBram Moolenaar  call feedkeys("/thes\<C-P>\<C-P>\<cr>", 'tx')
234d6f32cbSBram Moolenaar  call assert_equal('foobar', @/)
244d6f32cbSBram Moolenaar
254d6f32cbSBram Moolenaar  " Test 2
261195669fSBram Moolenaar  " Ctrl-G goes from one match to the next
274d6f32cbSBram Moolenaar  " until the end of the buffer
284d6f32cbSBram Moolenaar  set incsearch nowrapscan
294d6f32cbSBram Moolenaar  :1
304d6f32cbSBram Moolenaar  " first match
314d6f32cbSBram Moolenaar  call feedkeys("/the\<cr>", 'tx')
324d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
334d6f32cbSBram Moolenaar  :1
344d6f32cbSBram Moolenaar  " second match
351195669fSBram Moolenaar  call feedkeys("/the\<C-G>\<cr>", 'tx')
364d6f32cbSBram Moolenaar  call assert_equal('  3 the', getline('.'))
37dda933d0SBram Moolenaar  call assert_equal([0, 0, 0, 0], getpos('"'))
384d6f32cbSBram Moolenaar  :1
394d6f32cbSBram Moolenaar  " third match
401195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 2)."\<cr>", 'tx')
414d6f32cbSBram Moolenaar  call assert_equal('  4 their', getline('.'))
424d6f32cbSBram Moolenaar  :1
434d6f32cbSBram Moolenaar  " fourth match
441195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 3)."\<cr>", 'tx')
454d6f32cbSBram Moolenaar  call assert_equal('  5 there', getline('.'))
464d6f32cbSBram Moolenaar  :1
474d6f32cbSBram Moolenaar  " fifth match
481195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 4)."\<cr>", 'tx')
494d6f32cbSBram Moolenaar  call assert_equal('  6 their', getline('.'))
504d6f32cbSBram Moolenaar  :1
514d6f32cbSBram Moolenaar  " sixth match
521195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 5)."\<cr>", 'tx')
534d6f32cbSBram Moolenaar  call assert_equal('  7 the', getline('.'))
544d6f32cbSBram Moolenaar  :1
554d6f32cbSBram Moolenaar  " seventh match
561195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 6)."\<cr>", 'tx')
574d6f32cbSBram Moolenaar  call assert_equal('  8 them', getline('.'))
584d6f32cbSBram Moolenaar  :1
593ba35409SBram Moolenaar  " eighth match
601195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 7)."\<cr>", 'tx')
614d6f32cbSBram Moolenaar  call assert_equal('  9 these', getline('.'))
624d6f32cbSBram Moolenaar  :1
634d6f32cbSBram Moolenaar  " no further match
641195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 8)."\<cr>", 'tx')
654d6f32cbSBram Moolenaar  call assert_equal('  9 these', getline('.'))
66dda933d0SBram Moolenaar  call assert_equal([0, 0, 0, 0], getpos('"'))
674d6f32cbSBram Moolenaar
684d6f32cbSBram Moolenaar  " Test 3
691195669fSBram Moolenaar  " Ctrl-G goes from one match to the next
704d6f32cbSBram Moolenaar  " and continues back at the top
714d6f32cbSBram Moolenaar  set incsearch wrapscan
724d6f32cbSBram Moolenaar  :1
734d6f32cbSBram Moolenaar  " first match
744d6f32cbSBram Moolenaar  call feedkeys("/the\<cr>", 'tx')
754d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
764d6f32cbSBram Moolenaar  :1
774d6f32cbSBram Moolenaar  " second match
781195669fSBram Moolenaar  call feedkeys("/the\<C-G>\<cr>", 'tx')
794d6f32cbSBram Moolenaar  call assert_equal('  3 the', getline('.'))
804d6f32cbSBram Moolenaar  :1
814d6f32cbSBram Moolenaar  " third match
821195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 2)."\<cr>", 'tx')
834d6f32cbSBram Moolenaar  call assert_equal('  4 their', getline('.'))
844d6f32cbSBram Moolenaar  :1
854d6f32cbSBram Moolenaar  " fourth match
861195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 3)."\<cr>", 'tx')
874d6f32cbSBram Moolenaar  call assert_equal('  5 there', getline('.'))
884d6f32cbSBram Moolenaar  :1
894d6f32cbSBram Moolenaar  " fifth match
901195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 4)."\<cr>", 'tx')
914d6f32cbSBram Moolenaar  call assert_equal('  6 their', getline('.'))
924d6f32cbSBram Moolenaar  :1
934d6f32cbSBram Moolenaar  " sixth match
941195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 5)."\<cr>", 'tx')
954d6f32cbSBram Moolenaar  call assert_equal('  7 the', getline('.'))
964d6f32cbSBram Moolenaar  :1
974d6f32cbSBram Moolenaar  " seventh match
981195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 6)."\<cr>", 'tx')
994d6f32cbSBram Moolenaar  call assert_equal('  8 them', getline('.'))
1004d6f32cbSBram Moolenaar  :1
1013ba35409SBram Moolenaar  " eighth match
1021195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 7)."\<cr>", 'tx')
1034d6f32cbSBram Moolenaar  call assert_equal('  9 these', getline('.'))
1044d6f32cbSBram Moolenaar  :1
1054d6f32cbSBram Moolenaar  " back at first match
1061195669fSBram Moolenaar  call feedkeys("/the".repeat("\<C-G>", 8)."\<cr>", 'tx')
1074d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
1084d6f32cbSBram Moolenaar
1094d6f32cbSBram Moolenaar  " Test 4
1101195669fSBram Moolenaar  " CTRL-T goes to the previous match
1114d6f32cbSBram Moolenaar  set incsearch nowrapscan
1124d6f32cbSBram Moolenaar  $
1134d6f32cbSBram Moolenaar  " first match
1144d6f32cbSBram Moolenaar  call feedkeys("?the\<cr>", 'tx')
1154d6f32cbSBram Moolenaar  call assert_equal('  9 these', getline('.'))
1164d6f32cbSBram Moolenaar  $
1174d6f32cbSBram Moolenaar  " first match
1181195669fSBram Moolenaar  call feedkeys("?the\<C-G>\<cr>", 'tx')
1194d6f32cbSBram Moolenaar  call assert_equal('  9 these', getline('.'))
1204d6f32cbSBram Moolenaar  $
1214d6f32cbSBram Moolenaar  " second match
1221195669fSBram Moolenaar  call feedkeys("?the".repeat("\<C-T>", 1)."\<cr>", 'tx')
1234d6f32cbSBram Moolenaar  call assert_equal('  8 them', getline('.'))
1244d6f32cbSBram Moolenaar  $
1254d6f32cbSBram Moolenaar  " last match
1261195669fSBram Moolenaar  call feedkeys("?the".repeat("\<C-T>", 7)."\<cr>", 'tx')
1274d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
1284d6f32cbSBram Moolenaar  $
1294d6f32cbSBram Moolenaar  " last match
1301195669fSBram Moolenaar  call feedkeys("?the".repeat("\<C-T>", 8)."\<cr>", 'tx')
1314d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
1324d6f32cbSBram Moolenaar
1334d6f32cbSBram Moolenaar  " Test 5
1341195669fSBram Moolenaar  " CTRL-T goes to the previous match
1354d6f32cbSBram Moolenaar  set incsearch wrapscan
1364d6f32cbSBram Moolenaar  $
1374d6f32cbSBram Moolenaar  " first match
1384d6f32cbSBram Moolenaar  call feedkeys("?the\<cr>", 'tx')
1394d6f32cbSBram Moolenaar  call assert_equal('  9 these', getline('.'))
1404d6f32cbSBram Moolenaar  $
1414d6f32cbSBram Moolenaar  " first match at the top
1421195669fSBram Moolenaar  call feedkeys("?the\<C-G>\<cr>", 'tx')
1434d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
1444d6f32cbSBram Moolenaar  $
1454d6f32cbSBram Moolenaar  " second match
1461195669fSBram Moolenaar  call feedkeys("?the".repeat("\<C-T>", 1)."\<cr>", 'tx')
1474d6f32cbSBram Moolenaar  call assert_equal('  8 them', getline('.'))
1484d6f32cbSBram Moolenaar  $
1494d6f32cbSBram Moolenaar  " last match
1501195669fSBram Moolenaar  call feedkeys("?the".repeat("\<C-T>", 7)."\<cr>", 'tx')
1514d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
1524d6f32cbSBram Moolenaar  $
1534d6f32cbSBram Moolenaar  " back at the bottom of the buffer
1541195669fSBram Moolenaar  call feedkeys("?the".repeat("\<C-T>", 8)."\<cr>", 'tx')
1554d6f32cbSBram Moolenaar  call assert_equal('  9 these', getline('.'))
1564d6f32cbSBram Moolenaar
1574d6f32cbSBram Moolenaar  " Test 6
1584d6f32cbSBram Moolenaar  " CTRL-L adds to the search pattern
1594d6f32cbSBram Moolenaar  set incsearch wrapscan
1604d6f32cbSBram Moolenaar  1
1614d6f32cbSBram Moolenaar  " first match
1624d6f32cbSBram Moolenaar  call feedkeys("/the\<c-l>\<cr>", 'tx')
1634d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
1644d6f32cbSBram Moolenaar  1
1654d6f32cbSBram Moolenaar  " go to next match of 'thes'
1661195669fSBram Moolenaar  call feedkeys("/the\<c-l>\<C-G>\<cr>", 'tx')
1674d6f32cbSBram Moolenaar  call assert_equal('  9 these', getline('.'))
1684d6f32cbSBram Moolenaar  1
1694d6f32cbSBram Moolenaar  " wrap around
1701195669fSBram Moolenaar  call feedkeys("/the\<c-l>\<C-G>\<C-G>\<cr>", 'tx')
1714d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
1724d6f32cbSBram Moolenaar  1
1734d6f32cbSBram Moolenaar  " wrap around
1744d6f32cbSBram Moolenaar  set nowrapscan
1751195669fSBram Moolenaar  call feedkeys("/the\<c-l>\<C-G>\<C-G>\<cr>", 'tx')
1764d6f32cbSBram Moolenaar  call assert_equal('  9 these', getline('.'))
1774d6f32cbSBram Moolenaar
1784d6f32cbSBram Moolenaar  " Test 7
1794d6f32cbSBram Moolenaar  " <bs> remove from match, but stay at current match
1804d6f32cbSBram Moolenaar  set incsearch wrapscan
1814d6f32cbSBram Moolenaar  1
1824d6f32cbSBram Moolenaar  " first match
1834d6f32cbSBram Moolenaar  call feedkeys("/thei\<cr>", 'tx')
1844d6f32cbSBram Moolenaar  call assert_equal('  4 their', getline('.'))
1854d6f32cbSBram Moolenaar  1
1864d6f32cbSBram Moolenaar  " delete one char, add another
1874d6f32cbSBram Moolenaar  call feedkeys("/thei\<bs>s\<cr>", 'tx')
188dda933d0SBram Moolenaar  call assert_equal('  2 these', getline('.'))
1894d6f32cbSBram Moolenaar  1
1904d6f32cbSBram Moolenaar  " delete one char, add another,  go to previous match, add one char
1911195669fSBram Moolenaar  call feedkeys("/thei\<bs>s\<bs>\<C-T>\<c-l>\<cr>", 'tx')
192dda933d0SBram Moolenaar  call assert_equal('  9 these', getline('.'))
1934d6f32cbSBram Moolenaar  1
1944d6f32cbSBram Moolenaar  " delete all chars, start from the beginning again
1954d6f32cbSBram Moolenaar  call feedkeys("/them". repeat("\<bs>",4).'the\>'."\<cr>", 'tx')
1964d6f32cbSBram Moolenaar  call assert_equal('  3 the', getline('.'))
1974d6f32cbSBram Moolenaar
1984d6f32cbSBram Moolenaar  " clean up
199eb992cb9SBram Moolenaar  call test_override("char_avail", 0)
2004d6f32cbSBram Moolenaar  bw!
2014d6f32cbSBram Moolenaarendfunc
2024d6f32cbSBram Moolenaar
2034d6f32cbSBram Moolenaarfunc Test_search_cmdline2()
204b68df220SBram Moolenaar  CheckOption incsearch
205b68df220SBram Moolenaar
2064d6f32cbSBram Moolenaar  " need to disable char_avail,
2074d6f32cbSBram Moolenaar  " so that expansion of commandline works
208eb992cb9SBram Moolenaar  call test_override("char_avail", 1)
2094d6f32cbSBram Moolenaar  new
2104d6f32cbSBram Moolenaar  call setline(1, ['  1', '  2 these', '  3 the theother'])
2114d6f32cbSBram Moolenaar  " Test 1
2121195669fSBram Moolenaar  " Ctrl-T goes correctly back and forth
2134d6f32cbSBram Moolenaar  set incsearch
2144d6f32cbSBram Moolenaar  1
2154d6f32cbSBram Moolenaar  " first match
2164d6f32cbSBram Moolenaar  call feedkeys("/the\<cr>", 'tx')
2174d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
2184d6f32cbSBram Moolenaar  1
2194d6f32cbSBram Moolenaar  " go to next match (on next line)
2201195669fSBram Moolenaar  call feedkeys("/the\<C-G>\<cr>", 'tx')
2214d6f32cbSBram Moolenaar  call assert_equal('  3 the theother', getline('.'))
2224d6f32cbSBram Moolenaar  1
2234d6f32cbSBram Moolenaar  " go to next match (still on line 3)
2241195669fSBram Moolenaar  call feedkeys("/the\<C-G>\<C-G>\<cr>", 'tx')
2254d6f32cbSBram Moolenaar  call assert_equal('  3 the theother', getline('.'))
2264d6f32cbSBram Moolenaar  1
2274d6f32cbSBram Moolenaar  " go to next match (still on line 3)
2281195669fSBram Moolenaar  call feedkeys("/the\<C-G>\<C-G>\<C-G>\<cr>", 'tx')
2294d6f32cbSBram Moolenaar  call assert_equal('  3 the theother', getline('.'))
2304d6f32cbSBram Moolenaar  1
2314d6f32cbSBram Moolenaar  " go to previous match (on line 3)
2321195669fSBram Moolenaar  call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<cr>", 'tx')
2334d6f32cbSBram Moolenaar  call assert_equal('  3 the theother', getline('.'))
2344d6f32cbSBram Moolenaar  1
2354d6f32cbSBram Moolenaar  " go to previous match (on line 3)
2361195669fSBram Moolenaar  call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<C-T>\<cr>", 'tx')
2374d6f32cbSBram Moolenaar  call assert_equal('  3 the theother', getline('.'))
2384d6f32cbSBram Moolenaar  1
2394d6f32cbSBram Moolenaar  " go to previous match (on line 2)
2401195669fSBram Moolenaar  call feedkeys("/the\<C-G>\<C-G>\<C-G>\<C-T>\<C-T>\<C-T>\<cr>", 'tx')
2414d6f32cbSBram Moolenaar  call assert_equal('  2 these', getline('.'))
24269a5b867SBram Moolenaar  1
24369a5b867SBram Moolenaar  " go to previous match (on line 2)
24469a5b867SBram Moolenaar  call feedkeys("/the\<C-G>\<C-R>\<C-W>\<cr>", 'tx')
24569a5b867SBram Moolenaar  call assert_equal('theother', @/)
2464d6f32cbSBram Moolenaar
247dda933d0SBram Moolenaar  " Test 2: keep the view,
248dda933d0SBram Moolenaar  " after deleting a character from the search cmd
249dda933d0SBram Moolenaar  call setline(1, ['  1', '  2 these', '  3 the', '  4 their', '  5 there', '  6 their', '  7 the', '  8 them', '  9 these', ' 10 foobar'])
250dda933d0SBram Moolenaar  resize 5
251dda933d0SBram Moolenaar  1
252dda933d0SBram Moolenaar  call feedkeys("/foo\<bs>\<cr>", 'tx')
253dda933d0SBram Moolenaar  redraw
254dda933d0SBram Moolenaar  call assert_equal({'lnum': 10, 'leftcol': 0, 'col': 4, 'topfill': 0, 'topline': 6, 'coladd': 0, 'skipcol': 0, 'curswant': 4}, winsaveview())
255dda933d0SBram Moolenaar
256dda933d0SBram Moolenaar  " remove all history entries
25769a5b867SBram Moolenaar  for i in range(11)
258dda933d0SBram Moolenaar      call histdel('/')
259dda933d0SBram Moolenaar  endfor
260dda933d0SBram Moolenaar
261dda933d0SBram Moolenaar  " Test 3: reset the view,
262dda933d0SBram Moolenaar  " after deleting all characters from the search cmd
263dda933d0SBram Moolenaar  norm! 1gg0
264dda933d0SBram Moolenaar  " unfortunately, neither "/foo\<c-w>\<cr>", nor "/foo\<bs>\<bs>\<bs>\<cr>",
265dda933d0SBram Moolenaar  " nor "/foo\<c-u>\<cr>" works to delete the commandline.
266dda933d0SBram Moolenaar  " In that case Vim should return "E35 no previous regular expression",
267dda933d0SBram Moolenaar  " but it looks like Vim still sees /foo and therefore the test fails.
2681bc353b6SBram Moolenaar  " Therefore, disabling this test
269e2e4075fSBram Moolenaar  "call assert_fails(feedkeys("/foo\<c-w>\<cr>", 'tx'), 'E35:')
270dda933d0SBram Moolenaar  "call assert_equal({'lnum': 1, 'leftcol': 0, 'col': 0, 'topfill': 0, 'topline': 1, 'coladd': 0, 'skipcol': 0, 'curswant': 0}, winsaveview())
271dda933d0SBram Moolenaar
2724d6f32cbSBram Moolenaar  " clean up
273dda933d0SBram Moolenaar  set noincsearch
274eb992cb9SBram Moolenaar  call test_override("char_avail", 0)
2754d6f32cbSBram Moolenaar  bw!
2764d6f32cbSBram Moolenaarendfunc
277ea683da5SBram Moolenaar
278ea683da5SBram Moolenaarfunc Test_use_sub_pat()
279ea683da5SBram Moolenaar  split
280ea683da5SBram Moolenaar  let @/ = ''
281ea683da5SBram Moolenaar  func X()
282ea683da5SBram Moolenaar    s/^/a/
283ea683da5SBram Moolenaar    /
284ea683da5SBram Moolenaar  endfunc
285ea683da5SBram Moolenaar  call X()
286ea683da5SBram Moolenaar  bwipe!
287ea683da5SBram Moolenaarendfunc
2886e450a57SBram Moolenaar
2896e450a57SBram Moolenaarfunc Test_searchpair()
2906e450a57SBram Moolenaar  new
2913ba35409SBram Moolenaar  call setline(1, ['other code', 'here [', ' [', ' " cursor here', ' ]]'])
2923ba35409SBram Moolenaar
293bade44e5SBram Moolenaar  " should not give an error for using "42"
294bade44e5SBram Moolenaar  call assert_equal(0, searchpair('a', 'b', 'c', '', 42))
295bade44e5SBram Moolenaar
2966e450a57SBram Moolenaar  4
2973ba35409SBram Moolenaar  call assert_equal(3, searchpair('\[', '', ']', 'bW'))
2983ba35409SBram Moolenaar  call assert_equal([0, 3, 2, 0], getpos('.'))
2993ba35409SBram Moolenaar  4
3003ba35409SBram Moolenaar  call assert_equal(2, searchpair('\[', '', ']', 'bWr'))
3013ba35409SBram Moolenaar  call assert_equal([0, 2, 6, 0], getpos('.'))
3023ba35409SBram Moolenaar  4
3033ba35409SBram Moolenaar  call assert_equal(1, searchpair('\[', '', ']', 'bWm'))
3043ba35409SBram Moolenaar  call assert_equal([0, 3, 2, 0], getpos('.'))
3053ba35409SBram Moolenaar  4|norm ^
3063ba35409SBram Moolenaar  call assert_equal(5, searchpair('\[', '', ']', 'Wn'))
3073ba35409SBram Moolenaar  call assert_equal([0, 4, 2, 0], getpos('.'))
3083ba35409SBram Moolenaar  4
3093ba35409SBram Moolenaar  call assert_equal(2, searchpair('\[', '', ']', 'bW',
3103ba35409SBram Moolenaar        \                         'getline(".") =~ "^\\s*\["'))
3113ba35409SBram Moolenaar  call assert_equal([0, 2, 6, 0], getpos('.'))
3126e450a57SBram Moolenaar  set nomagic
3136e450a57SBram Moolenaar  4
3143ba35409SBram Moolenaar  call assert_equal(3, searchpair('\[', '', ']', 'bW'))
3153ba35409SBram Moolenaar  call assert_equal([0, 3, 2, 0], getpos('.'))
3166e450a57SBram Moolenaar  set magic
3173ba35409SBram Moolenaar  4|norm ^
3183ba35409SBram Moolenaar  call assert_equal(0, searchpair('{', '', '}', 'bW'))
3193ba35409SBram Moolenaar  call assert_equal([0, 4, 2, 0], getpos('.'))
3203ba35409SBram Moolenaar
3213ba35409SBram Moolenaar  %d
3223ba35409SBram Moolenaar  call setline(1, ['if 1', '  if 2', '  else', '  endif 2', 'endif 1'])
3233ba35409SBram Moolenaar
3243ba35409SBram Moolenaar  /\<if 1
3253ba35409SBram Moolenaar  call assert_equal(5, searchpair('\<if\>', '\<else\>', '\<endif\>', 'W'))
3263ba35409SBram Moolenaar  call assert_equal([0, 5, 1, 0], getpos('.'))
3273ba35409SBram Moolenaar  /\<if 2
3283ba35409SBram Moolenaar  call assert_equal(3, searchpair('\<if\>', '\<else\>', '\<endif\>', 'W'))
3293ba35409SBram Moolenaar  call assert_equal([0, 3, 3, 0], getpos('.'))
3303ba35409SBram Moolenaar
3313ba35409SBram Moolenaar  q!
3323ba35409SBram Moolenaarendfunc
3333ba35409SBram Moolenaar
3343ba35409SBram Moolenaarfunc Test_searchpairpos()
3353ba35409SBram Moolenaar  new
3363ba35409SBram Moolenaar  call setline(1, ['other code', 'here [', ' [', ' " cursor here', ' ]]'])
3373ba35409SBram Moolenaar
3383ba35409SBram Moolenaar  4
3393ba35409SBram Moolenaar  call assert_equal([3, 2], searchpairpos('\[', '', ']', 'bW'))
3403ba35409SBram Moolenaar  call assert_equal([0, 3, 2, 0], getpos('.'))
3413ba35409SBram Moolenaar  4
3423ba35409SBram Moolenaar  call assert_equal([2, 6], searchpairpos('\[', '', ']', 'bWr'))
3433ba35409SBram Moolenaar  call assert_equal([0, 2, 6, 0], getpos('.'))
3443ba35409SBram Moolenaar  4|norm ^
3453ba35409SBram Moolenaar  call assert_equal([5, 2], searchpairpos('\[', '', ']', 'Wn'))
3463ba35409SBram Moolenaar  call assert_equal([0, 4, 2, 0], getpos('.'))
3473ba35409SBram Moolenaar  4
3483ba35409SBram Moolenaar  call assert_equal([2, 6], searchpairpos('\[', '', ']', 'bW',
3493ba35409SBram Moolenaar        \                                 'getline(".") =~ "^\\s*\["'))
3503ba35409SBram Moolenaar  call assert_equal([0, 2, 6, 0], getpos('.'))
3513ba35409SBram Moolenaar  4
3523ba35409SBram Moolenaar  call assert_equal([2, 6], searchpairpos('\[', '', ']', 'bWr'))
3533ba35409SBram Moolenaar  call assert_equal([0, 2, 6, 0], getpos('.'))
3543ba35409SBram Moolenaar  set nomagic
3553ba35409SBram Moolenaar  4
3563ba35409SBram Moolenaar  call assert_equal([3, 2], searchpairpos('\[', '', ']', 'bW'))
3573ba35409SBram Moolenaar  call assert_equal([0, 3, 2, 0], getpos('.'))
3583ba35409SBram Moolenaar  set magic
3593ba35409SBram Moolenaar  4|norm ^
3603ba35409SBram Moolenaar  call assert_equal([0, 0], searchpairpos('{', '', '}', 'bW'))
3613ba35409SBram Moolenaar  call assert_equal([0, 4, 2, 0], getpos('.'))
3623ba35409SBram Moolenaar
3633ba35409SBram Moolenaar  %d
3643ba35409SBram Moolenaar  call setline(1, ['if 1', '  if 2', '  else', '  endif 2', 'endif 1'])
3653ba35409SBram Moolenaar  /\<if 1
3663ba35409SBram Moolenaar  call assert_equal([5, 1], searchpairpos('\<if\>', '\<else\>', '\<endif\>', 'W'))
3673ba35409SBram Moolenaar  call assert_equal([0, 5, 1, 0], getpos('.'))
3683ba35409SBram Moolenaar  /\<if 2
3693ba35409SBram Moolenaar  call assert_equal([3, 3], searchpairpos('\<if\>', '\<else\>', '\<endif\>', 'W'))
3703ba35409SBram Moolenaar  call assert_equal([0, 3, 3, 0], getpos('.'))
3713ba35409SBram Moolenaar
3726e450a57SBram Moolenaar  q!
3736e450a57SBram Moolenaarendfunc
3746e450a57SBram Moolenaar
3753dddb09cSBram Moolenaarfunc Test_searchpair_errors()
3765b73992dSYegappan Lakshmanan  call assert_fails("call searchpair([0], 'middle', 'end', 'bW', 'skip', 99, 100)", 'E730: Using a List as a String')
3775b73992dSYegappan Lakshmanan  call assert_fails("call searchpair('start', {-> 0}, 'end', 'bW', 'skip', 99, 100)", 'E729: Using a Funcref as a String')
3785b73992dSYegappan Lakshmanan  call assert_fails("call searchpair('start', 'middle', {'one': 1}, 'bW', 'skip', 99, 100)", 'E731: Using a Dictionary as a String')
3793dddb09cSBram Moolenaar  call assert_fails("call searchpair('start', 'middle', 'end', 'flags', 'skip', 99, 100)", 'E475: Invalid argument: flags')
3803dddb09cSBram Moolenaar  call assert_fails("call searchpair('start', 'middle', 'end', 'bW', 'func', -99, 100)", 'E475: Invalid argument: -99')
3813dddb09cSBram Moolenaar  call assert_fails("call searchpair('start', 'middle', 'end', 'bW', 'func', 99, -100)", 'E475: Invalid argument: -100')
3823ba35409SBram Moolenaar  call assert_fails("call searchpair('start', 'middle', 'end', 'e')", 'E475: Invalid argument: e')
3833ba35409SBram Moolenaar  call assert_fails("call searchpair('start', 'middle', 'end', 'sn')", 'E475: Invalid argument: sn')
3843ba35409SBram Moolenaarendfunc
3853ba35409SBram Moolenaar
3863ba35409SBram Moolenaarfunc Test_searchpairpos_errors()
3875b73992dSYegappan Lakshmanan  call assert_fails("call searchpairpos([0], 'middle', 'end', 'bW', 'skip', 99, 100)", 'E730: Using a List as a String')
3885b73992dSYegappan Lakshmanan  call assert_fails("call searchpairpos('start', {-> 0}, 'end', 'bW', 'skip', 99, 100)", 'E729: Using a Funcref as a String')
3895b73992dSYegappan Lakshmanan  call assert_fails("call searchpairpos('start', 'middle', {'one': 1}, 'bW', 'skip', 99, 100)", 'E731: Using a Dictionary as a String')
3903ba35409SBram Moolenaar  call assert_fails("call searchpairpos('start', 'middle', 'end', 'flags', 'skip', 99, 100)", 'E475: Invalid argument: flags')
3913ba35409SBram Moolenaar  call assert_fails("call searchpairpos('start', 'middle', 'end', 'bW', 'func', -99, 100)", 'E475: Invalid argument: -99')
3923ba35409SBram Moolenaar  call assert_fails("call searchpairpos('start', 'middle', 'end', 'bW', 'func', 99, -100)", 'E475: Invalid argument: -100')
3933ba35409SBram Moolenaar  call assert_fails("call searchpairpos('start', 'middle', 'end', 'e')", 'E475: Invalid argument: e')
3943ba35409SBram Moolenaar  call assert_fails("call searchpairpos('start', 'middle', 'end', 'sn')", 'E475: Invalid argument: sn')
3953dddb09cSBram Moolenaarendfunc
3963dddb09cSBram Moolenaar
39748570488SBram Moolenaarfunc Test_searchpair_skip()
39848570488SBram Moolenaar    func Zero()
39948570488SBram Moolenaar      return 0
40048570488SBram Moolenaar    endfunc
40148570488SBram Moolenaar    func Partial(x)
40248570488SBram Moolenaar      return a:x
40348570488SBram Moolenaar    endfunc
40448570488SBram Moolenaar    new
40548570488SBram Moolenaar    call setline(1, ['{', 'foo', 'foo', 'foo', '}'])
40648570488SBram Moolenaar    3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', ''))
40748570488SBram Moolenaar    3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', '0'))
40848570488SBram Moolenaar    3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', {-> 0}))
40948570488SBram Moolenaar    3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', function('Zero')))
41048570488SBram Moolenaar    3 | call assert_equal(1, searchpair('{', '', '}', 'bWn', function('Partial', [0])))
41148570488SBram Moolenaar    bw!
41248570488SBram Moolenaarendfunc
41348570488SBram Moolenaar
414a43ebe94SBram Moolenaarfunc Test_searchpair_leak()
415a43ebe94SBram Moolenaar  new
416a43ebe94SBram Moolenaar  call setline(1, 'if one else another endif')
417a43ebe94SBram Moolenaar
418a43ebe94SBram Moolenaar  " The error in the skip expression caused memory to leak.
419a43ebe94SBram Moolenaar  call assert_fails("call searchpair('\\<if\\>', '\\<else\\>', '\\<endif\\>', '', '\"foo\" 2')", 'E15:')
420a43ebe94SBram Moolenaar
421a43ebe94SBram Moolenaar  bwipe!
422a43ebe94SBram Moolenaarendfunc
423a43ebe94SBram Moolenaar
42466727e16SBram Moolenaarfunc Test_searchc()
42566727e16SBram Moolenaar  " These commands used to cause memory overflow in searchc().
42666727e16SBram Moolenaar  new
42766727e16SBram Moolenaar  norm ixx
42866727e16SBram Moolenaar  exe "norm 0t\u93cf"
42966727e16SBram Moolenaar  bw!
43066727e16SBram Moolenaarendfunc
431a693d058SBram Moolenaar
432b0acacd7SBram Moolenaarfunc Cmdline3_prep()
433b0acacd7SBram Moolenaar  " need to disable char_avail,
434b0acacd7SBram Moolenaar  " so that expansion of commandline works
435b0acacd7SBram Moolenaar  call test_override("char_avail", 1)
436b0acacd7SBram Moolenaar  new
437b0acacd7SBram Moolenaar  call setline(1, ['  1', '  2 the~e', '  3 the theother'])
438b0acacd7SBram Moolenaar  set incsearch
439b0acacd7SBram Moolenaarendfunc
440b0acacd7SBram Moolenaar
441976b847fSBram Moolenaarfunc Incsearch_cleanup()
442b0acacd7SBram Moolenaar  set noincsearch
443b0acacd7SBram Moolenaar  call test_override("char_avail", 0)
444b0acacd7SBram Moolenaar  bw!
445b0acacd7SBram Moolenaarendfunc
446b0acacd7SBram Moolenaar
44721f990e1SBram Moolenaarfunc Test_search_cmdline3()
448b68df220SBram Moolenaar  CheckOption incsearch
449b68df220SBram Moolenaar
45021f990e1SBram Moolenaar  call Cmdline3_prep()
45121f990e1SBram Moolenaar  1
45221f990e1SBram Moolenaar  " first match
45321f990e1SBram Moolenaar  call feedkeys("/the\<c-l>\<cr>", 'tx')
45421f990e1SBram Moolenaar  call assert_equal('  2 the~e', getline('.'))
45521f990e1SBram Moolenaar
456976b847fSBram Moolenaar  call Incsearch_cleanup()
45721f990e1SBram Moolenaarendfunc
45821f990e1SBram Moolenaar
459b0acacd7SBram Moolenaarfunc Test_search_cmdline3s()
460b68df220SBram Moolenaar  CheckOption incsearch
461b68df220SBram Moolenaar
462b0acacd7SBram Moolenaar  call Cmdline3_prep()
463b0acacd7SBram Moolenaar  1
464b0acacd7SBram Moolenaar  call feedkeys(":%s/the\<c-l>/xxx\<cr>", 'tx')
465b0acacd7SBram Moolenaar  call assert_equal('  2 xxxe', getline('.'))
46621f990e1SBram Moolenaar  undo
46721f990e1SBram Moolenaar  call feedkeys(":%subs/the\<c-l>/xxx\<cr>", 'tx')
46821f990e1SBram Moolenaar  call assert_equal('  2 xxxe', getline('.'))
46921f990e1SBram Moolenaar  undo
47021f990e1SBram Moolenaar  call feedkeys(":%substitute/the\<c-l>/xxx\<cr>", 'tx')
47121f990e1SBram Moolenaar  call assert_equal('  2 xxxe', getline('.'))
472167ae426SBram Moolenaar  undo
473167ae426SBram Moolenaar  call feedkeys(":%smagic/the.e/xxx\<cr>", 'tx')
474167ae426SBram Moolenaar  call assert_equal('  2 xxx', getline('.'))
475167ae426SBram Moolenaar  undo
476e2e4075fSBram Moolenaar  call assert_fails(":%snomagic/the.e/xxx\<cr>", 'E486:')
477167ae426SBram Moolenaar  "
478167ae426SBram Moolenaar  call feedkeys(":%snomagic/the\\.e/xxx\<cr>", 'tx')
479167ae426SBram Moolenaar  call assert_equal('  2 xxx', getline('.'))
480b0acacd7SBram Moolenaar
481976b847fSBram Moolenaar  call Incsearch_cleanup()
482b0acacd7SBram Moolenaarendfunc
483b0acacd7SBram Moolenaar
484b0acacd7SBram Moolenaarfunc Test_search_cmdline3g()
485b68df220SBram Moolenaar  CheckOption incsearch
486b68df220SBram Moolenaar
487b0acacd7SBram Moolenaar  call Cmdline3_prep()
488b0acacd7SBram Moolenaar  1
489b0acacd7SBram Moolenaar  call feedkeys(":g/the\<c-l>/d\<cr>", 'tx')
490b0acacd7SBram Moolenaar  call assert_equal('  3 the theother', getline(2))
49121f990e1SBram Moolenaar  undo
49221f990e1SBram Moolenaar  call feedkeys(":global/the\<c-l>/d\<cr>", 'tx')
49321f990e1SBram Moolenaar  call assert_equal('  3 the theother', getline(2))
494def7b1dcSBram Moolenaar  undo
495def7b1dcSBram Moolenaar  call feedkeys(":g!/the\<c-l>/d\<cr>", 'tx')
496def7b1dcSBram Moolenaar  call assert_equal(1, line('$'))
497def7b1dcSBram Moolenaar  call assert_equal('  2 the~e', getline(1))
498def7b1dcSBram Moolenaar  undo
499def7b1dcSBram Moolenaar  call feedkeys(":global!/the\<c-l>/d\<cr>", 'tx')
500def7b1dcSBram Moolenaar  call assert_equal(1, line('$'))
501def7b1dcSBram Moolenaar  call assert_equal('  2 the~e', getline(1))
502b0acacd7SBram Moolenaar
503976b847fSBram Moolenaar  call Incsearch_cleanup()
504b0acacd7SBram Moolenaarendfunc
505b0acacd7SBram Moolenaar
506b0acacd7SBram Moolenaarfunc Test_search_cmdline3v()
507b68df220SBram Moolenaar  CheckOption incsearch
508b68df220SBram Moolenaar
509b0acacd7SBram Moolenaar  call Cmdline3_prep()
510b0acacd7SBram Moolenaar  1
511b0acacd7SBram Moolenaar  call feedkeys(":v/the\<c-l>/d\<cr>", 'tx')
512b0acacd7SBram Moolenaar  call assert_equal(1, line('$'))
513b0acacd7SBram Moolenaar  call assert_equal('  2 the~e', getline(1))
51421f990e1SBram Moolenaar  undo
51521f990e1SBram Moolenaar  call feedkeys(":vglobal/the\<c-l>/d\<cr>", 'tx')
51621f990e1SBram Moolenaar  call assert_equal(1, line('$'))
51721f990e1SBram Moolenaar  call assert_equal('  2 the~e', getline(1))
518b0acacd7SBram Moolenaar
519976b847fSBram Moolenaar  call Incsearch_cleanup()
520b0acacd7SBram Moolenaarendfunc
521b0acacd7SBram Moolenaar
522da5116daSBram Moolenaarfunc Test_search_cmdline4()
523b68df220SBram Moolenaar  CheckOption incsearch
524b68df220SBram Moolenaar
525da5116daSBram Moolenaar  " need to disable char_avail,
526da5116daSBram Moolenaar  " so that expansion of commandline works
527da5116daSBram Moolenaar  call test_override("char_avail", 1)
528da5116daSBram Moolenaar  new
529da5116daSBram Moolenaar  call setline(1, ['  1 the first', '  2 the second', '  3 the third'])
530da5116daSBram Moolenaar  set incsearch
531da5116daSBram Moolenaar  $
532da5116daSBram Moolenaar  call feedkeys("?the\<c-g>\<cr>", 'tx')
533da5116daSBram Moolenaar  call assert_equal('  3 the third', getline('.'))
534da5116daSBram Moolenaar  $
535da5116daSBram Moolenaar  call feedkeys("?the\<c-g>\<c-g>\<cr>", 'tx')
536da5116daSBram Moolenaar  call assert_equal('  1 the first', getline('.'))
537da5116daSBram Moolenaar  $
538da5116daSBram Moolenaar  call feedkeys("?the\<c-g>\<c-g>\<c-g>\<cr>", 'tx')
539da5116daSBram Moolenaar  call assert_equal('  2 the second', getline('.'))
540da5116daSBram Moolenaar  $
541da5116daSBram Moolenaar  call feedkeys("?the\<c-t>\<cr>", 'tx')
542da5116daSBram Moolenaar  call assert_equal('  1 the first', getline('.'))
543da5116daSBram Moolenaar  $
544da5116daSBram Moolenaar  call feedkeys("?the\<c-t>\<c-t>\<cr>", 'tx')
545da5116daSBram Moolenaar  call assert_equal('  3 the third', getline('.'))
546da5116daSBram Moolenaar  $
547da5116daSBram Moolenaar  call feedkeys("?the\<c-t>\<c-t>\<c-t>\<cr>", 'tx')
548da5116daSBram Moolenaar  call assert_equal('  2 the second', getline('.'))
549da5116daSBram Moolenaar  " clean up
550da5116daSBram Moolenaar  set noincsearch
551da5116daSBram Moolenaar  call test_override("char_avail", 0)
552da5116daSBram Moolenaar  bw!
553da5116daSBram Moolenaarendfunc
554db510071SBram Moolenaar
555f8e8c064SBram Moolenaarfunc Test_search_cmdline5()
556b68df220SBram Moolenaar  CheckOption incsearch
557b68df220SBram Moolenaar
558f8e8c064SBram Moolenaar  " Do not call test_override("char_avail", 1) so that <C-g> and <C-t> work
559f8e8c064SBram Moolenaar  " regardless char_avail.
560f8e8c064SBram Moolenaar  new
56169a5b867SBram Moolenaar  call setline(1, ['  1 the first', '  2 the second', '  3 the third', ''])
562f8e8c064SBram Moolenaar  set incsearch
563f8e8c064SBram Moolenaar  1
564f8e8c064SBram Moolenaar  call feedkeys("/the\<c-g>\<c-g>\<cr>", 'tx')
565f8e8c064SBram Moolenaar  call assert_equal('  3 the third', getline('.'))
566f8e8c064SBram Moolenaar  $
567f8e8c064SBram Moolenaar  call feedkeys("?the\<c-t>\<c-t>\<c-t>\<cr>", 'tx')
56869a5b867SBram Moolenaar  call assert_equal('  1 the first', getline('.'))
569f8e8c064SBram Moolenaar  " clean up
570f8e8c064SBram Moolenaar  set noincsearch
571f8e8c064SBram Moolenaar  bw!
572f8e8c064SBram Moolenaarendfunc
573f8e8c064SBram Moolenaar
574f8f8b2eaSBram Moolenaarfunc Test_search_cmdline6()
575f8f8b2eaSBram Moolenaar  " Test that consecutive matches
576f8f8b2eaSBram Moolenaar  " are caught by <c-g>/<c-t>
577b68df220SBram Moolenaar  CheckOption incsearch
578b68df220SBram Moolenaar
579f8f8b2eaSBram Moolenaar  " need to disable char_avail,
580f8f8b2eaSBram Moolenaar  " so that expansion of commandline works
581f8f8b2eaSBram Moolenaar  call test_override("char_avail", 1)
582f8f8b2eaSBram Moolenaar  new
583f8f8b2eaSBram Moolenaar  call setline(1, [' bbvimb', ''])
584f8f8b2eaSBram Moolenaar  set incsearch
585f8f8b2eaSBram Moolenaar  " first match
586f8f8b2eaSBram Moolenaar  norm! gg0
587f8f8b2eaSBram Moolenaar  call feedkeys("/b\<cr>", 'tx')
588f8f8b2eaSBram Moolenaar  call assert_equal([0,1,2,0], getpos('.'))
589f8f8b2eaSBram Moolenaar  " second match
590f8f8b2eaSBram Moolenaar  norm! gg0
591f8f8b2eaSBram Moolenaar  call feedkeys("/b\<c-g>\<cr>", 'tx')
592f8f8b2eaSBram Moolenaar  call assert_equal([0,1,3,0], getpos('.'))
593f8f8b2eaSBram Moolenaar  " third match
594f8f8b2eaSBram Moolenaar  norm! gg0
595f8f8b2eaSBram Moolenaar  call feedkeys("/b\<c-g>\<c-g>\<cr>", 'tx')
596f8f8b2eaSBram Moolenaar  call assert_equal([0,1,7,0], getpos('.'))
597f8f8b2eaSBram Moolenaar  " first match again
598f8f8b2eaSBram Moolenaar  norm! gg0
599f8f8b2eaSBram Moolenaar  call feedkeys("/b\<c-g>\<c-g>\<c-g>\<cr>", 'tx')
600f8f8b2eaSBram Moolenaar  call assert_equal([0,1,2,0], getpos('.'))
601f8f8b2eaSBram Moolenaar  set nowrapscan
602f8f8b2eaSBram Moolenaar  " last match
603f8f8b2eaSBram Moolenaar  norm! gg0
604f8f8b2eaSBram Moolenaar  call feedkeys("/b\<c-g>\<c-g>\<c-g>\<cr>", 'tx')
605f8f8b2eaSBram Moolenaar  call assert_equal([0,1,7,0], getpos('.'))
606f8f8b2eaSBram Moolenaar  " clean up
607f8f8b2eaSBram Moolenaar  set wrapscan&vim
608f8f8b2eaSBram Moolenaar  set noincsearch
609f8f8b2eaSBram Moolenaar  call test_override("char_avail", 0)
610f8f8b2eaSBram Moolenaar  bw!
611f8f8b2eaSBram Moolenaarendfunc
612f8f8b2eaSBram Moolenaar
613f8f8b2eaSBram Moolenaarfunc Test_search_cmdline7()
614d66cdcd4SBram Moolenaar  " Test that pressing <c-g> in an empty command line
615f8f8b2eaSBram Moolenaar  " does not move the cursor
616b68df220SBram Moolenaar  CheckOption incsearch
617b68df220SBram Moolenaar
618f8f8b2eaSBram Moolenaar  " need to disable char_avail,
619f8f8b2eaSBram Moolenaar  " so that expansion of commandline works
620f8f8b2eaSBram Moolenaar  call test_override("char_avail", 1)
621f8f8b2eaSBram Moolenaar  new
622f8f8b2eaSBram Moolenaar  let @/ = 'b'
623f8f8b2eaSBram Moolenaar  call setline(1, [' bbvimb', ''])
624f8f8b2eaSBram Moolenaar  set incsearch
625f8f8b2eaSBram Moolenaar  " first match
626f8f8b2eaSBram Moolenaar  norm! gg0
627f8f8b2eaSBram Moolenaar  " moves to next match of previous search pattern, just like /<cr>
628f8f8b2eaSBram Moolenaar  call feedkeys("/\<c-g>\<cr>", 'tx')
629f8f8b2eaSBram Moolenaar  call assert_equal([0,1,2,0], getpos('.'))
630f8f8b2eaSBram Moolenaar  " moves to next match of previous search pattern, just like /<cr>
631f8f8b2eaSBram Moolenaar  call feedkeys("/\<cr>", 'tx')
632f8f8b2eaSBram Moolenaar  call assert_equal([0,1,3,0], getpos('.'))
633f8f8b2eaSBram Moolenaar  " moves to next match of previous search pattern, just like /<cr>
634f8f8b2eaSBram Moolenaar  call feedkeys("/\<c-t>\<cr>", 'tx')
635f8f8b2eaSBram Moolenaar  call assert_equal([0,1,7,0], getpos('.'))
636d0480097SBram Moolenaar
637d0480097SBram Moolenaar  " using an offset uses the last search pattern
638d0480097SBram Moolenaar  call cursor(1, 1)
639d0480097SBram Moolenaar  call setline(1, ['1 bbvimb', ' 2 bbvimb'])
640d0480097SBram Moolenaar  let @/ = 'b'
641d0480097SBram Moolenaar  call feedkeys("//e\<c-g>\<cr>", 'tx')
642d0480097SBram Moolenaar  call assert_equal('1 bbvimb', getline('.'))
643d0480097SBram Moolenaar  call assert_equal(4, col('.'))
644d0480097SBram Moolenaar
645f8f8b2eaSBram Moolenaar  set noincsearch
646f8f8b2eaSBram Moolenaar  call test_override("char_avail", 0)
647f8f8b2eaSBram Moolenaar  bw!
648f8f8b2eaSBram Moolenaarendfunc
649f8f8b2eaSBram Moolenaar
650f8f8b2eaSBram Moolenaarfunc Test_search_cmdline8()
651f8f8b2eaSBram Moolenaar  " Highlighting is cleared in all windows
652f8f8b2eaSBram Moolenaar  " since hls applies to all windows
6538c5a278fSBram Moolenaar  CheckOption incsearch
6548c5a278fSBram Moolenaar  CheckFeature terminal
6558c5a278fSBram Moolenaar  CheckNotGui
656f8f8b2eaSBram Moolenaar  if has("win32")
657f8f8b2eaSBram Moolenaar    throw "Skipped: Bug with sending <ESC> to terminal window not fixed yet"
658f8f8b2eaSBram Moolenaar  endif
6598c5a278fSBram Moolenaar
660f8f8b2eaSBram Moolenaar  let h = winheight(0)
661f8f8b2eaSBram Moolenaar  if h < 3
662f8f8b2eaSBram Moolenaar    return
663f8f8b2eaSBram Moolenaar  endif
664f8f8b2eaSBram Moolenaar  " Prepare buffer text
665f8f8b2eaSBram Moolenaar  let lines = ['abb vim vim vi', 'vimvivim']
666f8f8b2eaSBram Moolenaar  call writefile(lines, 'Xsearch.txt')
66713deab8dSBram Moolenaar  let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3})
668f8f8b2eaSBram Moolenaar
6690e9d1ae3SBram Moolenaar  call WaitForAssert({-> assert_equal(lines, [term_getline(buf, 1), term_getline(buf, 2)])})
670f8f8b2eaSBram Moolenaar
67113deab8dSBram Moolenaar  call term_sendkeys(buf, ":set incsearch hlsearch\<cr>")
67213deab8dSBram Moolenaar  call term_sendkeys(buf, ":14vsp\<cr>")
67313deab8dSBram Moolenaar  call term_sendkeys(buf, "/vim\<cr>")
67413deab8dSBram Moolenaar  call term_sendkeys(buf, "/b\<esc>")
67513deab8dSBram Moolenaar  call term_sendkeys(buf, "gg0")
6766a2c5a7dSBram Moolenaar  call TermWait(buf, 250)
67713deab8dSBram Moolenaar  let screen_line = term_scrape(buf, 1)
678f8f8b2eaSBram Moolenaar  let [a0,a1,a2,a3] = [screen_line[3].attr, screen_line[4].attr,
679f8f8b2eaSBram Moolenaar        \ screen_line[18].attr, screen_line[19].attr]
680f8f8b2eaSBram Moolenaar  call assert_notequal(a0, a1)
681f8f8b2eaSBram Moolenaar  call assert_notequal(a0, a3)
682f8f8b2eaSBram Moolenaar  call assert_notequal(a1, a2)
683f8f8b2eaSBram Moolenaar  call assert_equal(a0, a2)
684f8f8b2eaSBram Moolenaar  call assert_equal(a1, a3)
685f8f8b2eaSBram Moolenaar  " clean up
686f8f8b2eaSBram Moolenaar  call delete('Xsearch.txt')
687f8f8b2eaSBram Moolenaar
688f8f8b2eaSBram Moolenaar  bwipe!
689f8f8b2eaSBram Moolenaarendfunc
690f8f8b2eaSBram Moolenaar
691db510071SBram Moolenaar" Tests for regexp with various magic settings
6924d23c528SBram Moolenaarfunc Run_search_regexp_magic_opt()
693db510071SBram Moolenaar  put ='1 a aa abb abbccc'
694db510071SBram Moolenaar  exe 'normal! /a*b\{2}c\+/e' . "\<CR>"
695db510071SBram Moolenaar  call assert_equal([0, 2, 17, 0], getpos('.'))
696db510071SBram Moolenaar
697db510071SBram Moolenaar  put ='2 d dd dee deefff'
698db510071SBram Moolenaar  exe 'normal! /\Md\*e\{2}f\+/e' . "\<CR>"
699db510071SBram Moolenaar  call assert_equal([0, 3, 17, 0], getpos('.'))
700db510071SBram Moolenaar
701db510071SBram Moolenaar  set nomagic
702db510071SBram Moolenaar  put ='3 g gg ghh ghhiii'
703db510071SBram Moolenaar  exe 'normal! /g\*h\{2}i\+/e' . "\<CR>"
704db510071SBram Moolenaar  call assert_equal([0, 4, 17, 0], getpos('.'))
705db510071SBram Moolenaar
706db510071SBram Moolenaar  put ='4 j jj jkk jkklll'
707db510071SBram Moolenaar  exe 'normal! /\mj*k\{2}l\+/e' . "\<CR>"
708db510071SBram Moolenaar  call assert_equal([0, 5, 17, 0], getpos('.'))
709db510071SBram Moolenaar
710db510071SBram Moolenaar  put ='5 m mm mnn mnnooo'
711db510071SBram Moolenaar  exe 'normal! /\vm*n{2}o+/e' . "\<CR>"
712db510071SBram Moolenaar  call assert_equal([0, 6, 17, 0], getpos('.'))
713db510071SBram Moolenaar
714db510071SBram Moolenaar  put ='6 x ^aa$ x'
715db510071SBram Moolenaar  exe 'normal! /\V^aa$' . "\<CR>"
716db510071SBram Moolenaar  call assert_equal([0, 7, 5, 0], getpos('.'))
717db510071SBram Moolenaar
718db510071SBram Moolenaar  set magic
719db510071SBram Moolenaar  put ='7 (a)(b) abbaa'
720db510071SBram Moolenaar  exe 'normal! /\v(a)(b)\2\1\1/e' . "\<CR>"
721db510071SBram Moolenaar  call assert_equal([0, 8, 14, 0], getpos('.'))
722db510071SBram Moolenaar
723db510071SBram Moolenaar  put ='8 axx [ab]xx'
724db510071SBram Moolenaar  exe 'normal! /\V[ab]\(\[xy]\)\1' . "\<CR>"
725db510071SBram Moolenaar  call assert_equal([0, 9, 7, 0], getpos('.'))
726db510071SBram Moolenaar
7274d23c528SBram Moolenaar  %d
7284d23c528SBram Moolenaarendfunc
7294d23c528SBram Moolenaar
7304d23c528SBram Moolenaarfunc Test_search_regexp()
7314d23c528SBram Moolenaar  enew!
7324d23c528SBram Moolenaar
7334d23c528SBram Moolenaar  set regexpengine=1
7344d23c528SBram Moolenaar  call Run_search_regexp_magic_opt()
7354d23c528SBram Moolenaar  set regexpengine=2
7364d23c528SBram Moolenaar  call Run_search_regexp_magic_opt()
7374d23c528SBram Moolenaar  set regexpengine&
7384d23c528SBram Moolenaar
739db510071SBram Moolenaar  set undolevels=100
740db510071SBram Moolenaar  put ='9 foobar'
741db510071SBram Moolenaar  put =''
742db510071SBram Moolenaar  exe "normal! a\<C-G>u\<Esc>"
743db510071SBram Moolenaar  normal G
744db510071SBram Moolenaar  exe 'normal! dv?bar?' . "\<CR>"
745db510071SBram Moolenaar  call assert_equal('9 foo', getline('.'))
7464d23c528SBram Moolenaar  call assert_equal([0, 2, 5, 0], getpos('.'))
7474d23c528SBram Moolenaar  call assert_equal(2, line('$'))
748db510071SBram Moolenaar  normal u
749db510071SBram Moolenaar  call assert_equal('9 foobar', getline('.'))
7504d23c528SBram Moolenaar  call assert_equal([0, 2, 6, 0], getpos('.'))
7514d23c528SBram Moolenaar  call assert_equal(3, line('$'))
752db510071SBram Moolenaar
753db510071SBram Moolenaar  set undolevels&
754db510071SBram Moolenaar  enew!
755db510071SBram Moolenaarendfunc
7562e51d9a0SBram Moolenaar
7572e51d9a0SBram Moolenaarfunc Test_search_cmdline_incsearch_highlight()
758b68df220SBram Moolenaar  CheckOption incsearch
759b68df220SBram Moolenaar
7602e51d9a0SBram Moolenaar  set incsearch hlsearch
7612e51d9a0SBram Moolenaar  " need to disable char_avail,
7622e51d9a0SBram Moolenaar  " so that expansion of commandline works
7632e51d9a0SBram Moolenaar  call test_override("char_avail", 1)
7642e51d9a0SBram Moolenaar  new
7652e51d9a0SBram Moolenaar  call setline(1, ['aaa  1 the first', '  2 the second', '  3 the third'])
7662e51d9a0SBram Moolenaar
7672e51d9a0SBram Moolenaar  1
7682e51d9a0SBram Moolenaar  call feedkeys("/second\<cr>", 'tx')
7692e51d9a0SBram Moolenaar  call assert_equal('second', @/)
7702e51d9a0SBram Moolenaar  call assert_equal('  2 the second', getline('.'))
7712e51d9a0SBram Moolenaar
7722e51d9a0SBram Moolenaar  " Canceling search won't change @/
7732e51d9a0SBram Moolenaar  1
7742e51d9a0SBram Moolenaar  let @/ = 'last pattern'
7752e51d9a0SBram Moolenaar  call feedkeys("/third\<C-c>", 'tx')
7762e51d9a0SBram Moolenaar  call assert_equal('last pattern', @/)
7772e51d9a0SBram Moolenaar  call feedkeys("/third\<Esc>", 'tx')
7782e51d9a0SBram Moolenaar  call assert_equal('last pattern', @/)
7792e51d9a0SBram Moolenaar  call feedkeys("/3\<bs>\<bs>", 'tx')
7802e51d9a0SBram Moolenaar  call assert_equal('last pattern', @/)
7812e51d9a0SBram Moolenaar  call feedkeys("/third\<c-g>\<c-t>\<Esc>", 'tx')
7822e51d9a0SBram Moolenaar  call assert_equal('last pattern', @/)
7832e51d9a0SBram Moolenaar
7842e51d9a0SBram Moolenaar  " clean up
7852e51d9a0SBram Moolenaar  set noincsearch nohlsearch
7862e51d9a0SBram Moolenaar  bw!
7872e51d9a0SBram Moolenaarendfunc
7882e51d9a0SBram Moolenaar
7892e51d9a0SBram Moolenaarfunc Test_search_cmdline_incsearch_highlight_attr()
7908c5a278fSBram Moolenaar  CheckOption incsearch
7918c5a278fSBram Moolenaar  CheckFeature terminal
7928c5a278fSBram Moolenaar  CheckNotGui
7938c5a278fSBram Moolenaar
7942e51d9a0SBram Moolenaar  let h = winheight(0)
7952e51d9a0SBram Moolenaar  if h < 3
7962e51d9a0SBram Moolenaar    return
7972e51d9a0SBram Moolenaar  endif
7982e51d9a0SBram Moolenaar
7992e51d9a0SBram Moolenaar  " Prepare buffer text
80013deab8dSBram Moolenaar  let lines = ['abb vim vim vi', 'vimvivim']
80113deab8dSBram Moolenaar  call writefile(lines, 'Xsearch.txt')
80213deab8dSBram Moolenaar  let buf = term_start([GetVimProg(), '--clean', '-c', 'set noswapfile', 'Xsearch.txt'], {'term_rows': 3})
80313deab8dSBram Moolenaar
8040e9d1ae3SBram Moolenaar  call WaitForAssert({-> assert_equal(lines, [term_getline(buf, 1), term_getline(buf, 2)])})
805b50773c6SBram Moolenaar  " wait for vim to complete initialization
8066a2c5a7dSBram Moolenaar  call TermWait(buf)
8072e51d9a0SBram Moolenaar
8082e51d9a0SBram Moolenaar  " Get attr of normal(a0), incsearch(a1), hlsearch(a2) highlight
80913deab8dSBram Moolenaar  call term_sendkeys(buf, ":set incsearch hlsearch\<cr>")
81013deab8dSBram Moolenaar  call term_sendkeys(buf, '/b')
8116a2c5a7dSBram Moolenaar  call TermWait(buf, 100)
81213deab8dSBram Moolenaar  let screen_line1 = term_scrape(buf, 1)
8132e51d9a0SBram Moolenaar  call assert_true(len(screen_line1) > 2)
8142e51d9a0SBram Moolenaar  " a0: attr_normal
8152e51d9a0SBram Moolenaar  let a0 = screen_line1[0].attr
8162e51d9a0SBram Moolenaar  " a1: attr_incsearch
8172e51d9a0SBram Moolenaar  let a1 = screen_line1[1].attr
8182e51d9a0SBram Moolenaar  " a2: attr_hlsearch
8192e51d9a0SBram Moolenaar  let a2 = screen_line1[2].attr
8202e51d9a0SBram Moolenaar  call assert_notequal(a0, a1)
8212e51d9a0SBram Moolenaar  call assert_notequal(a0, a2)
8222e51d9a0SBram Moolenaar  call assert_notequal(a1, a2)
82313deab8dSBram Moolenaar  call term_sendkeys(buf, "\<cr>gg0")
8242e51d9a0SBram Moolenaar
8252e51d9a0SBram Moolenaar  " Test incremental highlight search
82613deab8dSBram Moolenaar  call term_sendkeys(buf, "/vim")
8276a2c5a7dSBram Moolenaar  call TermWait(buf, 100)
8282e51d9a0SBram Moolenaar  " Buffer:
8292e51d9a0SBram Moolenaar  " abb vim vim vi
8302e51d9a0SBram Moolenaar  " vimvivim
8312e51d9a0SBram Moolenaar  " Search: /vim
8322e51d9a0SBram Moolenaar  let attr_line1 = [a0,a0,a0,a0,a1,a1,a1,a0,a2,a2,a2,a0,a0,a0]
8332e51d9a0SBram Moolenaar  let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2]
83413deab8dSBram Moolenaar  call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr'))
83513deab8dSBram Moolenaar  call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr'))
8362e51d9a0SBram Moolenaar
8372e51d9a0SBram Moolenaar  " Test <C-g>
83813deab8dSBram Moolenaar  call term_sendkeys(buf, "\<C-g>\<C-g>")
8396a2c5a7dSBram Moolenaar  call TermWait(buf, 100)
8402e51d9a0SBram Moolenaar  let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a2,a2,a2,a0,a0,a0]
8412e51d9a0SBram Moolenaar  let attr_line2 = [a1,a1,a1,a0,a0,a2,a2,a2]
84213deab8dSBram Moolenaar  call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr'))
84313deab8dSBram Moolenaar  call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr'))
8442e51d9a0SBram Moolenaar
8452e51d9a0SBram Moolenaar  " Test <C-t>
84613deab8dSBram Moolenaar  call term_sendkeys(buf, "\<C-t>")
8476a2c5a7dSBram Moolenaar  call TermWait(buf, 100)
8482e51d9a0SBram Moolenaar  let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a1,a1,a1,a0,a0,a0]
8492e51d9a0SBram Moolenaar  let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2]
85013deab8dSBram Moolenaar  call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr'))
85113deab8dSBram Moolenaar  call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr'))
8522e51d9a0SBram Moolenaar
8532e51d9a0SBram Moolenaar  " Type Enter and a1(incsearch highlight) should become a2(hlsearch highlight)
85413deab8dSBram Moolenaar  call term_sendkeys(buf, "\<cr>")
8556a2c5a7dSBram Moolenaar  call TermWait(buf, 100)
8562e51d9a0SBram Moolenaar  let attr_line1 = [a0,a0,a0,a0,a2,a2,a2,a0,a2,a2,a2,a0,a0,a0]
8572e51d9a0SBram Moolenaar  let attr_line2 = [a2,a2,a2,a0,a0,a2,a2,a2]
85813deab8dSBram Moolenaar  call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr'))
85913deab8dSBram Moolenaar  call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr'))
8602e51d9a0SBram Moolenaar
8612e51d9a0SBram Moolenaar  " Test nohlsearch. a2(hlsearch highlight) should become a0(normal highlight)
86213deab8dSBram Moolenaar  call term_sendkeys(buf, ":1\<cr>")
86313deab8dSBram Moolenaar  call term_sendkeys(buf, ":set nohlsearch\<cr>")
86413deab8dSBram Moolenaar  call term_sendkeys(buf, "/vim")
8656a2c5a7dSBram Moolenaar  call TermWait(buf, 100)
8662e51d9a0SBram Moolenaar  let attr_line1 = [a0,a0,a0,a0,a1,a1,a1,a0,a0,a0,a0,a0,a0,a0]
8672e51d9a0SBram Moolenaar  let attr_line2 = [a0,a0,a0,a0,a0,a0,a0,a0]
86813deab8dSBram Moolenaar  call assert_equal(attr_line1, map(term_scrape(buf, 1)[:len(attr_line1)-1], 'v:val.attr'))
86913deab8dSBram Moolenaar  call assert_equal(attr_line2, map(term_scrape(buf, 2)[:len(attr_line2)-1], 'v:val.attr'))
870f8f8b2eaSBram Moolenaar  call delete('Xsearch.txt')
8712e51d9a0SBram Moolenaar
872b94340c0SBram Moolenaar  call delete('Xsearch.txt')
8732e51d9a0SBram Moolenaar  bwipe!
8742e51d9a0SBram Moolenaarendfunc
875f45938ccSBram Moolenaar
876548e5985SBram Moolenaarfunc Test_incsearch_cmdline_modifier()
877b68df220SBram Moolenaar  CheckOption incsearch
878b68df220SBram Moolenaar
879548e5985SBram Moolenaar  call test_override("char_avail", 1)
880548e5985SBram Moolenaar  new
881548e5985SBram Moolenaar  call setline(1, ['foo'])
882548e5985SBram Moolenaar  set incsearch
883548e5985SBram Moolenaar  " Test that error E14 does not occur in parsing command modifier.
884548e5985SBram Moolenaar  call feedkeys("V:tab", 'tx')
885548e5985SBram Moolenaar
886548e5985SBram Moolenaar  call Incsearch_cleanup()
887548e5985SBram Moolenaarendfunc
888548e5985SBram Moolenaar
8899d34d902SBram Moolenaarfunc Test_incsearch_scrolling()
890494e9069SBram Moolenaar  CheckRunVimInTerminal
8919d34d902SBram Moolenaar  call assert_equal(0, &scrolloff)
8929d34d902SBram Moolenaar  call writefile([
8939d34d902SBram Moolenaar	\ 'let dots = repeat(".", 120)',
8949d34d902SBram Moolenaar	\ 'set incsearch cmdheight=2 scrolloff=0',
8959d34d902SBram Moolenaar	\ 'call setline(1, [dots, dots, dots, "", "target", dots, dots])',
8969d34d902SBram Moolenaar	\ 'normal gg',
8979d34d902SBram Moolenaar	\ 'redraw',
8989d34d902SBram Moolenaar	\ ], 'Xscript')
8999d34d902SBram Moolenaar  let buf = RunVimInTerminal('-S Xscript', {'rows': 9, 'cols': 70})
9009d34d902SBram Moolenaar  " Need to send one key at a time to force a redraw
9019d34d902SBram Moolenaar  call term_sendkeys(buf, '/')
9029d34d902SBram Moolenaar  sleep 100m
9039d34d902SBram Moolenaar  call term_sendkeys(buf, 't')
9049d34d902SBram Moolenaar  sleep 100m
9059d34d902SBram Moolenaar  call term_sendkeys(buf, 'a')
9069d34d902SBram Moolenaar  sleep 100m
9079d34d902SBram Moolenaar  call term_sendkeys(buf, 'r')
9089d34d902SBram Moolenaar  sleep 100m
9099d34d902SBram Moolenaar  call term_sendkeys(buf, 'g')
9109d34d902SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_scrolling_01', {})
9119d34d902SBram Moolenaar
9129d34d902SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
9139d34d902SBram Moolenaar  call StopVimInTerminal(buf)
9149d34d902SBram Moolenaar  call delete('Xscript')
9159d34d902SBram Moolenaarendfunc
9169d34d902SBram Moolenaar
9174edfe2d2SBram Moolenaarfunc Test_incsearch_search_dump()
918b68df220SBram Moolenaar  CheckOption incsearch
919b68df220SBram Moolenaar  CheckScreendump
920b68df220SBram Moolenaar
9214edfe2d2SBram Moolenaar  call writefile([
9224edfe2d2SBram Moolenaar	\ 'set incsearch hlsearch scrolloff=0',
9234edfe2d2SBram Moolenaar	\ 'for n in range(1, 8)',
9244edfe2d2SBram Moolenaar	\ '  call setline(n, "foo " . n)',
9254edfe2d2SBram Moolenaar	\ 'endfor',
9264edfe2d2SBram Moolenaar	\ '3',
9274edfe2d2SBram Moolenaar	\ ], 'Xis_search_script')
9284edfe2d2SBram Moolenaar  let buf = RunVimInTerminal('-S Xis_search_script', {'rows': 9, 'cols': 70})
9294edfe2d2SBram Moolenaar  " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by
9304edfe2d2SBram Moolenaar  " the 'ambiwidth' check.
9314edfe2d2SBram Moolenaar  sleep 100m
9324edfe2d2SBram Moolenaar
9334edfe2d2SBram Moolenaar  " Need to send one key at a time to force a redraw.
9344edfe2d2SBram Moolenaar  call term_sendkeys(buf, '/fo')
9354edfe2d2SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_search_01', {})
9364edfe2d2SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
9374edfe2d2SBram Moolenaar  sleep 100m
9384edfe2d2SBram Moolenaar
9394edfe2d2SBram Moolenaar  call term_sendkeys(buf, '/\v')
9404edfe2d2SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_search_02', {})
9414edfe2d2SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
9424edfe2d2SBram Moolenaar
9434edfe2d2SBram Moolenaar  call StopVimInTerminal(buf)
9444edfe2d2SBram Moolenaar  call delete('Xis_search_script')
9454edfe2d2SBram Moolenaarendfunc
9464edfe2d2SBram Moolenaar
94741f0895cSBram Moolenaarfunc Test_hlsearch_dump()
94841f0895cSBram Moolenaar  CheckOption hlsearch
94941f0895cSBram Moolenaar  CheckScreendump
95041f0895cSBram Moolenaar
95141f0895cSBram Moolenaar  call writefile([
95241f0895cSBram Moolenaar	\ 'set hlsearch cursorline',
95341f0895cSBram Moolenaar        \ 'call setline(1, ["xxx", "xxx", "xxx"])',
95441f0895cSBram Moolenaar	\ '/.*',
95541f0895cSBram Moolenaar	\ '2',
95641f0895cSBram Moolenaar	\ ], 'Xhlsearch_script')
95741f0895cSBram Moolenaar  let buf = RunVimInTerminal('-S Xhlsearch_script', {'rows': 6, 'cols': 50})
95841f0895cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_hlsearch_1', {})
95941f0895cSBram Moolenaar
96041f0895cSBram Moolenaar  call term_sendkeys(buf, "/\\_.*\<CR>")
96141f0895cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_hlsearch_2', {})
96241f0895cSBram Moolenaar
96341f0895cSBram Moolenaar  call StopVimInTerminal(buf)
96441f0895cSBram Moolenaar  call delete('Xhlsearch_script')
96541f0895cSBram Moolenaarendfunc
96641f0895cSBram Moolenaar
9672d5f385cSBram Moolenaarfunc Test_hlsearch_and_visual()
9682d5f385cSBram Moolenaar  CheckOption hlsearch
9692d5f385cSBram Moolenaar  CheckScreendump
9702d5f385cSBram Moolenaar
9712d5f385cSBram Moolenaar  call writefile([
9722d5f385cSBram Moolenaar	\ 'set hlsearch',
9732d5f385cSBram Moolenaar        \ 'call setline(1, repeat(["xxx yyy zzz"], 3))',
9742d5f385cSBram Moolenaar        \ 'hi Search cterm=bold',
9752d5f385cSBram Moolenaar	\ '/yyy',
9762d5f385cSBram Moolenaar	\ 'call cursor(1, 6)',
9772d5f385cSBram Moolenaar	\ ], 'Xhlvisual_script')
9782d5f385cSBram Moolenaar  let buf = RunVimInTerminal('-S Xhlvisual_script', {'rows': 6, 'cols': 40})
9792d5f385cSBram Moolenaar  call term_sendkeys(buf, "vjj")
9802d5f385cSBram Moolenaar  call VerifyScreenDump(buf, 'Test_hlsearch_visual_1', {})
9812d5f385cSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
9822d5f385cSBram Moolenaar
9832d5f385cSBram Moolenaar  call StopVimInTerminal(buf)
9842d5f385cSBram Moolenaar  call delete('Xhlvisual_script')
9852d5f385cSBram Moolenaarendfunc
9862d5f385cSBram Moolenaar
987e71c0ebeSBram Moolenaarfunc Test_hlsearch_block_visual_match()
988e71c0ebeSBram Moolenaar  CheckScreendump
989e71c0ebeSBram Moolenaar
990e71c0ebeSBram Moolenaar  let lines =<< trim END
991e71c0ebeSBram Moolenaar    set hlsearch
992e71c0ebeSBram Moolenaar    call setline(1, ['aa', 'bbbb', 'cccccc'])
993e71c0ebeSBram Moolenaar  END
994e71c0ebeSBram Moolenaar  call writefile(lines, 'Xhlsearch_block')
995e71c0ebeSBram Moolenaar  let buf = RunVimInTerminal('-S Xhlsearch_block', {'rows': 9, 'cols': 60})
996e71c0ebeSBram Moolenaar
997e71c0ebeSBram Moolenaar  call term_sendkeys(buf, "G\<C-V>$kk\<Esc>")
998e71c0ebeSBram Moolenaar  sleep 100m
999e71c0ebeSBram Moolenaar  call term_sendkeys(buf, "/\\%V\<CR>")
1000e71c0ebeSBram Moolenaar  sleep 100m
1001e71c0ebeSBram Moolenaar  call VerifyScreenDump(buf, 'Test_hlsearch_block_visual_match', {})
1002e71c0ebeSBram Moolenaar
1003e71c0ebeSBram Moolenaar  call StopVimInTerminal(buf)
1004e71c0ebeSBram Moolenaar  call delete('Xhlsearch_block')
1005e71c0ebeSBram Moolenaarendfunc
1006e71c0ebeSBram Moolenaar
1007976b847fSBram Moolenaarfunc Test_incsearch_substitute()
1008b68df220SBram Moolenaar  CheckOption incsearch
1009b68df220SBram Moolenaar
1010976b847fSBram Moolenaar  call test_override("char_avail", 1)
1011976b847fSBram Moolenaar  new
1012976b847fSBram Moolenaar  set incsearch
1013976b847fSBram Moolenaar  for n in range(1, 10)
1014976b847fSBram Moolenaar    call setline(n, 'foo ' . n)
1015976b847fSBram Moolenaar  endfor
1016976b847fSBram Moolenaar  4
1017976b847fSBram Moolenaar  call feedkeys(":.,.+2s/foo\<BS>o\<BS>o/xxx\<cr>", 'tx')
1018976b847fSBram Moolenaar  call assert_equal('foo 3', getline(3))
1019976b847fSBram Moolenaar  call assert_equal('xxx 4', getline(4))
1020976b847fSBram Moolenaar  call assert_equal('xxx 5', getline(5))
1021976b847fSBram Moolenaar  call assert_equal('xxx 6', getline(6))
1022976b847fSBram Moolenaar  call assert_equal('foo 7', getline(7))
1023976b847fSBram Moolenaar
1024976b847fSBram Moolenaar  call Incsearch_cleanup()
1025976b847fSBram Moolenaarendfunc
1026976b847fSBram Moolenaar
1027795aaa1eSBram Moolenaarfunc Test_incsearch_substitute_long_line()
1028795aaa1eSBram Moolenaar  new
1029795aaa1eSBram Moolenaar  call test_override("char_avail", 1)
1030795aaa1eSBram Moolenaar  set incsearch
1031795aaa1eSBram Moolenaar
1032795aaa1eSBram Moolenaar  call repeat('x', 100000)->setline(1)
1033795aaa1eSBram Moolenaar  call feedkeys(':s/\%c', 'xt')
1034795aaa1eSBram Moolenaar  redraw
1035795aaa1eSBram Moolenaar  call feedkeys("\<Esc>", 'xt')
1036795aaa1eSBram Moolenaar
1037795aaa1eSBram Moolenaar  call Incsearch_cleanup()
1038795aaa1eSBram Moolenaar  bwipe!
1039795aaa1eSBram Moolenaarendfunc
1040795aaa1eSBram Moolenaar
1041164251ffSBram Moolenaar" Similar to Test_incsearch_substitute() but with a screendump halfway.
1042164251ffSBram Moolenaarfunc Test_incsearch_substitute_dump()
1043b68df220SBram Moolenaar  CheckOption incsearch
1044b68df220SBram Moolenaar  CheckScreendump
1045b68df220SBram Moolenaar
1046164251ffSBram Moolenaar  call writefile([
1047164251ffSBram Moolenaar	\ 'set incsearch hlsearch scrolloff=0',
1048164251ffSBram Moolenaar	\ 'for n in range(1, 10)',
1049164251ffSBram Moolenaar	\ '  call setline(n, "foo " . n)',
1050164251ffSBram Moolenaar	\ 'endfor',
10512f6a346aSBram Moolenaar	\ 'call setline(11, "bar 11")',
1052164251ffSBram Moolenaar	\ '3',
1053164251ffSBram Moolenaar	\ ], 'Xis_subst_script')
1054164251ffSBram Moolenaar  let buf = RunVimInTerminal('-S Xis_subst_script', {'rows': 9, 'cols': 70})
1055164251ffSBram Moolenaar  " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by
1056164251ffSBram Moolenaar  " the 'ambiwidth' check.
1057164251ffSBram Moolenaar  sleep 100m
1058164251ffSBram Moolenaar
1059164251ffSBram Moolenaar  " Need to send one key at a time to force a redraw.
1060c7f08b7eSBram Moolenaar  " Select three lines at the cursor with typed pattern.
1061164251ffSBram Moolenaar  call term_sendkeys(buf, ':.,.+2s/')
1062164251ffSBram Moolenaar  sleep 100m
1063164251ffSBram Moolenaar  call term_sendkeys(buf, 'f')
1064164251ffSBram Moolenaar  sleep 100m
1065164251ffSBram Moolenaar  call term_sendkeys(buf, 'o')
1066164251ffSBram Moolenaar  sleep 100m
1067164251ffSBram Moolenaar  call term_sendkeys(buf, 'o')
1068164251ffSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_01', {})
1069c7f08b7eSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
1070c7f08b7eSBram Moolenaar
1071c7f08b7eSBram Moolenaar  " Select three lines at the cursor using previous pattern.
1072c7f08b7eSBram Moolenaar  call term_sendkeys(buf, "/foo\<CR>")
1073c7f08b7eSBram Moolenaar  sleep 100m
1074c7f08b7eSBram Moolenaar  call term_sendkeys(buf, ':.,.+2s//')
1075c7f08b7eSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_02', {})
1076c7f08b7eSBram Moolenaar
1077c7f08b7eSBram Moolenaar  " Deleting last slash should remove the match.
1078c7f08b7eSBram Moolenaar  call term_sendkeys(buf, "\<BS>")
1079c7f08b7eSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_03', {})
108060d08710SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
108160d08710SBram Moolenaar
108260d08710SBram Moolenaar  " Reverse range is accepted
108360d08710SBram Moolenaar  call term_sendkeys(buf, ':5,2s/foo')
108460d08710SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_04', {})
1085164251ffSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
10862b926fcbSBram Moolenaar
10872b926fcbSBram Moolenaar  " White space after the command is skipped
10882b926fcbSBram Moolenaar  call term_sendkeys(buf, ':2,3sub  /fo')
10892b926fcbSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_05', {})
10902b926fcbSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
10912b926fcbSBram Moolenaar
109233c4dbb7SBram Moolenaar  " Command modifiers are skipped
109333c4dbb7SBram Moolenaar  call term_sendkeys(buf, ':above below browse botr confirm keepmar keepalt keeppat keepjum filter xxx hide lockm leftabove noau noswap rightbel sandbox silent silent! $tab top unsil vert verbose 4,5s/fo.')
109433c4dbb7SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_06', {})
109533c4dbb7SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
109633c4dbb7SBram Moolenaar
10972f6a346aSBram Moolenaar  " Cursorline highlighting at match
10982f6a346aSBram Moolenaar  call term_sendkeys(buf, ":set cursorline\<CR>")
10992f6a346aSBram Moolenaar  call term_sendkeys(buf, 'G9G')
11002f6a346aSBram Moolenaar  call term_sendkeys(buf, ':9,11s/bar')
11012f6a346aSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_07', {})
11022f6a346aSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
11032f6a346aSBram Moolenaar
11042f6a346aSBram Moolenaar  " Cursorline highlighting at cursor when no match
11052f6a346aSBram Moolenaar  call term_sendkeys(buf, ':9,10s/bar')
11062f6a346aSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_08', {})
11072f6a346aSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
11082f6a346aSBram Moolenaar
11098b0d5ce8SBram Moolenaar  " Only \v handled as empty pattern, does not move cursor
11108b0d5ce8SBram Moolenaar  call term_sendkeys(buf, '3G4G')
11118b0d5ce8SBram Moolenaar  call term_sendkeys(buf, ":nohlsearch\<CR>")
11128b0d5ce8SBram Moolenaar  call term_sendkeys(buf, ':6,7s/\v')
11138b0d5ce8SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_09', {})
11148b0d5ce8SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
11158b0d5ce8SBram Moolenaar
1116f13daa46SBram Moolenaar  call term_sendkeys(buf, ":set nocursorline\<CR>")
1117f13daa46SBram Moolenaar
1118f13daa46SBram Moolenaar  " All matches are highlighted for 'hlsearch' after the incsearch canceled
1119f13daa46SBram Moolenaar  call term_sendkeys(buf, "1G*")
1120f13daa46SBram Moolenaar  call term_sendkeys(buf, ":2,5s/foo")
1121f13daa46SBram Moolenaar  sleep 100m
1122f13daa46SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
1123f13daa46SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_10', {})
1124f13daa46SBram Moolenaar
112565985ac9SBram Moolenaar  call term_sendkeys(buf, ":split\<CR>")
112665985ac9SBram Moolenaar  call term_sendkeys(buf, ":let @/ = 'xyz'\<CR>")
112765985ac9SBram Moolenaar  call term_sendkeys(buf, ":%s/.")
112865985ac9SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_11', {})
112965985ac9SBram Moolenaar  call term_sendkeys(buf, "\<BS>")
113065985ac9SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_12', {})
113165985ac9SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
113265985ac9SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_13', {})
1133c672525bSBram Moolenaar  call term_sendkeys(buf, ":%bwipe!\<CR>")
1134c672525bSBram Moolenaar  call term_sendkeys(buf, ":only!\<CR>")
1135c672525bSBram Moolenaar
1136c672525bSBram Moolenaar  "  get :'<,'>s command in history
1137c672525bSBram Moolenaar  call term_sendkeys(buf, ":set cmdheight=2\<CR>")
1138c672525bSBram Moolenaar  call term_sendkeys(buf, "aasdfasdf\<Esc>")
1139c672525bSBram Moolenaar  call term_sendkeys(buf, "V:s/a/b/g\<CR>")
1140c672525bSBram Moolenaar  " Using '<,'> does not give E20
1141c672525bSBram Moolenaar  call term_sendkeys(buf, ":new\<CR>")
1142c672525bSBram Moolenaar  call term_sendkeys(buf, "aasdfasdf\<Esc>")
1143c672525bSBram Moolenaar  call term_sendkeys(buf, ":\<Up>\<Up>")
1144c672525bSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_14', {})
1145c672525bSBram Moolenaar  call term_sendkeys(buf, "<Esc>")
114665985ac9SBram Moolenaar
1147164251ffSBram Moolenaar  call StopVimInTerminal(buf)
1148164251ffSBram Moolenaar  call delete('Xis_subst_script')
1149164251ffSBram Moolenaarendfunc
1150164251ffSBram Moolenaar
1151c036e87bSBram Moolenaarfunc Test_incsearch_highlighting()
1152b68df220SBram Moolenaar  CheckOption incsearch
1153b68df220SBram Moolenaar  CheckScreendump
1154c036e87bSBram Moolenaar
1155c036e87bSBram Moolenaar  call writefile([
1156c036e87bSBram Moolenaar	\ 'set incsearch hlsearch',
1157c036e87bSBram Moolenaar	\ 'call setline(1, "hello/there")',
1158c036e87bSBram Moolenaar	\ ], 'Xis_subst_hl_script')
1159c036e87bSBram Moolenaar  let buf = RunVimInTerminal('-S Xis_subst_hl_script', {'rows': 4, 'cols': 20})
1160c036e87bSBram Moolenaar  " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by
1161c036e87bSBram Moolenaar  " the 'ambiwidth' check.
1162c036e87bSBram Moolenaar  sleep 300m
1163c036e87bSBram Moolenaar
1164c036e87bSBram Moolenaar  " Using a different search delimiter should still highlight matches
1165c036e87bSBram Moolenaar  " that contain a '/'.
1166c036e87bSBram Moolenaar  call term_sendkeys(buf, ":%s;ello/the")
1167c036e87bSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_substitute_15', {})
1168c036e87bSBram Moolenaar  call term_sendkeys(buf, "<Esc>")
1169b68df220SBram Moolenaar
1170b68df220SBram Moolenaar  call StopVimInTerminal(buf)
1171b68df220SBram Moolenaar  call delete('Xis_subst_hl_script')
1172c036e87bSBram Moolenaarendfunc
1173c036e87bSBram Moolenaar
11744a7d2d3bSBram Moolenaarfunc Test_incsearch_with_change()
1175b68df220SBram Moolenaar  CheckFeature timers
1176b68df220SBram Moolenaar  CheckOption incsearch
1177b68df220SBram Moolenaar  CheckScreendump
11784a7d2d3bSBram Moolenaar
11794a7d2d3bSBram Moolenaar  call writefile([
11804a7d2d3bSBram Moolenaar	\ 'set incsearch hlsearch scrolloff=0',
11814a7d2d3bSBram Moolenaar	\ 'call setline(1, ["one", "two ------ X", "three"])',
11824a7d2d3bSBram Moolenaar	\ 'call timer_start(200, { _ -> setline(2, "x")})',
11834a7d2d3bSBram Moolenaar	\ ], 'Xis_change_script')
11844a7d2d3bSBram Moolenaar  let buf = RunVimInTerminal('-S Xis_change_script', {'rows': 9, 'cols': 70})
11854a7d2d3bSBram Moolenaar  " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by
11864a7d2d3bSBram Moolenaar  " the 'ambiwidth' check.
1187e86ecbd9SBram Moolenaar  sleep 300m
11884a7d2d3bSBram Moolenaar
11894a7d2d3bSBram Moolenaar  " Highlight X, it will be deleted by the timer callback.
11904a7d2d3bSBram Moolenaar  call term_sendkeys(buf, ':%s/X')
11914a7d2d3bSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_change_01', {})
11924a7d2d3bSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
11934a7d2d3bSBram Moolenaar
11944a7d2d3bSBram Moolenaar  call StopVimInTerminal(buf)
11954a7d2d3bSBram Moolenaar  call delete('Xis_change_script')
11964a7d2d3bSBram Moolenaarendfunc
11974a7d2d3bSBram Moolenaar
119881f56536SBram Moolenaar" Similar to Test_incsearch_substitute_dump() for :sort
11994edfe2d2SBram Moolenaarfunc Test_incsearch_sort_dump()
1200b68df220SBram Moolenaar  CheckOption incsearch
1201b68df220SBram Moolenaar  CheckScreendump
1202b68df220SBram Moolenaar
120381f56536SBram Moolenaar  call writefile([
120481f56536SBram Moolenaar	\ 'set incsearch hlsearch scrolloff=0',
120581f56536SBram Moolenaar	\ 'call setline(1, ["another one 2", "that one 3", "the one 1"])',
120681f56536SBram Moolenaar	\ ], 'Xis_sort_script')
120781f56536SBram Moolenaar  let buf = RunVimInTerminal('-S Xis_sort_script', {'rows': 9, 'cols': 70})
120881f56536SBram Moolenaar  " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by
120981f56536SBram Moolenaar  " the 'ambiwidth' check.
121081f56536SBram Moolenaar  sleep 100m
121181f56536SBram Moolenaar
121281f56536SBram Moolenaar  call term_sendkeys(buf, ':sort ni u /on')
121381f56536SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_sort_01', {})
121481f56536SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
121581f56536SBram Moolenaar
1216333015a4SBram Moolenaar  call term_sendkeys(buf, ':sort! /on')
1217333015a4SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_sort_02', {})
1218333015a4SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
1219333015a4SBram Moolenaar
122081f56536SBram Moolenaar  call StopVimInTerminal(buf)
122181f56536SBram Moolenaar  call delete('Xis_sort_script')
122281f56536SBram Moolenaarendfunc
122381f56536SBram Moolenaar
1224264cf5cfSBram Moolenaar" Similar to Test_incsearch_substitute_dump() for :vimgrep famiry
1225264cf5cfSBram Moolenaarfunc Test_incsearch_vimgrep_dump()
1226b68df220SBram Moolenaar  CheckOption incsearch
1227b68df220SBram Moolenaar  CheckScreendump
1228b68df220SBram Moolenaar
1229264cf5cfSBram Moolenaar  call writefile([
1230264cf5cfSBram Moolenaar	\ 'set incsearch hlsearch scrolloff=0',
1231264cf5cfSBram Moolenaar	\ 'call setline(1, ["another one 2", "that one 3", "the one 1"])',
1232264cf5cfSBram Moolenaar	\ ], 'Xis_vimgrep_script')
1233264cf5cfSBram Moolenaar  let buf = RunVimInTerminal('-S Xis_vimgrep_script', {'rows': 9, 'cols': 70})
1234264cf5cfSBram Moolenaar  " Give Vim a chance to redraw to get rid of the spaces in line 2 caused by
1235264cf5cfSBram Moolenaar  " the 'ambiwidth' check.
1236264cf5cfSBram Moolenaar  sleep 100m
1237264cf5cfSBram Moolenaar
1238264cf5cfSBram Moolenaar  " Need to send one key at a time to force a redraw.
1239264cf5cfSBram Moolenaar  call term_sendkeys(buf, ':vimgrep on')
1240264cf5cfSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_vimgrep_01', {})
1241264cf5cfSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
1242264cf5cfSBram Moolenaar
1243264cf5cfSBram Moolenaar  call term_sendkeys(buf, ':vimg /on/ *.txt')
1244264cf5cfSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_vimgrep_02', {})
1245264cf5cfSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
1246264cf5cfSBram Moolenaar
1247264cf5cfSBram Moolenaar  call term_sendkeys(buf, ':vimgrepadd "\<on')
1248264cf5cfSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_vimgrep_03', {})
1249264cf5cfSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
1250264cf5cfSBram Moolenaar
1251264cf5cfSBram Moolenaar  call term_sendkeys(buf, ':lv "tha')
1252264cf5cfSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_vimgrep_04', {})
1253264cf5cfSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
1254264cf5cfSBram Moolenaar
1255264cf5cfSBram Moolenaar  call term_sendkeys(buf, ':lvimgrepa "the" **/*.txt')
1256264cf5cfSBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_vimgrep_05', {})
1257264cf5cfSBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
1258264cf5cfSBram Moolenaar
1259264cf5cfSBram Moolenaar  call StopVimInTerminal(buf)
1260264cf5cfSBram Moolenaar  call delete('Xis_vimgrep_script')
1261264cf5cfSBram Moolenaarendfunc
1262264cf5cfSBram Moolenaar
1263198cb66dSBram Moolenaarfunc Test_keep_last_search_pattern()
1264b68df220SBram Moolenaar  CheckOption incsearch
1265b68df220SBram Moolenaar
1266198cb66dSBram Moolenaar  new
1267198cb66dSBram Moolenaar  call setline(1, ['foo', 'foo', 'foo'])
1268198cb66dSBram Moolenaar  set incsearch
1269198cb66dSBram Moolenaar  call test_override("char_avail", 1)
1270198cb66dSBram Moolenaar  let @/ = 'bar'
1271198cb66dSBram Moolenaar  call feedkeys(":/foo/s//\<Esc>", 'ntx')
1272198cb66dSBram Moolenaar  call assert_equal('bar', @/)
1273198cb66dSBram Moolenaar
127450eb16c3SBram Moolenaar  " no error message if pattern not found
127550eb16c3SBram Moolenaar  call feedkeys(":/xyz/s//\<Esc>", 'ntx')
127650eb16c3SBram Moolenaar  call assert_equal('bar', @/)
127750eb16c3SBram Moolenaar
1278198cb66dSBram Moolenaar  bwipe!
1279198cb66dSBram Moolenaar  call test_override("ALL", 0)
1280198cb66dSBram Moolenaar  set noincsearch
1281198cb66dSBram Moolenaarendfunc
1282198cb66dSBram Moolenaar
128399f043a5SBram Moolenaarfunc Test_word_under_cursor_after_match()
1284b68df220SBram Moolenaar  CheckOption incsearch
1285b68df220SBram Moolenaar
128699f043a5SBram Moolenaar  new
128799f043a5SBram Moolenaar  call setline(1, 'foo bar')
128899f043a5SBram Moolenaar  set incsearch
128999f043a5SBram Moolenaar  call test_override("char_avail", 1)
129099f043a5SBram Moolenaar  try
129199f043a5SBram Moolenaar    call feedkeys("/foo\<C-R>\<C-W>\<CR>", 'ntx')
129299f043a5SBram Moolenaar  catch /E486:/
129399f043a5SBram Moolenaar  endtry
129499f043a5SBram Moolenaar  call assert_equal('foobar', @/)
129599f043a5SBram Moolenaar
129699f043a5SBram Moolenaar  bwipe!
129799f043a5SBram Moolenaar  call test_override("ALL", 0)
129899f043a5SBram Moolenaar  set noincsearch
129999f043a5SBram Moolenaarendfunc
130099f043a5SBram Moolenaar
130199f043a5SBram Moolenaarfunc Test_subst_word_under_cursor()
1302b68df220SBram Moolenaar  CheckOption incsearch
1303b68df220SBram Moolenaar
130499f043a5SBram Moolenaar  new
130599f043a5SBram Moolenaar  call setline(1, ['int SomeLongName;', 'for (xxx = 1; xxx < len; ++xxx)'])
130699f043a5SBram Moolenaar  set incsearch
130799f043a5SBram Moolenaar  call test_override("char_avail", 1)
130899f043a5SBram Moolenaar  call feedkeys("/LongName\<CR>", 'ntx')
130999f043a5SBram Moolenaar  call feedkeys(":%s/xxx/\<C-R>\<C-W>/g\<CR>", 'ntx')
131099f043a5SBram Moolenaar  call assert_equal('for (SomeLongName = 1; SomeLongName < len; ++SomeLongName)', getline(2))
131199f043a5SBram Moolenaar
131299f043a5SBram Moolenaar  bwipe!
131399f043a5SBram Moolenaar  call test_override("ALL", 0)
131499f043a5SBram Moolenaar  set noincsearch
131599f043a5SBram Moolenaarendfunc
131699f043a5SBram Moolenaar
1317f45938ccSBram Moolenaarfunc Test_search_undefined_behaviour()
1318b68df220SBram Moolenaar  CheckFeature terminal
1319b68df220SBram Moolenaar
1320f45938ccSBram Moolenaar  let h = winheight(0)
1321f45938ccSBram Moolenaar  if h < 3
1322f45938ccSBram Moolenaar    return
1323f45938ccSBram Moolenaar  endif
1324f45938ccSBram Moolenaar  " did cause an undefined left shift
1325f45938ccSBram Moolenaar  let g:buf = term_start([GetVimProg(), '--clean', '-e', '-s', '-c', 'call search(getline("."))', 'samples/test000'], {'term_rows': 3})
1326f45938ccSBram Moolenaar  call assert_equal([''], getline(1, '$'))
1327f45938ccSBram Moolenaar  call term_sendkeys(g:buf, ":qa!\<cr>")
1328f45938ccSBram Moolenaar  bwipe!
1329f45938ccSBram Moolenaarendfunc
13302973daafSBram Moolenaar
13312973daafSBram Moolenaarfunc Test_search_undefined_behaviour2()
13322973daafSBram Moolenaar  call search("\%UC0000000")
13332973daafSBram Moolenaarendfunc
1334fb094e14SBram Moolenaar
1335fb094e14SBram Moolenaar" Test for search('multi-byte char', 'bce')
1336fb094e14SBram Moolenaarfunc Test_search_multibyte()
1337fb094e14SBram Moolenaar  let save_enc = &encoding
1338fb094e14SBram Moolenaar  set encoding=utf8
1339fb094e14SBram Moolenaar  enew!
1340fb094e14SBram Moolenaar  call append('$', 'A')
1341fb094e14SBram Moolenaar  call cursor(2, 1)
1342fb094e14SBram Moolenaar  call assert_equal(2, search('A', 'bce', line('.')))
1343fb094e14SBram Moolenaar  enew!
1344fb094e14SBram Moolenaar  let &encoding = save_enc
1345fb094e14SBram Moolenaarendfunc
1346890dd054SBram Moolenaar
1347890dd054SBram Moolenaar" This was causing E874.  Also causes an invalid read?
1348890dd054SBram Moolenaarfunc Test_look_behind()
1349890dd054SBram Moolenaar  new
1350890dd054SBram Moolenaar  call setline(1, '0\|\&\n\@<=')
1351890dd054SBram Moolenaar  call search(getline("."))
1352890dd054SBram Moolenaar  bwipe!
1353890dd054SBram Moolenaarendfunc
13548ada6aa9SBram Moolenaar
1355872bee55SBram Moolenaarfunc Test_search_visual_area_linewise()
1356872bee55SBram Moolenaar  new
1357872bee55SBram Moolenaar  call setline(1, ['aa', 'bb', 'cc'])
1358872bee55SBram Moolenaar  exe "normal 2GV\<Esc>"
1359872bee55SBram Moolenaar  for engine in [1, 2]
1360872bee55SBram Moolenaar    exe 'set regexpengine=' .. engine
1361872bee55SBram Moolenaar    exe "normal gg/\\%'<\<CR>>"
1362872bee55SBram Moolenaar    call assert_equal([0, 2, 1, 0, 1], getcurpos(), 'engine ' .. engine)
1363872bee55SBram Moolenaar    exe "normal gg/\\%'>\<CR>"
1364872bee55SBram Moolenaar    call assert_equal([0, 2, 2, 0, 2], getcurpos(), 'engine ' .. engine)
1365872bee55SBram Moolenaar  endfor
1366872bee55SBram Moolenaar
1367872bee55SBram Moolenaar  bwipe!
1368872bee55SBram Moolenaar  set regexpengine&
1369872bee55SBram Moolenaarendfunc
1370872bee55SBram Moolenaar
13718ada6aa9SBram Moolenaarfunc Test_search_sentence()
13728ada6aa9SBram Moolenaar  new
13738ada6aa9SBram Moolenaar  " this used to cause a crash
13741bd999f9SBram Moolenaar  /\%'(
13751bd999f9SBram Moolenaar  /
1376872bee55SBram Moolenaar  bwipe
13778ada6aa9SBram Moolenaarendfunc
13782fb8f684SBram Moolenaar
13792fb8f684SBram Moolenaar" Test that there is no crash when there is a last search pattern but no last
13802fb8f684SBram Moolenaar" substitute pattern.
13812fb8f684SBram Moolenaarfunc Test_no_last_substitute_pat()
13822fb8f684SBram Moolenaar  " Use viminfo to set the last search pattern to a string and make the last
13832fb8f684SBram Moolenaar  " substitute pattern the most recent used and make it empty (NULL).
13842fb8f684SBram Moolenaar  call writefile(['~MSle0/bar', '~MSle0~&'], 'Xviminfo')
13852fb8f684SBram Moolenaar  rviminfo! Xviminfo
13862fb8f684SBram Moolenaar  call assert_fails('normal n', 'E35:')
13872fb8f684SBram Moolenaar
13882fb8f684SBram Moolenaar  call delete('Xviminfo')
13892fb8f684SBram Moolenaarendfunc
13905f5e203cSBram Moolenaar
13915f5e203cSBram Moolenaarfunc Test_search_Ctrl_L_combining()
13925f5e203cSBram Moolenaar  " Make sure, that Ctrl-L works correctly with combining characters.
13935f5e203cSBram Moolenaar  " It uses an artificial example of an 'a' with 4 combining chars:
13945f5e203cSBram Moolenaar    " 'a' U+0061 Dec:97 LATIN SMALL LETTER A &#x61; /\%u61\Z "\u0061"
13955f5e203cSBram Moolenaar    " ' ̀' U+0300 Dec:768 COMBINING GRAVE ACCENT &#x300; /\%u300\Z "\u0300"
13965f5e203cSBram Moolenaar    " ' ́' U+0301 Dec:769 COMBINING ACUTE ACCENT &#x301; /\%u301\Z "\u0301"
13975f5e203cSBram Moolenaar    " ' ̇' U+0307 Dec:775 COMBINING DOT ABOVE &#x307; /\%u307\Z "\u0307"
13985f5e203cSBram Moolenaar    " ' ̣' U+0323 Dec:803 COMBINING DOT BELOW &#x323; /\%u323 "\u0323"
13995f5e203cSBram Moolenaar  " Those should also appear on the commandline
1400b68df220SBram Moolenaar  CheckOption incsearch
1401b68df220SBram Moolenaar
14025f5e203cSBram Moolenaar  call Cmdline3_prep()
14035f5e203cSBram Moolenaar  1
14045f5e203cSBram Moolenaar  let bufcontent = ['', 'Miạ̀́̇m']
14055f5e203cSBram Moolenaar  call append('$', bufcontent)
14065f5e203cSBram Moolenaar  call feedkeys("/Mi\<c-l>\<c-l>\<cr>", 'tx')
14075f5e203cSBram Moolenaar  call assert_equal(5, line('.'))
14085f5e203cSBram Moolenaar  call assert_equal(bufcontent[1], @/)
14095f5e203cSBram Moolenaar  call Incsearch_cleanup()
14105f5e203cSBram Moolenaarendfunc
1411527a2d86SBram Moolenaar
1412ab350f89SBram Moolenaarfunc Test_large_hex_chars1()
1413527a2d86SBram Moolenaar  " This used to cause a crash, the character becomes an NFA state.
1414527a2d86SBram Moolenaar  try
1415527a2d86SBram Moolenaar    /\%Ufffffc23
1416527a2d86SBram Moolenaar  catch
1417527a2d86SBram Moolenaar    call assert_match('E678:', v:exception)
1418527a2d86SBram Moolenaar  endtry
1419ab350f89SBram Moolenaar  try
1420ab350f89SBram Moolenaar    set re=1
1421ab350f89SBram Moolenaar    /\%Ufffffc23
1422ab350f89SBram Moolenaar  catch
1423ab350f89SBram Moolenaar    call assert_match('E678:', v:exception)
1424ab350f89SBram Moolenaar  endtry
1425ab350f89SBram Moolenaar  set re&
1426ab350f89SBram Moolenaarendfunc
1427ab350f89SBram Moolenaar
1428ab350f89SBram Moolenaarfunc Test_large_hex_chars2()
1429ab350f89SBram Moolenaar  " This used to cause a crash, the character becomes an NFA state.
1430ab350f89SBram Moolenaar  try
1431ab350f89SBram Moolenaar    /[\Ufffffc1f]
1432ab350f89SBram Moolenaar  catch
1433ab350f89SBram Moolenaar    call assert_match('E486:', v:exception)
1434ab350f89SBram Moolenaar  endtry
1435ab350f89SBram Moolenaar  try
1436ab350f89SBram Moolenaar    set re=1
1437ab350f89SBram Moolenaar    /[\Ufffffc1f]
1438ab350f89SBram Moolenaar  catch
1439ab350f89SBram Moolenaar    call assert_match('E486:', v:exception)
1440ab350f89SBram Moolenaar  endtry
1441ab350f89SBram Moolenaar  set re&
1442527a2d86SBram Moolenaarendfunc
1443cd62512cSBram Moolenaar
1444cd62512cSBram Moolenaarfunc Test_one_error_msg()
1445cd62512cSBram Moolenaar  " This was also giving an internal error
1446cd62512cSBram Moolenaar  call assert_fails('call search(" \\((\\v[[=P=]]){185}+             ")', 'E871:')
1447cd62512cSBram Moolenaarendfunc
1448730f48feSBram Moolenaar
1449730f48feSBram Moolenaarfunc Test_incsearch_add_char_under_cursor()
1450b68df220SBram Moolenaar  CheckOption incsearch
1451b68df220SBram Moolenaar
1452730f48feSBram Moolenaar  set incsearch
1453730f48feSBram Moolenaar  new
1454730f48feSBram Moolenaar  call setline(1, ['find match', 'anything'])
1455730f48feSBram Moolenaar  1
1456730f48feSBram Moolenaar  call test_override('char_avail', 1)
1457730f48feSBram Moolenaar  call feedkeys("fc/m\<C-L>\<C-L>\<C-L>\<C-L>\<C-L>\<CR>", 'tx')
1458730f48feSBram Moolenaar  call assert_equal('match', @/)
1459730f48feSBram Moolenaar  call test_override('char_avail', 0)
1460730f48feSBram Moolenaar
1461730f48feSBram Moolenaar  set incsearch&
1462730f48feSBram Moolenaar  bwipe!
1463730f48feSBram Moolenaarendfunc
1464c6b37db1SBram Moolenaar
1465c6b37db1SBram Moolenaar" Test for the search() function with match at the cursor position
1466c6b37db1SBram Moolenaarfunc Test_search_match_at_curpos()
1467c6b37db1SBram Moolenaar  new
1468c6b37db1SBram Moolenaar  call append(0, ['foobar', '', 'one two', ''])
1469c6b37db1SBram Moolenaar
1470c6b37db1SBram Moolenaar  normal gg
1471c6b37db1SBram Moolenaar
1472196b4664SBram Moolenaar  eval 'foobar'->search('c')
1473c6b37db1SBram Moolenaar  call assert_equal([1, 1], [line('.'), col('.')])
1474c6b37db1SBram Moolenaar
1475c6b37db1SBram Moolenaar  normal j
1476c6b37db1SBram Moolenaar  call search('^$', 'c')
1477c6b37db1SBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
1478c6b37db1SBram Moolenaar
1479c6b37db1SBram Moolenaar  call search('^$', 'bc')
1480c6b37db1SBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
1481c6b37db1SBram Moolenaar
1482c6b37db1SBram Moolenaar  exe "normal /two\<CR>"
1483c6b37db1SBram Moolenaar  call search('.', 'c')
1484c6b37db1SBram Moolenaar  call assert_equal([3, 5], [line('.'), col('.')])
1485c6b37db1SBram Moolenaar
1486c6b37db1SBram Moolenaar  close!
1487c6b37db1SBram Moolenaarendfunc
1488db294adcSBram Moolenaar
14890e05de46SBram Moolenaar" Test for error cases with the search() function
14900e05de46SBram Moolenaarfunc Test_search_errors()
14910e05de46SBram Moolenaar  call assert_fails("call search('pat', [])", 'E730:')
14920e05de46SBram Moolenaar  call assert_fails("call search('pat', 'b', {})", 'E728:')
14930e05de46SBram Moolenaar  call assert_fails("call search('pat', 'b', 1, [])", 'E745:')
14940e05de46SBram Moolenaar  call assert_fails("call search('pat', 'ns')", 'E475:')
14950e05de46SBram Moolenaar  call assert_fails("call search('pat', 'mr')", 'E475:')
14968832a345SBram Moolenaar
14978832a345SBram Moolenaar  new
14988832a345SBram Moolenaar  call setline(1, ['foo', 'bar'])
14998832a345SBram Moolenaar  call assert_fails('call feedkeys("/foo/;/bar/;\<CR>", "tx")', 'E386:')
15008832a345SBram Moolenaar  bwipe!
15010e05de46SBram Moolenaarendfunc
15020e05de46SBram Moolenaar
1503db294adcSBram Moolenaarfunc Test_search_display_pattern()
1504db294adcSBram Moolenaar  new
1505db294adcSBram Moolenaar  call setline(1, ['foo', 'bar', 'foobar'])
1506db294adcSBram Moolenaar
1507db294adcSBram Moolenaar  call cursor(1, 1)
1508db294adcSBram Moolenaar  let @/ = 'foo'
1509a4208966SBram Moolenaar  let pat = @/->escape('()*?'. '\s\+')
1510db294adcSBram Moolenaar  let g:a = execute(':unsilent :norm! n')
1511db294adcSBram Moolenaar  call assert_match(pat, g:a)
1512db294adcSBram Moolenaar
1513db294adcSBram Moolenaar  " right-left
1514db294adcSBram Moolenaar  if exists("+rightleft")
1515db294adcSBram Moolenaar    set rl
1516db294adcSBram Moolenaar    call cursor(1, 1)
1517db294adcSBram Moolenaar    let @/ = 'foo'
1518db294adcSBram Moolenaar    let pat = 'oof/\s\+'
1519db294adcSBram Moolenaar    let g:a = execute(':unsilent :norm! n')
1520db294adcSBram Moolenaar    call assert_match(pat, g:a)
1521db294adcSBram Moolenaar    set norl
1522db294adcSBram Moolenaar  endif
1523db294adcSBram Moolenaarendfunc
1524196b4664SBram Moolenaar
1525196b4664SBram Moolenaarfunc Test_searchdecl()
1526196b4664SBram Moolenaar  let lines =<< trim END
1527196b4664SBram Moolenaar     int global;
1528196b4664SBram Moolenaar
1529196b4664SBram Moolenaar     func()
1530196b4664SBram Moolenaar     {
1531196b4664SBram Moolenaar       int global;
1532196b4664SBram Moolenaar       if (cond) {
1533196b4664SBram Moolenaar	 int local;
1534196b4664SBram Moolenaar       }
1535196b4664SBram Moolenaar       int local;
1536196b4664SBram Moolenaar       // comment
1537196b4664SBram Moolenaar     }
1538196b4664SBram Moolenaar  END
1539196b4664SBram Moolenaar  new
1540196b4664SBram Moolenaar  call setline(1, lines)
1541196b4664SBram Moolenaar  10
1542196b4664SBram Moolenaar  call assert_equal(0, searchdecl('local', 0, 0))
1543196b4664SBram Moolenaar  call assert_equal(7, getcurpos()[1])
1544196b4664SBram Moolenaar
1545196b4664SBram Moolenaar  10
1546196b4664SBram Moolenaar  call assert_equal(0, 'local'->searchdecl(0, 1))
1547196b4664SBram Moolenaar  call assert_equal(9, getcurpos()[1])
1548196b4664SBram Moolenaar
1549196b4664SBram Moolenaar  10
1550196b4664SBram Moolenaar  call assert_equal(0, searchdecl('global'))
1551196b4664SBram Moolenaar  call assert_equal(5, getcurpos()[1])
1552196b4664SBram Moolenaar
1553196b4664SBram Moolenaar  10
1554196b4664SBram Moolenaar  call assert_equal(0, searchdecl('global', 1))
1555196b4664SBram Moolenaar  call assert_equal(1, getcurpos()[1])
1556196b4664SBram Moolenaar
1557196b4664SBram Moolenaar  bwipe!
1558196b4664SBram Moolenaarendfunc
155998a336ddSBram Moolenaar
156098a336ddSBram Moolenaarfunc Test_search_special()
1561fe4bbac1SBram Moolenaar  " this was causing illegal memory access and an endless loop
1562fe4bbac1SBram Moolenaar  set t_PE=
156398a336ddSBram Moolenaar  exe "norm /\x80PS"
156498a336ddSBram Moolenaarendfunc
156507ada5ffSBram Moolenaar
156607ada5ffSBram Moolenaar" Test for command failures when the last search pattern is not set.
15679f6277bdSBram Moolenaar" Need to run this in a new vim instance where last search pattern is not set.
156807ada5ffSBram Moolenaarfunc Test_search_with_no_last_pat()
15699f6277bdSBram Moolenaar  let lines =<< trim [SCRIPT]
157007ada5ffSBram Moolenaar    call assert_fails("normal i\<C-R>/\e", 'E35:')
157107ada5ffSBram Moolenaar    call assert_fails("exe '/'", 'E35:')
157207ada5ffSBram Moolenaar    call assert_fails("exe '?'", 'E35:')
157307ada5ffSBram Moolenaar    call assert_fails("/", 'E35:')
157407ada5ffSBram Moolenaar    call assert_fails("?", 'E35:')
157507ada5ffSBram Moolenaar    call assert_fails("normal n", 'E35:')
157607ada5ffSBram Moolenaar    call assert_fails("normal N", 'E35:')
157707ada5ffSBram Moolenaar    call assert_fails("normal gn", 'E35:')
157807ada5ffSBram Moolenaar    call assert_fails("normal gN", 'E35:')
157907ada5ffSBram Moolenaar    call assert_fails("normal cgn", 'E35:')
158007ada5ffSBram Moolenaar    call assert_fails("normal cgN", 'E35:')
158107ada5ffSBram Moolenaar    let p = []
158207ada5ffSBram Moolenaar    let p = @/
158307ada5ffSBram Moolenaar    call assert_equal('', p)
158407ada5ffSBram Moolenaar    call assert_fails("normal :\<C-R>/", 'E35:')
158507ada5ffSBram Moolenaar    call assert_fails("//p", 'E35:')
158607ada5ffSBram Moolenaar    call assert_fails(";//p", 'E35:')
158707ada5ffSBram Moolenaar    call assert_fails("??p", 'E35:')
158807ada5ffSBram Moolenaar    call assert_fails(";??p", 'E35:')
15899b7bf9e9SBram Moolenaar    call assert_fails('g//p', ['E35:', 'E476:'])
15909b7bf9e9SBram Moolenaar    call assert_fails('v//p', ['E35:', 'E476:'])
15919f6277bdSBram Moolenaar    call writefile(v:errors, 'Xresult')
15929f6277bdSBram Moolenaar    qall!
15939f6277bdSBram Moolenaar  [SCRIPT]
15949f6277bdSBram Moolenaar  call writefile(lines, 'Xscript')
15959f6277bdSBram Moolenaar
15969f6277bdSBram Moolenaar  if RunVim([], [], '--clean -S Xscript')
15979f6277bdSBram Moolenaar    call assert_equal([], readfile('Xresult'))
15989f6277bdSBram Moolenaar  endif
15999f6277bdSBram Moolenaar  call delete('Xscript')
16009f6277bdSBram Moolenaar  call delete('Xresult')
160107ada5ffSBram Moolenaarendfunc
160207ada5ffSBram Moolenaar
160307ada5ffSBram Moolenaar" Test for using tilde (~) atom in search. This should use the last used
160407ada5ffSBram Moolenaar" substitute pattern
160507ada5ffSBram Moolenaarfunc Test_search_tilde_pat()
16069f6277bdSBram Moolenaar  let lines =<< trim [SCRIPT]
160707ada5ffSBram Moolenaar    set regexpengine=1
160807ada5ffSBram Moolenaar    call assert_fails('exe "normal /~\<CR>"', 'E33:')
160907ada5ffSBram Moolenaar    call assert_fails('exe "normal ?~\<CR>"', 'E33:')
161007ada5ffSBram Moolenaar    set regexpengine=2
16119b7bf9e9SBram Moolenaar    call assert_fails('exe "normal /~\<CR>"', ['E33:', 'E383:'])
16129b7bf9e9SBram Moolenaar    call assert_fails('exe "normal ?~\<CR>"', ['E33:', 'E383:'])
161307ada5ffSBram Moolenaar    set regexpengine&
16149f6277bdSBram Moolenaar    call writefile(v:errors, 'Xresult')
16159f6277bdSBram Moolenaar    qall!
16169f6277bdSBram Moolenaar  [SCRIPT]
16179f6277bdSBram Moolenaar  call writefile(lines, 'Xscript')
16189f6277bdSBram Moolenaar  if RunVim([], [], '--clean -S Xscript')
16199f6277bdSBram Moolenaar    call assert_equal([], readfile('Xresult'))
16209f6277bdSBram Moolenaar  endif
16219f6277bdSBram Moolenaar  call delete('Xscript')
16229f6277bdSBram Moolenaar  call delete('Xresult')
162307ada5ffSBram Moolenaarendfunc
162407ada5ffSBram Moolenaar
1625406cd90fSBram Moolenaar" Test for searching a pattern that is not present with 'nowrapscan'
1626406cd90fSBram Moolenaarfunc Test_search_pat_not_found()
1627406cd90fSBram Moolenaar  new
1628406cd90fSBram Moolenaar  set nowrapscan
1629406cd90fSBram Moolenaar  let @/ = '1abcxyz2'
1630406cd90fSBram Moolenaar  call assert_fails('normal n', 'E385:')
1631406cd90fSBram Moolenaar  call assert_fails('normal N', 'E384:')
1632406cd90fSBram Moolenaar  set wrapscan&
1633406cd90fSBram Moolenaar  close
1634406cd90fSBram Moolenaarendfunc
1635406cd90fSBram Moolenaar
1636406cd90fSBram Moolenaar" Test for v:searchforward variable
1637406cd90fSBram Moolenaarfunc Test_searchforward_var()
1638406cd90fSBram Moolenaar  new
1639406cd90fSBram Moolenaar  call setline(1, ['foo', '', 'foo'])
1640406cd90fSBram Moolenaar  call cursor(2, 1)
1641406cd90fSBram Moolenaar  let @/ = 'foo'
1642406cd90fSBram Moolenaar  let v:searchforward = 0
1643406cd90fSBram Moolenaar  normal N
1644406cd90fSBram Moolenaar  call assert_equal(3, line('.'))
1645406cd90fSBram Moolenaar  call cursor(2, 1)
1646406cd90fSBram Moolenaar  let v:searchforward = 1
1647406cd90fSBram Moolenaar  normal N
1648406cd90fSBram Moolenaar  call assert_equal(1, line('.'))
1649406cd90fSBram Moolenaar  close!
1650406cd90fSBram Moolenaarendfunc
1651406cd90fSBram Moolenaar
1652476a6131SBram Moolenaar" Test for invalid regular expressions
1653476a6131SBram Moolenaarfunc Test_invalid_regexp()
1654476a6131SBram Moolenaar  set regexpengine=1
1655476a6131SBram Moolenaar  call assert_fails("call search(repeat('\\(.\\)', 10))", 'E51:')
16564d23c528SBram Moolenaar  call assert_fails("call search('\\%(')", 'E53:')
16574d23c528SBram Moolenaar  call assert_fails("call search('\\(')", 'E54:')
16584d23c528SBram Moolenaar  call assert_fails("call search('\\)')", 'E55:')
1659476a6131SBram Moolenaar  call assert_fails("call search('x\\@#')", 'E59:')
16604d23c528SBram Moolenaar  call assert_fails('call search(''\v%(%(%(%(%(%(%(%(%(%(%(a){1}){1}){1}){1}){1}){1}){1}){1}){1}){1}){1}'')', 'E60:')
16614d23c528SBram Moolenaar  call assert_fails("call search('a\\+*')", 'E61:')
1662476a6131SBram Moolenaar  call assert_fails("call search('\\_m')", 'E63:')
1663476a6131SBram Moolenaar  call assert_fails("call search('\\+')", 'E64:')
1664476a6131SBram Moolenaar  call assert_fails("call search('\\1')", 'E65:')
1665476a6131SBram Moolenaar  call assert_fails("call search('\\z\\(\\)')", 'E66:')
1666476a6131SBram Moolenaar  call assert_fails("call search('\\z2')", 'E67:')
1667476a6131SBram Moolenaar  call assert_fails("call search('\\zx')", 'E68:')
1668476a6131SBram Moolenaar  call assert_fails("call search('\\%[ab')", 'E69:')
1669476a6131SBram Moolenaar  call assert_fails("call search('\\%[]')", 'E70:')
1670476a6131SBram Moolenaar  call assert_fails("call search('\\%a')", 'E71:')
1671476a6131SBram Moolenaar  call assert_fails("call search('ab\\%[\\(cd\\)]')", 'E369:')
1672476a6131SBram Moolenaar  call assert_fails("call search('ab\\%[\\%(cd\\)]')", 'E369:')
1673476a6131SBram Moolenaar  set regexpengine=2
1674476a6131SBram Moolenaar  call assert_fails("call search('\\_')", 'E865:')
1675476a6131SBram Moolenaar  call assert_fails("call search('\\+')", 'E866:')
1676476a6131SBram Moolenaar  call assert_fails("call search('\\zx')", 'E867:')
1677476a6131SBram Moolenaar  call assert_fails("call search('\\%a')", 'E867:')
1678476a6131SBram Moolenaar  call assert_fails("call search('x\\@#')", 'E869:')
1679476a6131SBram Moolenaar  call assert_fails("call search(repeat('\\(.\\)', 10))", 'E872:')
1680476a6131SBram Moolenaar  call assert_fails("call search('\\_m')", 'E877:')
1681476a6131SBram Moolenaar  call assert_fails("call search('\\%(')", 'E53:')
1682476a6131SBram Moolenaar  call assert_fails("call search('\\(')", 'E54:')
1683476a6131SBram Moolenaar  call assert_fails("call search('\\)')", 'E55:')
1684476a6131SBram Moolenaar  call assert_fails("call search('\\z\\(\\)')", 'E66:')
1685476a6131SBram Moolenaar  call assert_fails("call search('\\%[ab')", 'E69:')
16864d23c528SBram Moolenaar  call assert_fails("call search('\\%[]')", 'E70:')
1687476a6131SBram Moolenaar  call assert_fails("call search('\\%9999999999999999999999999999v')", 'E951:')
1688476a6131SBram Moolenaar  set regexpengine&
1689476a6131SBram Moolenaar  call assert_fails("call search('\\%#=3ab')", 'E864:')
1690476a6131SBram Moolenaarendfunc
1691476a6131SBram Moolenaar
1692004a6781SBram Moolenaar" Test for searching a very complex pattern in a string. Should switch the
1693004a6781SBram Moolenaar" regexp engine from NFA to the old engine.
1694004a6781SBram Moolenaarfunc Test_regexp_switch_engine()
1695004a6781SBram Moolenaar  let l = readfile('samples/re.freeze.txt')
1696004a6781SBram Moolenaar  let v = substitute(l[4], '..\@<!', '', '')
1697004a6781SBram Moolenaar  call assert_equal(l[4], v)
1698004a6781SBram Moolenaarendfunc
1699004a6781SBram Moolenaar
1700004a6781SBram Moolenaar" Test for the \%V atom to search within visually selected text
1701004a6781SBram Moolenaarfunc Test_search_in_visual_area()
1702004a6781SBram Moolenaar  new
1703004a6781SBram Moolenaar  call setline(1, ['foo bar1', 'foo bar2', 'foo bar3', 'foo bar4'])
1704004a6781SBram Moolenaar  exe "normal 2GVjo/\\%Vbar\<CR>\<Esc>"
1705004a6781SBram Moolenaar  call assert_equal([2, 5], [line('.'), col('.')])
1706004a6781SBram Moolenaar  exe "normal 2GVj$?\\%Vbar\<CR>\<Esc>"
1707004a6781SBram Moolenaar  call assert_equal([3, 5], [line('.'), col('.')])
1708004a6781SBram Moolenaar  close!
1709004a6781SBram Moolenaarendfunc
1710004a6781SBram Moolenaar
1711ea04a6e8SBram Moolenaar" Test for searching with 'smartcase' and 'ignorecase'
1712ea04a6e8SBram Moolenaarfunc Test_search_smartcase()
1713ea04a6e8SBram Moolenaar  new
1714ea04a6e8SBram Moolenaar  call setline(1, ['', 'Hello'])
1715ea04a6e8SBram Moolenaar  set noignorecase nosmartcase
1716ea04a6e8SBram Moolenaar  call assert_fails('exe "normal /\\a\\_.\\(.*\\)O\<CR>"', 'E486:')
1717ea04a6e8SBram Moolenaar
1718ea04a6e8SBram Moolenaar  set ignorecase nosmartcase
1719ea04a6e8SBram Moolenaar  exe "normal /\\a\\_.\\(.*\\)O\<CR>"
1720ea04a6e8SBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
1721ea04a6e8SBram Moolenaar
1722ea04a6e8SBram Moolenaar  call cursor(1, 1)
1723ea04a6e8SBram Moolenaar  set ignorecase smartcase
1724ea04a6e8SBram Moolenaar  call assert_fails('exe "normal /\\a\\_.\\(.*\\)O\<CR>"', 'E486:')
1725ea04a6e8SBram Moolenaar
1726ea04a6e8SBram Moolenaar  exe "normal /\\a\\_.\\(.*\\)o\<CR>"
1727ea04a6e8SBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
1728ea04a6e8SBram Moolenaar
1729224a5f17SBram Moolenaar  " Test for using special atoms with 'smartcase'
1730224a5f17SBram Moolenaar  call setline(1, ['', '    Hello\ '])
1731224a5f17SBram Moolenaar  call cursor(1, 1)
1732224a5f17SBram Moolenaar  call feedkeys('/\_.\%(\uello\)\' .. "\<CR>", 'xt')
1733224a5f17SBram Moolenaar  call assert_equal([2, 4], [line('.'), col('.')])
1734224a5f17SBram Moolenaar
1735ea04a6e8SBram Moolenaar  set ignorecase& smartcase&
1736ea04a6e8SBram Moolenaar  close!
1737d66cdcd4SBram Moolenaarendfun
1738d66cdcd4SBram Moolenaar
1739d66cdcd4SBram Moolenaar" Test 'smartcase' with utf-8.
1740d66cdcd4SBram Moolenaarfunc Test_search_smartcase_utf8()
1741d66cdcd4SBram Moolenaar  new
1742d66cdcd4SBram Moolenaar  let save_enc = &encoding
1743d66cdcd4SBram Moolenaar  set encoding=utf8 ignorecase smartcase
1744d66cdcd4SBram Moolenaar
1745d66cdcd4SBram Moolenaar  call setline(1, 'Café cafÉ')
1746d66cdcd4SBram Moolenaar  1s/café/x/g
1747d66cdcd4SBram Moolenaar  call assert_equal('x x', getline(1))
1748d66cdcd4SBram Moolenaar
1749d66cdcd4SBram Moolenaar  call setline(1, 'Café cafÉ')
1750d66cdcd4SBram Moolenaar  1s/cafÉ/x/g
1751d66cdcd4SBram Moolenaar  call assert_equal('Café x', getline(1))
1752d66cdcd4SBram Moolenaar
1753d66cdcd4SBram Moolenaar  set ignorecase& smartcase&
1754d66cdcd4SBram Moolenaar  let &encoding = save_enc
1755d66cdcd4SBram Moolenaar  close!
1756ea04a6e8SBram Moolenaarendfunc
1757ea04a6e8SBram Moolenaar
1758ea04a6e8SBram Moolenaar" Test searching past the end of a file
1759ea04a6e8SBram Moolenaarfunc Test_search_past_eof()
1760ea04a6e8SBram Moolenaar  new
1761ea04a6e8SBram Moolenaar  call setline(1, ['Line'])
1762ea04a6e8SBram Moolenaar  exe "normal /\\n\\zs\<CR>"
1763ea04a6e8SBram Moolenaar  call assert_equal([1, 4], [line('.'), col('.')])
1764ea04a6e8SBram Moolenaar  close!
1765ea04a6e8SBram Moolenaarendfunc
1766ea04a6e8SBram Moolenaar
1767224a5f17SBram Moolenaar" Test for various search offsets
1768224a5f17SBram Moolenaarfunc Test_search_offset()
1769224a5f17SBram Moolenaar  " With /e, for a match in the first column of a line, the cursor should be
1770224a5f17SBram Moolenaar  " placed at the end of the previous line.
1771224a5f17SBram Moolenaar  new
1772224a5f17SBram Moolenaar  call setline(1, ['one two', 'three four'])
1773224a5f17SBram Moolenaar  call search('two\_.', 'e')
1774224a5f17SBram Moolenaar  call assert_equal([1, 7], [line('.'), col('.')])
1775224a5f17SBram Moolenaar
1776224a5f17SBram Moolenaar  " with cursor at the beginning of the file, use /s+1
1777224a5f17SBram Moolenaar  call cursor(1, 1)
1778224a5f17SBram Moolenaar  exe "normal /two/s+1\<CR>"
1779224a5f17SBram Moolenaar  call assert_equal([1, 6], [line('.'), col('.')])
1780224a5f17SBram Moolenaar
1781224a5f17SBram Moolenaar  " with cursor at the end of the file, use /e-1
1782224a5f17SBram Moolenaar  call cursor(2, 10)
1783224a5f17SBram Moolenaar  exe "normal ?three?e-1\<CR>"
1784224a5f17SBram Moolenaar  call assert_equal([2, 4], [line('.'), col('.')])
1785224a5f17SBram Moolenaar
1786224a5f17SBram Moolenaar  " line offset - after the last line
1787224a5f17SBram Moolenaar  call cursor(1, 1)
1788224a5f17SBram Moolenaar  exe "normal /three/+1\<CR>"
1789224a5f17SBram Moolenaar  call assert_equal([2, 1], [line('.'), col('.')])
1790224a5f17SBram Moolenaar
1791224a5f17SBram Moolenaar  " line offset - before the first line
1792224a5f17SBram Moolenaar  call cursor(2, 1)
1793224a5f17SBram Moolenaar  exe "normal ?one?-1\<CR>"
1794224a5f17SBram Moolenaar  call assert_equal([1, 1], [line('.'), col('.')])
1795224a5f17SBram Moolenaar
1796224a5f17SBram Moolenaar  " character offset - before the first character in the file
1797224a5f17SBram Moolenaar  call cursor(2, 1)
1798224a5f17SBram Moolenaar  exe "normal ?one?s-1\<CR>"
1799224a5f17SBram Moolenaar  call assert_equal([1, 1], [line('.'), col('.')])
1800224a5f17SBram Moolenaar  call cursor(2, 1)
1801224a5f17SBram Moolenaar  exe "normal ?one?e-3\<CR>"
1802224a5f17SBram Moolenaar  call assert_equal([1, 1], [line('.'), col('.')])
1803224a5f17SBram Moolenaar
1804224a5f17SBram Moolenaar  " character offset - after the last character in the file
1805224a5f17SBram Moolenaar  call cursor(1, 1)
1806224a5f17SBram Moolenaar  exe "normal /four/s+4\<CR>"
1807224a5f17SBram Moolenaar  call assert_equal([2, 10], [line('.'), col('.')])
1808224a5f17SBram Moolenaar  call cursor(1, 1)
1809224a5f17SBram Moolenaar  exe "normal /four/e+1\<CR>"
1810224a5f17SBram Moolenaar  call assert_equal([2, 10], [line('.'), col('.')])
1811224a5f17SBram Moolenaar
1812224a5f17SBram Moolenaar  close!
1813224a5f17SBram Moolenaarendfunc
1814224a5f17SBram Moolenaar
1815224a5f17SBram Moolenaar" Test for searching for matching parenthesis using %
1816224a5f17SBram Moolenaarfunc Test_search_match_paren()
1817224a5f17SBram Moolenaar  new
1818224a5f17SBram Moolenaar  call setline(1, "abc(def')'ghi'('jk'\\t'lm)no")
1819224a5f17SBram Moolenaar  " searching for a matching parenthesis should skip single quoted characters
1820224a5f17SBram Moolenaar  call cursor(1, 4)
1821224a5f17SBram Moolenaar  normal %
1822224a5f17SBram Moolenaar  call assert_equal([1, 25], [line('.'), col('.')])
1823224a5f17SBram Moolenaar  normal %
1824224a5f17SBram Moolenaar  call assert_equal([1, 4], [line('.'), col('.')])
1825224a5f17SBram Moolenaar  call cursor(1, 5)
1826224a5f17SBram Moolenaar  normal ])
1827224a5f17SBram Moolenaar  call assert_equal([1, 25], [line('.'), col('.')])
1828224a5f17SBram Moolenaar  call cursor(1, 24)
1829224a5f17SBram Moolenaar  normal [(
1830224a5f17SBram Moolenaar  call assert_equal([1, 4], [line('.'), col('.')])
1831224a5f17SBram Moolenaar
1832224a5f17SBram Moolenaar  " matching parenthesis in 'virtualedit' mode with cursor after the eol
1833224a5f17SBram Moolenaar  call setline(1, 'abc(defgh)')
1834224a5f17SBram Moolenaar  set virtualedit=all
1835224a5f17SBram Moolenaar  normal 20|%
1836224a5f17SBram Moolenaar  call assert_equal(4, col('.'))
1837224a5f17SBram Moolenaar  set virtualedit&
1838224a5f17SBram Moolenaar  close!
1839224a5f17SBram Moolenaarendfunc
1840224a5f17SBram Moolenaar
1841224a5f17SBram Moolenaar" Test for searching a pattern and stopping before a specified line
1842224a5f17SBram Moolenaarfunc Test_search_stopline()
1843224a5f17SBram Moolenaar  new
1844224a5f17SBram Moolenaar  call setline(1, ['', '', '', 'vim'])
1845224a5f17SBram Moolenaar  call assert_equal(0, search('vim', 'n', 3))
1846224a5f17SBram Moolenaar  call assert_equal(4, search('vim', 'n', 4))
1847224a5f17SBram Moolenaar  call setline(1, ['vim', '', '', ''])
1848224a5f17SBram Moolenaar  call cursor(4, 1)
1849224a5f17SBram Moolenaar  call assert_equal(0, search('vim', 'bn', 2))
1850224a5f17SBram Moolenaar  call assert_equal(1, search('vim', 'bn', 1))
1851224a5f17SBram Moolenaar  close!
1852224a5f17SBram Moolenaarendfunc
1853224a5f17SBram Moolenaar
18546bed0dbcSBram Moolenaarfunc Test_incsearch_highlighting_newline()
1855448465e6SBram Moolenaar  CheckRunVimInTerminal
1856448465e6SBram Moolenaar  CheckOption incsearch
1857448465e6SBram Moolenaar  CheckScreendump
1858448465e6SBram Moolenaar  new
1859448465e6SBram Moolenaar  call test_override("char_avail", 1)
1860448465e6SBram Moolenaar
1861448465e6SBram Moolenaar  let commands =<< trim [CODE]
1862448465e6SBram Moolenaar    set incsearch nohls
1863448465e6SBram Moolenaar    call setline(1, ['test', 'xxx'])
1864448465e6SBram Moolenaar  [CODE]
1865448465e6SBram Moolenaar  call writefile(commands, 'Xincsearch_nl')
1866448465e6SBram Moolenaar  let buf = RunVimInTerminal('-S Xincsearch_nl', {'rows': 5, 'cols': 10})
1867448465e6SBram Moolenaar  call term_sendkeys(buf, '/test')
1868448465e6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_newline1', {})
18696bed0dbcSBram Moolenaar  " Need to send one key at a time to force a redraw
1870448465e6SBram Moolenaar  call term_sendkeys(buf, '\n')
1871448465e6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_newline2', {})
1872448465e6SBram Moolenaar  call term_sendkeys(buf, 'x')
1873448465e6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_newline3', {})
1874448465e6SBram Moolenaar  call term_sendkeys(buf, 'x')
1875448465e6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_newline4', {})
1876448465e6SBram Moolenaar  call term_sendkeys(buf, "\<CR>")
1877448465e6SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_newline5', {})
1878448465e6SBram Moolenaar  call StopVimInTerminal(buf)
1879448465e6SBram Moolenaar
1880448465e6SBram Moolenaar  " clean up
1881448465e6SBram Moolenaar  call delete('Xincsearch_nl')
1882448465e6SBram Moolenaar  call test_override("char_avail", 0)
1883448465e6SBram Moolenaar  bw
1884448465e6SBram Moolenaarendfunc
1885448465e6SBram Moolenaar
1886d93a7fc1SBram Moolenaarfunc Test_incsearch_substitute_dump2()
1887d93a7fc1SBram Moolenaar  CheckOption incsearch
1888d93a7fc1SBram Moolenaar  CheckScreendump
1889d93a7fc1SBram Moolenaar
1890d93a7fc1SBram Moolenaar  call writefile([
1891d93a7fc1SBram Moolenaar	\ 'set incsearch hlsearch scrolloff=0',
1892d93a7fc1SBram Moolenaar	\ 'for n in range(1, 4)',
1893d93a7fc1SBram Moolenaar	\ '  call setline(n, "foo " . n)',
1894d93a7fc1SBram Moolenaar	\ 'endfor',
1895d93a7fc1SBram Moolenaar	\ 'call setline(5, "abc|def")',
1896d93a7fc1SBram Moolenaar	\ '3',
1897d93a7fc1SBram Moolenaar	\ ], 'Xis_subst_script2')
1898d93a7fc1SBram Moolenaar  let buf = RunVimInTerminal('-S Xis_subst_script2', {'rows': 9, 'cols': 70})
1899d93a7fc1SBram Moolenaar
1900d93a7fc1SBram Moolenaar  call term_sendkeys(buf, ':%s/\vabc|')
1901d93a7fc1SBram Moolenaar  sleep 100m
1902d93a7fc1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_sub_01', {})
1903d93a7fc1SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
1904d93a7fc1SBram Moolenaar
1905d93a7fc1SBram Moolenaar  " The following should not be highlighted
1906d93a7fc1SBram Moolenaar  call term_sendkeys(buf, ':1,5s/\v|')
1907d93a7fc1SBram Moolenaar  sleep 100m
1908d93a7fc1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_incsearch_sub_02', {})
1909d93a7fc1SBram Moolenaar
1910d93a7fc1SBram Moolenaar
1911d93a7fc1SBram Moolenaar  call StopVimInTerminal(buf)
1912d93a7fc1SBram Moolenaar  call delete('Xis_subst_script2')
1913d93a7fc1SBram Moolenaarendfunc
1914d93a7fc1SBram Moolenaar
191578ba933dSChristian Brabandtfunc Test_pattern_is_uppercase_smartcase()
191678ba933dSChristian Brabandt  new
191778ba933dSChristian Brabandt  let input=['abc', 'ABC', 'Abc', 'abC']
191878ba933dSChristian Brabandt  call setline(1, input)
191978ba933dSChristian Brabandt  call cursor(1,1)
192078ba933dSChristian Brabandt  " default, matches firstline
192178ba933dSChristian Brabandt  %s/abc//g
192278ba933dSChristian Brabandt  call assert_equal(['', 'ABC', 'Abc', 'abC'],
192378ba933dSChristian Brabandt        \ getline(1, '$'))
192478ba933dSChristian Brabandt
192578ba933dSChristian Brabandt  set smartcase ignorecase
192678ba933dSChristian Brabandt  sil %d
192778ba933dSChristian Brabandt  call setline(1, input)
192878ba933dSChristian Brabandt  call cursor(1,1)
192978ba933dSChristian Brabandt  " with smartcase and incsearch set, matches everything
193078ba933dSChristian Brabandt  %s/abc//g
193178ba933dSChristian Brabandt  call assert_equal(['', '', '', ''], getline(1, '$'))
193278ba933dSChristian Brabandt
193378ba933dSChristian Brabandt  sil %d
193478ba933dSChristian Brabandt  call setline(1, input)
193578ba933dSChristian Brabandt  call cursor(1,1)
193678ba933dSChristian Brabandt  " with smartcase and incsearch set and found an uppercase letter,
193778ba933dSChristian Brabandt  " match only that.
193878ba933dSChristian Brabandt  %s/abC//g
193978ba933dSChristian Brabandt  call assert_equal(['abc', 'ABC', 'Abc', ''],
194078ba933dSChristian Brabandt        \ getline(1, '$'))
194178ba933dSChristian Brabandt
194278ba933dSChristian Brabandt  sil %d
194378ba933dSChristian Brabandt  call setline(1, input)
194478ba933dSChristian Brabandt  call cursor(1,1)
194578ba933dSChristian Brabandt  exe "norm! vG$\<esc>"
194678ba933dSChristian Brabandt  " \%V should not be detected as uppercase letter
194778ba933dSChristian Brabandt  %s/\%Vabc//g
194878ba933dSChristian Brabandt  call assert_equal(['', '', '', ''], getline(1, '$'))
194978ba933dSChristian Brabandt
195078ba933dSChristian Brabandt  call setline(1, input)
195178ba933dSChristian Brabandt  call cursor(1,1)
195278ba933dSChristian Brabandt  exe "norm! vG$\<esc>"
195378ba933dSChristian Brabandt  " \v%V should not be detected as uppercase letter
195478ba933dSChristian Brabandt  %s/\v%Vabc//g
195578ba933dSChristian Brabandt  call assert_equal(['', '', '', ''], getline(1, '$'))
195678ba933dSChristian Brabandt
195778ba933dSChristian Brabandt  call setline(1, input)
195878ba933dSChristian Brabandt  call cursor(1,1)
195978ba933dSChristian Brabandt  exe "norm! vG$\<esc>"
196078ba933dSChristian Brabandt  " \v%VabC should be detected as uppercase letter
196178ba933dSChristian Brabandt  %s/\v%VabC//g
196278ba933dSChristian Brabandt  call assert_equal(['abc', 'ABC', 'Abc', ''],
196378ba933dSChristian Brabandt        \ getline(1, '$'))
196478ba933dSChristian Brabandt
1965bc67e5a0SChristian Brabandt  call setline(1, input)
1966bc67e5a0SChristian Brabandt  call cursor(1,1)
1967bc67e5a0SChristian Brabandt  " \Vabc should match everything
1968bc67e5a0SChristian Brabandt  %s/\Vabc//g
1969bc67e5a0SChristian Brabandt  call assert_equal(['', '', '', ''], getline(1, '$'))
1970bc67e5a0SChristian Brabandt
1971bc67e5a0SChristian Brabandt  call setline(1, input + ['_abc'])
1972bc67e5a0SChristian Brabandt  " _ matches normally
1973bc67e5a0SChristian Brabandt  %s/\v_.*//g
1974bc67e5a0SChristian Brabandt  call assert_equal(['abc', 'ABC', 'Abc', 'abC', ''], getline(1, '$'))
1975bc67e5a0SChristian Brabandt
197678ba933dSChristian Brabandt  set smartcase& ignorecase&
197778ba933dSChristian Brabandt  bw!
197878ba933dSChristian Brabandtendfunc
197978ba933dSChristian Brabandt
1980d8d957deSBram Moolenaarfunc Test_no_last_search_pattern()
1981d8d957deSBram Moolenaar  CheckOption incsearch
1982d8d957deSBram Moolenaar
1983d8d957deSBram Moolenaar  let @/ = ""
1984d8d957deSBram Moolenaar  set incsearch
19859af9fd6aSBram Moolenaar  " these were causing a crash
19869af9fd6aSBram Moolenaar  call feedkeys("//\<C-G>", 'xt')
19879af9fd6aSBram Moolenaar  call feedkeys("//\<C-T>", 'xt')
19889af9fd6aSBram Moolenaar  call feedkeys("??\<C-G>", 'xt')
19899af9fd6aSBram Moolenaar  call feedkeys("??\<C-T>", 'xt')
1990d8d957deSBram Moolenaarendfunc
1991d8d957deSBram Moolenaar
1992*35a319b7SBram Moolenaarfunc Test_search_with_invalid_range()
1993*35a319b7SBram Moolenaar  new
1994*35a319b7SBram Moolenaar  let lines =<< trim END
1995*35a319b7SBram Moolenaar    /\%.v
1996*35a319b7SBram Moolenaar    5/
1997*35a319b7SBram Moolenaar    c
1998*35a319b7SBram Moolenaar  END
1999*35a319b7SBram Moolenaar  call writefile(lines, 'Xrangesearch')
2000*35a319b7SBram Moolenaar  source Xrangesearch
2001*35a319b7SBram Moolenaar
2002*35a319b7SBram Moolenaar  bwipe!
2003*35a319b7SBram Moolenaar  call delete('Xrangesearch')
2004*35a319b7SBram Moolenaarendfunc
2005*35a319b7SBram Moolenaar
2006d8d957deSBram Moolenaar
200707ada5ffSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
2008