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 a /\%u61\Z "\u0061" 13955f5e203cSBram Moolenaar " ' ̀' U+0300 Dec:768 COMBINING GRAVE ACCENT ̀ /\%u300\Z "\u0300" 13965f5e203cSBram Moolenaar " ' ́' U+0301 Dec:769 COMBINING ACUTE ACCENT ́ /\%u301\Z "\u0301" 13975f5e203cSBram Moolenaar " ' ̇' U+0307 Dec:775 COMBINING DOT ABOVE ̇ /\%u307\Z "\u0307" 13985f5e203cSBram Moolenaar " ' ̣' U+0323 Dec:803 COMBINING DOT BELOW ̣ /\%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