2024-04-20 08:44:13 -07:00
|
|
|
local t = require('test.testutil')
|
|
|
|
local n = require('test.functional.testnvim')()
|
2015-02-02 10:23:49 -07:00
|
|
|
local Screen = require('test.functional.ui.screen')
|
2024-04-20 08:44:13 -07:00
|
|
|
|
|
|
|
local clear, feed, insert = n.clear, n.feed, n.insert
|
|
|
|
local command = n.command
|
|
|
|
local feed_command = n.feed_command
|
2024-04-08 02:03:20 -07:00
|
|
|
local eq = t.eq
|
2024-04-20 08:44:13 -07:00
|
|
|
local eval = n.eval
|
|
|
|
local fn = n.fn
|
|
|
|
local testprg = n.testprg
|
2015-02-02 10:23:49 -07:00
|
|
|
|
|
|
|
describe('search highlighting', function()
|
|
|
|
local screen
|
|
|
|
|
|
|
|
before_each(function()
|
|
|
|
clear()
|
|
|
|
screen = Screen.new(40, 7)
|
|
|
|
screen:set_default_attr_ids({
|
2016-08-09 05:05:08 -07:00
|
|
|
[1] = { bold = true, foreground = Screen.colors.Blue },
|
2023-02-11 03:44:06 -07:00
|
|
|
[2] = { background = Screen.colors.Yellow }, -- Search
|
2016-08-09 05:05:08 -07:00
|
|
|
[3] = { reverse = true },
|
2023-10-13 22:53:52 -07:00
|
|
|
[4] = { foreground = Screen.colors.Red }, -- WarningMsg
|
|
|
|
[5] = { bold = true, reverse = true }, -- StatusLine
|
2020-12-28 17:19:24 -07:00
|
|
|
[6] = { foreground = Screen.colors.Blue4, background = Screen.colors.LightGrey }, -- Folded
|
2015-02-02 10:23:49 -07:00
|
|
|
})
|
|
|
|
end)
|
|
|
|
|
2015-06-20 13:40:03 -07:00
|
|
|
it('is disabled by ":set nohlsearch"', function()
|
2017-04-08 14:12:26 -07:00
|
|
|
feed_command('set nohlsearch')
|
2015-02-02 10:23:49 -07:00
|
|
|
insert('some text\nmore text')
|
|
|
|
feed('gg/text<cr>')
|
|
|
|
screen:expect([[
|
|
|
|
some ^text |
|
|
|
|
more text |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*4
|
2015-02-02 10:23:49 -07:00
|
|
|
/text |
|
|
|
|
]])
|
|
|
|
end)
|
|
|
|
|
2020-12-28 17:19:24 -07:00
|
|
|
it('is disabled in folded text', function()
|
|
|
|
insert('some text\nmore text')
|
|
|
|
feed_command('1,2fold')
|
|
|
|
feed('gg/text')
|
2022-05-21 14:07:34 -07:00
|
|
|
screen:expect {
|
|
|
|
grid = [[
|
2020-12-28 17:19:24 -07:00
|
|
|
{6:+-- 2 lines: some text·················}|
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*5
|
2020-12-28 17:19:24 -07:00
|
|
|
/text^ |
|
2022-05-21 14:07:34 -07:00
|
|
|
]],
|
|
|
|
win_viewport = {
|
2023-08-22 07:48:55 -07:00
|
|
|
[2] = {
|
2024-01-16 06:26:21 -07:00
|
|
|
win = 1000,
|
2023-08-22 07:48:55 -07:00
|
|
|
topline = 0,
|
|
|
|
botline = 3,
|
|
|
|
curline = 0,
|
2024-04-02 04:08:03 -07:00
|
|
|
curcol = 9,
|
2023-08-22 07:48:55 -07:00
|
|
|
linecount = 2,
|
|
|
|
sum_scroll_delta = 0,
|
2024-01-02 18:09:18 -07:00
|
|
|
},
|
|
|
|
},
|
2022-05-21 14:07:34 -07:00
|
|
|
}
|
2020-12-28 17:19:24 -07:00
|
|
|
end)
|
|
|
|
|
2023-07-23 06:36:32 -07:00
|
|
|
local function test_search_hl()
|
2015-02-02 10:23:49 -07:00
|
|
|
insert([[
|
|
|
|
some text
|
|
|
|
more textstuff
|
|
|
|
stupidtexttextstuff
|
|
|
|
a text word
|
|
|
|
]])
|
2015-06-20 13:40:03 -07:00
|
|
|
|
|
|
|
-- 'hlsearch' is enabled by default. #2859
|
2015-02-02 10:23:49 -07:00
|
|
|
feed('gg/text<cr>')
|
|
|
|
screen:expect([[
|
2016-08-09 05:05:08 -07:00
|
|
|
some {2:^text} |
|
|
|
|
more {2:text}stuff |
|
|
|
|
stupid{2:texttext}stuff |
|
|
|
|
a {2:text} word |
|
2015-02-02 10:23:49 -07:00
|
|
|
|
|
2016-08-09 05:05:08 -07:00
|
|
|
{1:~ }|
|
2015-02-02 10:23:49 -07:00
|
|
|
/text |
|
|
|
|
]])
|
|
|
|
|
|
|
|
-- overlapping matches not allowed
|
|
|
|
feed('3nx')
|
|
|
|
screen:expect([[
|
2016-08-09 05:05:08 -07:00
|
|
|
some {2:text} |
|
|
|
|
more {2:text}stuff |
|
|
|
|
stupid{2:text}^extstuff |
|
|
|
|
a {2:text} word |
|
2015-02-02 10:23:49 -07:00
|
|
|
|
|
2016-08-09 05:05:08 -07:00
|
|
|
{1:~ }|
|
2015-02-02 10:23:49 -07:00
|
|
|
/text |
|
|
|
|
]])
|
|
|
|
|
|
|
|
feed('ggn*') -- search for entire word
|
|
|
|
screen:expect([[
|
2016-08-09 05:05:08 -07:00
|
|
|
some {2:text} |
|
2015-02-02 10:23:49 -07:00
|
|
|
more textstuff |
|
|
|
|
stupidtextextstuff |
|
2016-08-09 05:05:08 -07:00
|
|
|
a {2:^text} word |
|
2015-02-02 10:23:49 -07:00
|
|
|
|
|
2016-08-09 05:05:08 -07:00
|
|
|
{1:~ }|
|
2015-02-02 10:23:49 -07:00
|
|
|
/\<text\> |
|
|
|
|
]])
|
|
|
|
|
2017-04-08 14:12:26 -07:00
|
|
|
feed_command('nohlsearch')
|
2015-02-02 10:23:49 -07:00
|
|
|
screen:expect([[
|
|
|
|
some text |
|
|
|
|
more textstuff |
|
|
|
|
stupidtextextstuff |
|
|
|
|
a ^text word |
|
|
|
|
|
|
2016-08-09 05:05:08 -07:00
|
|
|
{1:~ }|
|
2015-02-02 10:23:49 -07:00
|
|
|
:nohlsearch |
|
|
|
|
]])
|
2023-07-23 06:36:32 -07:00
|
|
|
end
|
|
|
|
|
|
|
|
it("works when 'winhighlight' is not set", function()
|
|
|
|
test_search_hl()
|
|
|
|
end)
|
|
|
|
|
|
|
|
it("works when 'winhighlight' doesn't change Search highlight", function()
|
|
|
|
command('setlocal winhl=NonText:Underlined')
|
|
|
|
local attrs = screen:get_default_attr_ids()
|
|
|
|
attrs[1] = { foreground = Screen.colors.SlateBlue, underline = true }
|
|
|
|
screen:set_default_attr_ids(attrs)
|
|
|
|
test_search_hl()
|
|
|
|
end)
|
|
|
|
|
|
|
|
it("works when 'winhighlight' changes Search highlight", function()
|
|
|
|
command('setlocal winhl=Search:Underlined')
|
|
|
|
local attrs = screen:get_default_attr_ids()
|
|
|
|
attrs[2] = { foreground = Screen.colors.SlateBlue, underline = true }
|
|
|
|
screen:set_default_attr_ids(attrs)
|
|
|
|
test_search_hl()
|
2015-02-02 10:23:49 -07:00
|
|
|
end)
|
|
|
|
|
2022-04-20 05:42:55 -07:00
|
|
|
describe('CurSearch highlight', function()
|
|
|
|
before_each(function()
|
|
|
|
screen:set_default_attr_ids({
|
|
|
|
[1] = { background = Screen.colors.Yellow }, -- Search
|
|
|
|
[2] = { foreground = Screen.colors.White, background = Screen.colors.Black }, -- CurSearch
|
|
|
|
[3] = { foreground = Screen.colors.Red }, -- WarningMsg
|
|
|
|
})
|
|
|
|
command('highlight CurSearch guibg=Black guifg=White')
|
|
|
|
end)
|
|
|
|
|
|
|
|
it('works for match under cursor', function()
|
|
|
|
insert([[
|
|
|
|
There is no way that a bee should be
|
|
|
|
able to fly. Its wings are too small
|
|
|
|
to get its fat little body off the
|
|
|
|
ground. The bee, of course, flies
|
|
|
|
anyway because bees don't care what
|
|
|
|
humans think is impossible.]])
|
|
|
|
|
|
|
|
feed('/bee<CR>')
|
|
|
|
screen:expect {
|
|
|
|
grid = [[
|
|
|
|
There is no way that a {2:^bee} should be |
|
|
|
|
able to fly. Its wings are too small |
|
|
|
|
to get its fat little body off the |
|
|
|
|
ground. The {1:bee}, of course, flies |
|
|
|
|
anyway because {1:bee}s don't care what |
|
|
|
|
humans think is impossible. |
|
|
|
|
{3:search hit BOTTOM, continuing at TOP} |
|
|
|
|
]],
|
|
|
|
}
|
|
|
|
|
|
|
|
feed('nn')
|
|
|
|
screen:expect {
|
|
|
|
grid = [[
|
|
|
|
There is no way that a {1:bee} should be |
|
|
|
|
able to fly. Its wings are too small |
|
|
|
|
to get its fat little body off the |
|
|
|
|
ground. The {1:bee}, of course, flies |
|
|
|
|
anyway because {2:^bee}s don't care what |
|
|
|
|
humans think is impossible. |
|
|
|
|
/bee |
|
|
|
|
]],
|
|
|
|
}
|
|
|
|
|
|
|
|
feed('N')
|
|
|
|
screen:expect {
|
|
|
|
grid = [[
|
|
|
|
There is no way that a {1:bee} should be |
|
|
|
|
able to fly. Its wings are too small |
|
|
|
|
to get its fat little body off the |
|
|
|
|
ground. The {2:^bee}, of course, flies |
|
|
|
|
anyway because {1:bee}s don't care what |
|
|
|
|
humans think is impossible. |
|
|
|
|
?bee |
|
|
|
|
]],
|
|
|
|
}
|
|
|
|
end)
|
|
|
|
|
2024-06-18 16:42:56 -07:00
|
|
|
-- oldtest: Test_hlsearch_cursearch()
|
|
|
|
it('works for multiline match, no duplicate highlight', function()
|
2022-04-22 15:55:24 -07:00
|
|
|
command([[call setline(1, ['one', 'foo', 'bar', 'baz', 'foo the foo and foo', 'bar'])]])
|
2022-04-21 04:59:25 -07:00
|
|
|
feed('gg/foo<CR>')
|
|
|
|
screen:expect([[
|
|
|
|
one |
|
|
|
|
{2:^foo} |
|
|
|
|
bar |
|
|
|
|
baz |
|
2022-04-22 15:55:24 -07:00
|
|
|
{1:foo} the {1:foo} and {1:foo} |
|
|
|
|
bar |
|
|
|
|
/foo |
|
|
|
|
]])
|
|
|
|
feed('n')
|
|
|
|
screen:expect([[
|
|
|
|
one |
|
2022-04-21 04:59:25 -07:00
|
|
|
{1:foo} |
|
|
|
|
bar |
|
2022-04-22 15:55:24 -07:00
|
|
|
baz |
|
|
|
|
{2:^foo} the {1:foo} and {1:foo} |
|
|
|
|
bar |
|
2022-04-21 04:59:25 -07:00
|
|
|
/foo |
|
|
|
|
]])
|
|
|
|
feed('n')
|
|
|
|
screen:expect([[
|
|
|
|
one |
|
|
|
|
{1:foo} |
|
|
|
|
bar |
|
|
|
|
baz |
|
2022-04-22 15:55:24 -07:00
|
|
|
{1:foo} the {2:^foo} and {1:foo} |
|
|
|
|
bar |
|
|
|
|
/foo |
|
|
|
|
]])
|
|
|
|
feed('n')
|
|
|
|
screen:expect([[
|
|
|
|
one |
|
|
|
|
{1:foo} |
|
|
|
|
bar |
|
|
|
|
baz |
|
|
|
|
{1:foo} the {1:foo} and {2:^foo} |
|
2022-04-21 04:59:25 -07:00
|
|
|
bar |
|
|
|
|
/foo |
|
|
|
|
]])
|
2022-04-22 15:55:24 -07:00
|
|
|
command([[call setline(5, 'foo')]])
|
|
|
|
feed('0?<CR>')
|
2022-04-21 04:59:25 -07:00
|
|
|
screen:expect([[
|
|
|
|
one |
|
|
|
|
{2:^foo} |
|
|
|
|
bar |
|
|
|
|
baz |
|
|
|
|
{1:foo} |
|
|
|
|
bar |
|
|
|
|
?foo |
|
|
|
|
]])
|
|
|
|
feed('gg/foo\\nbar<CR>')
|
|
|
|
screen:expect([[
|
|
|
|
one |
|
2022-10-01 06:29:54 -07:00
|
|
|
{2:^foo } |
|
2022-04-21 04:59:25 -07:00
|
|
|
{2:bar} |
|
|
|
|
baz |
|
2022-10-01 06:29:54 -07:00
|
|
|
{1:foo } |
|
2022-04-21 04:59:25 -07:00
|
|
|
{1:bar} |
|
|
|
|
/foo\nbar |
|
|
|
|
]])
|
|
|
|
command([[call setline(1, ['---', 'abcdefg', 'hijkl', '---', 'abcdefg', 'hijkl'])]])
|
|
|
|
feed('gg/efg\\nhij<CR>')
|
|
|
|
screen:expect([[
|
|
|
|
--- |
|
2022-10-01 06:29:54 -07:00
|
|
|
abcd{2:^efg } |
|
2022-04-21 04:59:25 -07:00
|
|
|
{2:hij}kl |
|
|
|
|
--- |
|
2022-10-01 06:29:54 -07:00
|
|
|
abcd{1:efg } |
|
2022-04-21 04:59:25 -07:00
|
|
|
{1:hij}kl |
|
|
|
|
/efg\nhij |
|
|
|
|
]])
|
|
|
|
feed('n')
|
|
|
|
screen:expect([[
|
|
|
|
--- |
|
2022-10-01 06:29:54 -07:00
|
|
|
abcd{1:efg } |
|
2022-04-21 04:59:25 -07:00
|
|
|
{1:hij}kl |
|
|
|
|
--- |
|
2022-10-01 06:29:54 -07:00
|
|
|
abcd{2:^efg } |
|
2022-04-21 04:59:25 -07:00
|
|
|
{2:hij}kl |
|
|
|
|
/efg\nhij |
|
|
|
|
]])
|
2024-06-18 16:42:56 -07:00
|
|
|
|
|
|
|
-- check clearing CurSearch when using it for another match
|
|
|
|
feed('G?^abcd<CR>Y')
|
|
|
|
screen:expect([[
|
|
|
|
--- |
|
|
|
|
{1:abcd}efg |
|
|
|
|
hijkl |
|
|
|
|
--- |
|
|
|
|
{2:^abcd}efg |
|
|
|
|
hijkl |
|
|
|
|
?^abcd |
|
|
|
|
]])
|
|
|
|
feed('kkP')
|
|
|
|
screen:expect([[
|
|
|
|
--- |
|
|
|
|
{1:abcd}efg |
|
|
|
|
{2:^abcd}efg |
|
|
|
|
hijkl |
|
|
|
|
--- |
|
|
|
|
{1:abcd}efg |
|
|
|
|
?^abcd |
|
|
|
|
]])
|
2022-04-20 05:42:55 -07:00
|
|
|
end)
|
2022-04-11 09:20:24 -07:00
|
|
|
end)
|
|
|
|
|
2018-08-26 21:23:55 -07:00
|
|
|
it('highlights after EOL', function()
|
|
|
|
insert('\n\n\n\n\n\n')
|
|
|
|
|
|
|
|
feed('gg/^<cr>')
|
|
|
|
screen:expect([[
|
|
|
|
{2: } |
|
|
|
|
{2:^ } |
|
2023-12-09 05:42:00 -07:00
|
|
|
{2: } |*4
|
2018-08-26 21:23:55 -07:00
|
|
|
/^ |
|
|
|
|
]])
|
|
|
|
|
|
|
|
-- Test that highlights are preserved after moving the cursor.
|
|
|
|
feed('j')
|
|
|
|
screen:expect([[
|
2023-12-09 05:42:00 -07:00
|
|
|
{2: } |*2
|
2018-08-26 21:23:55 -07:00
|
|
|
{2:^ } |
|
2023-12-09 05:42:00 -07:00
|
|
|
{2: } |*3
|
2018-08-26 21:23:55 -07:00
|
|
|
/^ |
|
|
|
|
]])
|
|
|
|
|
|
|
|
-- Repeat the test in rightleft mode.
|
2018-09-03 22:05:20 -07:00
|
|
|
command('nohlsearch')
|
|
|
|
command('set rightleft')
|
2018-08-26 21:23:55 -07:00
|
|
|
feed('gg/^<cr>')
|
|
|
|
|
|
|
|
screen:expect([[
|
|
|
|
{2: }|
|
|
|
|
{2:^ }|
|
2023-12-09 05:42:00 -07:00
|
|
|
{2: }|*4
|
2018-08-26 21:23:55 -07:00
|
|
|
^/ |
|
|
|
|
]])
|
|
|
|
|
|
|
|
feed('j')
|
|
|
|
screen:expect([[
|
2023-12-09 05:42:00 -07:00
|
|
|
{2: }|*2
|
2018-08-26 21:23:55 -07:00
|
|
|
{2:^ }|
|
2023-12-09 05:42:00 -07:00
|
|
|
{2: }|*3
|
2018-08-26 21:23:55 -07:00
|
|
|
^/ |
|
|
|
|
]])
|
|
|
|
end)
|
|
|
|
|
2018-04-22 03:26:16 -07:00
|
|
|
it('is preserved during :terminal activity', function()
|
2022-06-22 05:51:52 -07:00
|
|
|
feed((':terminal "%s" REP 5000 foo<cr>'):format(testprg('shell-test')))
|
2018-04-20 19:11:45 -07:00
|
|
|
feed(':file term<CR>')
|
2023-10-13 22:53:52 -07:00
|
|
|
screen:expect([[
|
|
|
|
^0: foo |
|
|
|
|
1: foo |
|
|
|
|
2: foo |
|
|
|
|
3: foo |
|
|
|
|
4: foo |
|
|
|
|
5: foo |
|
|
|
|
:file term |
|
|
|
|
]])
|
|
|
|
|
2019-07-20 09:07:04 -07:00
|
|
|
feed('G') -- Follow :terminal output.
|
2018-04-20 19:11:45 -07:00
|
|
|
feed(':vnew<CR>')
|
|
|
|
insert([[
|
|
|
|
foo bar baz
|
|
|
|
bar baz foo
|
2023-10-13 22:53:52 -07:00
|
|
|
bar foo baz]])
|
2018-04-20 19:11:45 -07:00
|
|
|
feed('/foo')
|
2024-06-14 02:28:49 -07:00
|
|
|
screen:set_default_attr_ids({
|
|
|
|
[1] = { bold = true, foreground = Screen.colors.Blue },
|
|
|
|
[2] = { background = Screen.colors.Yellow }, -- Search
|
|
|
|
[3] = { reverse = true },
|
|
|
|
[4] = { bold = true, reverse = true },
|
|
|
|
[5] = { foreground = Screen.colors.White, background = Screen.colors.DarkGreen },
|
|
|
|
})
|
2023-10-13 22:53:52 -07:00
|
|
|
screen:expect([[
|
|
|
|
{3:foo} bar baz │{MATCH:%d+}: {2:foo}{MATCH:%s+}|
|
|
|
|
bar baz {2:foo} │{MATCH:%d+}: {2:foo}{MATCH:%s+}|
|
|
|
|
bar {2:foo} baz │{MATCH:%d+}: {2:foo}{MATCH:%s+}|
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{MATCH:.*}|*2
|
2024-06-14 02:28:49 -07:00
|
|
|
{4:[No Name] [+] }{5:term }|
|
2023-10-13 22:53:52 -07:00
|
|
|
/foo^ |
|
|
|
|
]])
|
2018-04-20 19:11:45 -07:00
|
|
|
end)
|
|
|
|
|
2015-02-02 10:23:49 -07:00
|
|
|
it('works with incsearch', function()
|
2022-07-15 01:58:35 -07:00
|
|
|
command('set hlsearch')
|
|
|
|
command('set incsearch')
|
|
|
|
command('set laststatus=0')
|
2015-02-02 10:23:49 -07:00
|
|
|
insert([[
|
|
|
|
the first line
|
2022-07-15 01:58:35 -07:00
|
|
|
in a little file]])
|
|
|
|
command('vsplit')
|
2015-02-02 10:23:49 -07:00
|
|
|
feed('gg/li')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the first {3:li}ne │the first {2:li}ne |
|
|
|
|
in a {2:li}ttle file │in a {2:li}ttle file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2015-02-02 10:23:49 -07:00
|
|
|
/li^ |
|
|
|
|
]])
|
|
|
|
|
2017-11-03 00:42:26 -07:00
|
|
|
-- check that consecutive matches are caught by C-g/C-t
|
|
|
|
feed('<C-g>')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the first {2:li}ne │the first {2:li}ne |
|
|
|
|
in a {3:li}ttle file │in a {2:li}ttle file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2017-11-03 00:42:26 -07:00
|
|
|
/li^ |
|
|
|
|
]])
|
|
|
|
|
|
|
|
feed('<C-t>')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the first {3:li}ne │the first {2:li}ne |
|
|
|
|
in a {2:li}ttle file │in a {2:li}ttle file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2015-02-02 10:23:49 -07:00
|
|
|
/li^ |
|
|
|
|
]])
|
|
|
|
|
|
|
|
feed('t')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the first line │the first line |
|
|
|
|
in a {3:lit}tle file │in a {2:lit}tle file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2015-02-02 10:23:49 -07:00
|
|
|
/lit^ |
|
|
|
|
]])
|
|
|
|
|
|
|
|
feed('<cr>')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the first line │the first line |
|
|
|
|
in a {2:^lit}tle file │in a {2:lit}tle file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2015-02-02 10:23:49 -07:00
|
|
|
/lit |
|
|
|
|
]])
|
|
|
|
|
|
|
|
feed('/fir')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the {3:fir}st line │the {2:fir}st line |
|
|
|
|
in a little file │in a little file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2015-02-02 10:23:49 -07:00
|
|
|
/fir^ |
|
|
|
|
]])
|
|
|
|
|
|
|
|
-- incsearch have priority over hlsearch
|
|
|
|
feed('<esc>/ttle')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the first line │the first line |
|
|
|
|
in a li{3:ttle} file │in a li{2:ttle} file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2015-02-02 10:23:49 -07:00
|
|
|
/ttle^ |
|
|
|
|
]])
|
2017-10-30 01:07:35 -07:00
|
|
|
|
|
|
|
-- cancelling search resets to the old search term
|
|
|
|
feed('<esc>')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the first line │the first line |
|
|
|
|
in a {2:^lit}tle file │in a {2:lit}tle file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2017-10-30 01:07:35 -07:00
|
|
|
|
|
|
|
|
]])
|
2018-02-01 15:25:55 -07:00
|
|
|
eq('lit', eval('@/'))
|
2017-11-03 00:42:26 -07:00
|
|
|
|
|
|
|
-- cancelling inc search restores the hl state
|
|
|
|
feed(':noh<cr>')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the first line │the first line |
|
|
|
|
in a ^little file │in a little file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2017-11-03 00:42:26 -07:00
|
|
|
:noh |
|
|
|
|
]])
|
|
|
|
|
|
|
|
feed('/first')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the {3:first} line │the {2:first} line |
|
|
|
|
in a little file │in a little file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2017-11-03 00:42:26 -07:00
|
|
|
/first^ |
|
|
|
|
]])
|
|
|
|
feed('<esc>')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the first line │the first line |
|
|
|
|
in a ^little file │in a little file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2017-11-03 00:42:26 -07:00
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
|
|
|
-- test that pressing C-g in an empty command line does not move the cursor
|
2022-07-15 01:58:35 -07:00
|
|
|
feed('gg0')
|
|
|
|
command([[let @/ = 'i']])
|
|
|
|
-- moves to next match of previous search pattern, just like /<cr>
|
|
|
|
feed('/<c-g><cr>')
|
2024-01-12 10:59:57 -07:00
|
|
|
eq({ 0, 1, 6, 0 }, fn.getpos('.'))
|
2022-07-15 01:58:35 -07:00
|
|
|
-- moves to next match of previous search pattern, just like /<cr>
|
|
|
|
feed('/<cr>')
|
2024-01-12 10:59:57 -07:00
|
|
|
eq({ 0, 1, 12, 0 }, fn.getpos('.'))
|
2022-07-15 01:58:35 -07:00
|
|
|
-- moves to next match of previous search pattern, just like /<cr>
|
|
|
|
feed('/<c-t><cr>')
|
2024-01-12 10:59:57 -07:00
|
|
|
eq({ 0, 2, 1, 0 }, fn.getpos('.'))
|
2018-01-21 05:09:17 -07:00
|
|
|
|
|
|
|
-- 8.0.1304, test that C-g and C-t works with incsearch and empty pattern
|
|
|
|
feed('<esc>/fi<CR>')
|
2022-07-15 01:58:35 -07:00
|
|
|
screen:expect([[
|
|
|
|
the {2:fi}rst line │the {2:fi}rst line |
|
|
|
|
in a little {2:^fi}le │in a little {2:fi}le |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2022-07-15 01:58:35 -07:00
|
|
|
/fi |
|
|
|
|
]])
|
2018-01-21 05:09:17 -07:00
|
|
|
feed('//')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the {3:fi}rst line │the {2:fi}rst line |
|
|
|
|
in a little {2:fi}le │in a little {2:fi}le |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2018-01-21 05:09:17 -07:00
|
|
|
//^ |
|
|
|
|
]])
|
|
|
|
feed('<C-g>')
|
|
|
|
screen:expect([[
|
2022-07-15 01:58:35 -07:00
|
|
|
the {2:fi}rst line │the {2:fi}rst line |
|
|
|
|
in a little {3:fi}le │in a little {2:fi}le |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2018-01-21 05:09:17 -07:00
|
|
|
//^ |
|
|
|
|
]])
|
2023-02-11 03:44:06 -07:00
|
|
|
feed('<Esc>')
|
|
|
|
|
|
|
|
-- incsearch works after c_CTRL-R_CTRL-R
|
|
|
|
command('let @" = "file"')
|
|
|
|
feed('/<C-R><C-R>"')
|
|
|
|
screen:expect([[
|
|
|
|
the first line │the first line |
|
|
|
|
in a little {3:file} │in a little {2:file} |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2023-02-11 03:44:06 -07:00
|
|
|
/file^ |
|
|
|
|
]])
|
2023-05-29 16:18:12 -07:00
|
|
|
feed('<Esc>')
|
|
|
|
|
|
|
|
command('set rtp^=test/functional/fixtures')
|
|
|
|
-- incsearch works after c_CTRL-R inserts clipboard register
|
|
|
|
|
|
|
|
command('let @* = "first"')
|
|
|
|
feed('/<C-R>*')
|
|
|
|
screen:expect([[
|
|
|
|
the {3:first} line │the {2:first} line |
|
|
|
|
in a little file │in a little file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2023-05-29 16:18:12 -07:00
|
|
|
/first^ |
|
|
|
|
]])
|
|
|
|
feed('<Esc>')
|
|
|
|
|
|
|
|
command('let @+ = "little"')
|
|
|
|
feed('/<C-R>+')
|
|
|
|
screen:expect([[
|
|
|
|
the first line │the first line |
|
|
|
|
in a {3:little} file │in a {2:little} file |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }│{1:~ }|*4
|
2023-05-29 16:18:12 -07:00
|
|
|
/little^ |
|
|
|
|
]])
|
|
|
|
feed('<Esc>')
|
2015-02-02 10:23:49 -07:00
|
|
|
end)
|
|
|
|
|
2015-04-25 03:14:49 -07:00
|
|
|
it('works with incsearch and offset', function()
|
2017-04-08 14:12:26 -07:00
|
|
|
feed_command('set hlsearch')
|
|
|
|
feed_command('set incsearch')
|
2015-04-25 03:14:49 -07:00
|
|
|
insert([[
|
|
|
|
not the match you're looking for
|
|
|
|
the match is here]])
|
|
|
|
|
|
|
|
feed('gg/mat/e')
|
|
|
|
screen:expect([[
|
2016-08-09 05:05:08 -07:00
|
|
|
not the {3:mat}ch you're looking for |
|
2017-10-30 01:07:35 -07:00
|
|
|
the {2:mat}ch is here |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*4
|
2015-04-25 03:14:49 -07:00
|
|
|
/mat/e^ |
|
|
|
|
]])
|
|
|
|
|
|
|
|
-- Search with count and /e offset fixed in Vim patch 7.4.532.
|
|
|
|
feed('<esc>2/mat/e')
|
|
|
|
screen:expect([[
|
2017-10-30 01:07:35 -07:00
|
|
|
not the {2:mat}ch you're looking for |
|
2016-08-09 05:05:08 -07:00
|
|
|
the {3:mat}ch is here |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*4
|
2015-04-25 03:14:49 -07:00
|
|
|
/mat/e^ |
|
|
|
|
]])
|
|
|
|
|
|
|
|
feed('<cr>')
|
|
|
|
screen:expect([[
|
2016-08-09 05:05:08 -07:00
|
|
|
not the {2:mat}ch you're looking for |
|
|
|
|
the {2:ma^t}ch is here |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*4
|
2015-04-25 03:14:49 -07:00
|
|
|
/mat/e |
|
|
|
|
]])
|
|
|
|
end)
|
|
|
|
|
2015-02-02 10:23:49 -07:00
|
|
|
it('works with multiline regexps', function()
|
2017-04-08 14:12:26 -07:00
|
|
|
feed_command('set hlsearch')
|
2015-02-02 10:23:49 -07:00
|
|
|
feed('4oa repeated line<esc>')
|
|
|
|
feed('/line\\na<cr>')
|
|
|
|
screen:expect([[
|
|
|
|
|
|
2022-10-01 06:29:54 -07:00
|
|
|
a repeated {2:^line } |
|
2023-12-09 05:42:00 -07:00
|
|
|
{2:a} repeated {2:line } |*2
|
2016-08-09 05:05:08 -07:00
|
|
|
{2:a} repeated line |
|
|
|
|
{1:~ }|
|
|
|
|
{4:search hit BOTTOM, continuing at TOP} |
|
2015-02-02 10:23:49 -07:00
|
|
|
]])
|
|
|
|
|
|
|
|
-- it redraws rows above the changed one
|
|
|
|
feed('4Grb')
|
|
|
|
screen:expect([[
|
|
|
|
|
|
2022-10-01 06:29:54 -07:00
|
|
|
a repeated {2:line } |
|
2016-08-09 05:05:08 -07:00
|
|
|
{2:a} repeated line |
|
2022-10-01 06:29:54 -07:00
|
|
|
^b repeated {2:line } |
|
2016-08-09 05:05:08 -07:00
|
|
|
{2:a} repeated line |
|
|
|
|
{1:~ }|
|
|
|
|
{4:search hit BOTTOM, continuing at TOP} |
|
2015-02-02 10:23:49 -07:00
|
|
|
]])
|
|
|
|
end)
|
|
|
|
|
|
|
|
it('works with matchadd and syntax', function()
|
2022-05-21 14:07:34 -07:00
|
|
|
screen:set_default_attr_ids {
|
|
|
|
[1] = { bold = true, foreground = Screen.colors.Blue },
|
2023-02-11 03:44:06 -07:00
|
|
|
[2] = { background = Screen.colors.Yellow },
|
2022-05-21 14:07:34 -07:00
|
|
|
[3] = { reverse = true },
|
2023-02-11 03:44:06 -07:00
|
|
|
[4] = { foreground = Screen.colors.Red },
|
|
|
|
[5] = { bold = true, background = Screen.colors.Green },
|
|
|
|
[6] = { italic = true, background = Screen.colors.Magenta },
|
|
|
|
[7] = { bold = true, background = Screen.colors.Yellow },
|
2022-05-21 14:07:34 -07:00
|
|
|
[8] = { foreground = Screen.colors.Blue4, background = Screen.colors.LightGray },
|
|
|
|
}
|
2017-04-08 14:12:26 -07:00
|
|
|
feed_command('set hlsearch')
|
2022-05-21 14:07:34 -07:00
|
|
|
insert [[
|
2015-02-02 10:23:49 -07:00
|
|
|
very special text
|
2022-05-21 14:07:34 -07:00
|
|
|
]]
|
2017-04-08 14:12:26 -07:00
|
|
|
feed_command('syntax on')
|
|
|
|
feed_command('highlight MyGroup guibg=Green gui=bold')
|
|
|
|
feed_command('highlight MyGroup2 guibg=Magenta gui=italic')
|
|
|
|
feed_command("call matchadd('MyGroup', 'special')")
|
|
|
|
feed_command("call matchadd('MyGroup2', 'text', 0)")
|
2015-02-02 10:23:49 -07:00
|
|
|
|
2019-11-26 05:15:14 -07:00
|
|
|
-- searchhl and matchadd matches are exclusive, only the highest priority
|
2015-02-02 10:23:49 -07:00
|
|
|
-- is used (and matches with lower priorities are not combined)
|
2017-04-08 14:12:26 -07:00
|
|
|
feed_command('/ial te')
|
2022-05-21 14:07:34 -07:00
|
|
|
screen:expect {
|
|
|
|
grid = [[
|
2016-08-09 05:05:08 -07:00
|
|
|
very {5:spec^ial}{2: te}{6:xt} |
|
2015-02-02 10:23:49 -07:00
|
|
|
|
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*4
|
2016-08-09 05:05:08 -07:00
|
|
|
{4:search hit BOTTOM, continuing at TOP} |
|
2022-05-21 14:07:34 -07:00
|
|
|
]],
|
|
|
|
win_viewport = {
|
2023-03-12 15:58:46 -07:00
|
|
|
[2] = {
|
2024-01-16 06:26:21 -07:00
|
|
|
win = 1000,
|
2023-03-12 15:58:46 -07:00
|
|
|
topline = 0,
|
|
|
|
botline = 3,
|
|
|
|
curline = 0,
|
|
|
|
curcol = 11,
|
|
|
|
linecount = 2,
|
|
|
|
sum_scroll_delta = 0,
|
2024-01-02 18:09:18 -07:00
|
|
|
},
|
|
|
|
},
|
2022-05-21 14:07:34 -07:00
|
|
|
}
|
2015-02-02 10:23:49 -07:00
|
|
|
|
2020-12-30 15:31:05 -07:00
|
|
|
-- check highlights work also in folds
|
|
|
|
feed('zf4j')
|
2022-05-21 14:07:34 -07:00
|
|
|
screen:expect {
|
|
|
|
grid = [[
|
|
|
|
{8:^+-- 2 lines: very special text·········}|
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*5
|
2022-05-21 14:07:34 -07:00
|
|
|
{4:search hit BOTTOM, continuing at TOP} |
|
|
|
|
]],
|
|
|
|
}
|
2020-12-30 15:31:05 -07:00
|
|
|
command('%foldopen')
|
2020-12-31 13:38:45 -07:00
|
|
|
screen:expect([[
|
|
|
|
very {5:spec^ial}{2: te}{6:xt} |
|
|
|
|
|
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*4
|
2020-12-31 13:38:45 -07:00
|
|
|
{4:search hit BOTTOM, continuing at TOP} |
|
|
|
|
]])
|
2020-12-30 15:31:05 -07:00
|
|
|
|
2017-04-08 14:12:26 -07:00
|
|
|
feed_command('call clearmatches()')
|
2015-02-02 10:23:49 -07:00
|
|
|
screen:expect([[
|
2016-08-09 05:05:08 -07:00
|
|
|
very spec{2:^ial te}xt |
|
2015-02-02 10:23:49 -07:00
|
|
|
|
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*4
|
2015-02-02 10:23:49 -07:00
|
|
|
:call clearmatches() |
|
|
|
|
]])
|
|
|
|
|
|
|
|
-- searchhl has priority over syntax, but in this case
|
|
|
|
-- nonconflicting attributes are combined
|
2017-04-08 14:12:26 -07:00
|
|
|
feed_command('syntax keyword MyGroup special')
|
2015-02-02 10:23:49 -07:00
|
|
|
screen:expect([[
|
2016-08-09 05:05:08 -07:00
|
|
|
very {5:spec}{7:^ial}{2: te}xt |
|
2015-02-02 10:23:49 -07:00
|
|
|
|
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*4
|
2015-02-02 10:23:49 -07:00
|
|
|
:syntax keyword MyGroup special |
|
2016-08-09 05:05:08 -07:00
|
|
|
]])
|
2021-04-04 11:43:22 -07:00
|
|
|
end)
|
2015-02-02 10:23:49 -07:00
|
|
|
|
2021-04-04 11:43:22 -07:00
|
|
|
it('highlights entire pattern on :%g@a/b', function()
|
|
|
|
command('set inccommand=nosplit')
|
|
|
|
feed('ia/b/c<Esc>')
|
|
|
|
feed(':%g@a/b')
|
|
|
|
screen:expect([[
|
|
|
|
{3:a/b}/c |
|
2023-12-09 05:42:00 -07:00
|
|
|
{1:~ }|*5
|
2021-04-04 11:43:22 -07:00
|
|
|
:%g@a/b^ |
|
|
|
|
]])
|
2015-02-02 10:23:49 -07:00
|
|
|
end)
|
2024-03-20 06:59:04 -07:00
|
|
|
|
|
|
|
it('incsearch is still visible after :redraw from K_EVENT', function()
|
|
|
|
fn.setline(1, { 'foo', 'bar' })
|
|
|
|
feed('/foo<CR>/bar')
|
|
|
|
screen:expect([[
|
|
|
|
foo |
|
|
|
|
{3:bar} |
|
|
|
|
{1:~ }|*4
|
|
|
|
/bar^ |
|
|
|
|
]])
|
|
|
|
command('redraw!')
|
|
|
|
-- There is an intermediate state where :redraw! removes 'incsearch' highlight.
|
|
|
|
screen:expect_unchanged(true)
|
|
|
|
end)
|
2015-02-02 10:23:49 -07:00
|
|
|
end)
|