aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/autoload/remote/define.vim6
-rw-r--r--runtime/doc/autocmd.txt4
-rw-r--r--runtime/doc/vim_diff.txt1
-rw-r--r--runtime/lua/vim/lsp/handlers.lua4
-rw-r--r--src/nvim/auevents.lua1
-rw-r--r--src/nvim/search.c4
-rw-r--r--test/functional/autocmd/searchwrapped_spec.lua53
7 files changed, 70 insertions, 3 deletions
diff --git a/runtime/autoload/remote/define.vim b/runtime/autoload/remote/define.vim
index 2aec96e365..82e5164d85 100644
--- a/runtime/autoload/remote/define.vim
+++ b/runtime/autoload/remote/define.vim
@@ -240,7 +240,11 @@ function! s:GetAutocmdPrefix(name, opts)
endif
if has_key(a:opts, 'nested') && a:opts.nested
- call add(rv, 'nested')
+ call add(rv, '++nested')
+ endif
+
+ if has_key(a:opts, 'once') && a:opts.once
+ call add(rv, '++once')
endif
return join(rv, ' ')
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index 879a34bcaa..242631d98c 100644
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -824,6 +824,10 @@ RemoteReply When a reply from a Vim that functions as
Note that even if an autocommand is defined,
the reply should be read with |remote_read()|
to consume it.
+ *SearchWrapped*
+SearchWrapped After making a search with |n| or |N| if the
+ search wraps around the document back to
+ the start/finish respectively.
*SessionLoadPost*
SessionLoadPost After loading the session file created using
the |:mksession| command.
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index 956cb3e624..bc59ea785e 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -180,6 +180,7 @@ Commands:
|:match| can be invoked before highlight group is defined
Events:
+ |SearchWrapped|
|Signal|
|TabNewEntered|
|TermClose|
diff --git a/runtime/lua/vim/lsp/handlers.lua b/runtime/lua/vim/lsp/handlers.lua
index 22089aaaa6..c974d1a6b4 100644
--- a/runtime/lua/vim/lsp/handlers.lua
+++ b/runtime/lua/vim/lsp/handlers.lua
@@ -285,7 +285,7 @@ local function location_handler(_, result, ctx, _)
util.jump_to_location(result[1])
if #result > 1 then
- util.set_qflist(util.locations_to_items(result))
+ vim.fn.setqflist({}, ' ', {title = 'LSP locations', items = util.locations_to_items(result)})
api.nvim_command("copen")
end
else
@@ -379,7 +379,7 @@ local make_call_hierarchy_handler = function(direction)
})
end
end
- util.set_qflist(items)
+ vim.fn.setqflist({}, ' ', {title = 'LSP call hierarchy', items = items})
api.nvim_command("copen")
end
end
diff --git a/src/nvim/auevents.lua b/src/nvim/auevents.lua
index 1daae85c5e..6227b08b26 100644
--- a/src/nvim/auevents.lua
+++ b/src/nvim/auevents.lua
@@ -76,6 +76,7 @@ return {
'QuickFixCmdPre', -- before :make, :grep etc.
'QuitPre', -- before :quit
'RemoteReply', -- upon string reception from a remote vim
+ 'SearchWrapped', -- after the search wrapped around
'SessionLoadPost', -- after loading a session file
'ShellCmdPost', -- after ":!cmd"
'ShellFilterPost', -- after ":1,2!cmd", ":w !cmd", ":r !cmd".
diff --git a/src/nvim/search.c b/src/nvim/search.c
index 3a8b72e4f9..906c9a6f47 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -1354,6 +1354,10 @@ int do_search(oparg_T *oap, int dirc, int search_delim, char_u *pat, long count,
}
retval = 1; // pattern found
+ if (sia && sia->sa_wrapped) {
+ apply_autocmds(EVENT_SEARCHWRAPPED, NULL, NULL, false, NULL);
+ }
+
/*
* Add character and/or line offset
*/
diff --git a/test/functional/autocmd/searchwrapped_spec.lua b/test/functional/autocmd/searchwrapped_spec.lua
new file mode 100644
index 0000000000..46c2c99b3d
--- /dev/null
+++ b/test/functional/autocmd/searchwrapped_spec.lua
@@ -0,0 +1,53 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local command = helpers.command
+local curbufmeths = helpers.curbufmeths
+local eq = helpers.eq
+local eval = helpers.eval
+local feed = helpers.feed
+
+describe('autocmd SearchWrapped', function()
+ before_each(function()
+ clear()
+ command('set ignorecase')
+ command('let g:test = 0')
+ command('autocmd! SearchWrapped * let g:test += 1')
+ curbufmeths.set_lines(0, 1, false, {
+ 'The quick brown fox',
+ 'jumps over the lazy dog'})
+ end)
+
+ it('gets triggered when search wraps the end', function()
+ feed('/the<Return>')
+ eq(0, eval('g:test'))
+
+ feed('n')
+ eq(1, eval('g:test'))
+
+ feed('nn')
+ eq(2, eval('g:test'))
+ end)
+
+ it('gets triggered when search wraps in reverse order', function()
+ feed('/the<Return>')
+ eq(0, eval('g:test'))
+
+ feed('NN')
+ eq(1, eval('g:test'))
+
+ feed('NN')
+ eq(2, eval('g:test'))
+ end)
+
+ it('does not get triggered on failed searches', function()
+ feed('/blargh<Return>')
+ eq(0, eval('g:test'))
+
+ feed('NN')
+ eq(0, eval('g:test'))
+
+ feed('NN')
+ eq(0, eval('g:test'))
+ end)
+end)