aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlejandro Exojo <suy@badopi.org>2021-12-10 20:28:25 +0100
committerGitHub <noreply@github.com>2021-12-10 12:28:25 -0700
commit8ad60154099678b23b78bc8142a168753f53648c (patch)
treef58cea0e3ce1643d43f0966416e95f9f2c6d73bd
parent22d7dd2aec9053028cc033e4c68335a81f845e06 (diff)
downloadrneovim-8ad60154099678b23b78bc8142a168753f53648c.tar.gz
rneovim-8ad60154099678b23b78bc8142a168753f53648c.tar.bz2
rneovim-8ad60154099678b23b78bc8142a168753f53648c.zip
feat: add autocommand event when search wraps around (#8487)
-rw-r--r--runtime/doc/autocmd.txt4
-rw-r--r--src/nvim/auevents.lua1
-rw-r--r--src/nvim/search.c4
-rw-r--r--test/functional/autocmd/searchwrapped_spec.lua53
4 files changed, 62 insertions, 0 deletions
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/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 f45d709b91..f454a0122c 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)