autocmd: rename "once" => "-once" #9713

- Rename "nested" to "-nested", but continue to support "nested" for
  backwards-compatibility.
- Allow any order: "-once -nested" or "-nested -once".

ref https://github.com/neovim/neovim/pull/9706#issuecomment-471295747
This commit is contained in:
Justin M. Keyes 2019-03-11 21:01:47 +01:00 committed by GitHub
parent 3b63374b33
commit 9312e2d06a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 45 additions and 42 deletions

View File

@ -40,7 +40,7 @@ effects. Be careful not to destroy your text.
2. Defining autocommands *autocmd-define*
*:au* *:autocmd*
:au[tocmd] [group] {event} {pat} [once] [nested] {cmd}
:au[tocmd] [group] {event} {pat} [-once] [-nested] {cmd}
Add {cmd} to the list of commands that Vim will
execute automatically on {event} for a file matching
{pat} |autocmd-patterns|.
@ -48,9 +48,9 @@ effects. Be careful not to destroy your text.
:autocmd and won't start a comment.
Nvim always adds {cmd} after existing autocommands so
they execute in the order in which they were defined.
See |autocmd-nested| for [nested].
See |autocmd-nested| for [-nested].
*autocmd-once*
If [once] is supplied the command is executed once,
If [-once] is supplied the command is executed once,
then removed ("one shot").
The special pattern <buffer> or <buffer=N> defines a buffer-local autocommand.
@ -119,11 +119,11 @@ prompt. When one command outputs two messages this can happen anyway.
==============================================================================
3. Removing autocommands *autocmd-remove*
:au[tocmd]! [group] {event} {pat} [once] [nested] {cmd}
:au[tocmd]! [group] {event} {pat} [-once] [-nested] {cmd}
Remove all autocommands associated with {event} and
{pat}, and add the command {cmd}.
See |autocmd-once| for [once].
See |autocmd-nested| for [nested].
See |autocmd-once| for [-once].
See |autocmd-nested| for [-nested].
:au[tocmd]! [group] {event} {pat}
Remove all autocommands associated with {event} and
@ -1442,9 +1442,9 @@ instead of ":q!".
*autocmd-nested* *E218*
By default, autocommands do not nest. If you use ":e" or ":w" in an
autocommand, Vim does not execute the BufRead and BufWrite autocommands for
those commands. If you do want this, use the "nested" flag for those commands
in which you want nesting. For example: >
:autocmd FileChangedShell *.c nested e!
those commands. If you do want this, use the "-nested" flag for those
commands in which you want nesting. For example: >
:autocmd FileChangedShell *.c -nested e!
The nesting is limited to 10 levels to get out of recursive loops.
It's possible to use the ":au" command in an autocommand. This can be a

View File

@ -35,7 +35,7 @@ There are 3 ways to create a terminal buffer:
<
Note: The "term://" pattern is handled by a BufReadCmd handler, so the
|autocmd-nested| modifier is required to use it in an autocmd. >
autocmd VimEnter * nested split term://sh
autocmd VimEnter * -nested split term://sh
< This is only mentioned for reference; use |:terminal| instead.
When the terminal starts, the buffer contents are updated and the buffer is

View File

@ -453,15 +453,15 @@ matching BufWritePre autocommands and executes them, and then it
performs the ":write".
The general form of the :autocmd command is as follows: >
:autocmd [group] {events} {file_pattern} [nested] {command}
:autocmd [group] {events} {file_pattern} [-nested] {command}
The [group] name is optional. It is used in managing and calling the commands
(more on this later). The {events} parameter is a list of events (comma
separated) that trigger the command.
{file_pattern} is a filename, usually with wildcards. For example, using
"*.txt" makes the autocommand be used for all files whose name end in ".txt".
The optional [nested] flag allows for nesting of autocommands (see below), and
finally, {command} is the command to be executed.
The optional [-nested] flag allows for nesting of autocommands (see below),
and finally, {command} is the command to be executed.
EVENTS
@ -576,9 +576,9 @@ NESTING
Generally, commands executed as the result of an autocommand event will not
trigger any new events. If you read a file in response to a FileChangedShell
event, it will not trigger the autocommands that would set the syntax, for
example. To make the events triggered, add the "nested" argument: >
example. To make the events triggered, add the "-nested" flag: >
:autocmd FileChangedShell * nested edit
:autocmd FileChangedShell * -nested edit
EXECUTING AUTOCOMMANDS

View File

@ -880,15 +880,15 @@ CTRL-W g } *CTRL-W_g}*
cursor. This is less clever than using |:ptag|, but you don't
need a tags file and it will also find matches in system
include files. Example: >
:au! CursorHold *.[ch] nested exe "silent! psearch " . expand("<cword>")
:au! CursorHold *.[ch] -nested exe "silent! psearch " . expand("<cword>")
< Warning: This can be slow.
Example *CursorHold-example* >
:au! CursorHold *.[ch] nested exe "silent! ptag " . expand("<cword>")
:au! CursorHold *.[ch] -nested exe "silent! ptag " . expand("<cword>")
This will cause a ":ptag" to be executed for the keyword under the cursor,
when the cursor hasn't moved for the time set with 'updatetime'. The "nested"
when the cursor hasn't moved for the time set with 'updatetime'. "-nested"
makes other autocommands be executed, so that syntax highlighting works in the
preview window. The "silent!" avoids an error message when the tag could not
be found. Also see |CursorHold|. To disable this again: >
@ -898,7 +898,7 @@ be found. Also see |CursorHold|. To disable this again: >
A nice addition is to highlight the found tag, avoid the ":ptag" when there
is no word under the cursor, and a few other things: >
:au! CursorHold *.[ch] nested call PreviewWord()
:au! CursorHold *.[ch] -nested call PreviewWord()
:func PreviewWord()
: if &previewwindow " don't do this in the preview window
: return

View File

@ -6047,20 +6047,23 @@ void do_autocmd(char_u *arg_in, int forceit)
}
}
// Check for "once" flag.
cmd = skipwhite(cmd);
if (*cmd != NUL && STRNCMP(cmd, "once", 4) == 0
&& ascii_iswhite(cmd[4])) {
once = true;
cmd = skipwhite(cmd + 4);
}
// Check for "nested" flag.
cmd = skipwhite(cmd);
if (*cmd != NUL && STRNCMP(cmd, "nested", 6) == 0
&& ascii_iswhite(cmd[6])) {
nested = true;
cmd = skipwhite(cmd + 6);
for (size_t i = 0; i < 2; i++) {
if (*cmd != NUL) {
// Check for "-once" flag.
if (!once && STRNCMP(cmd, "-once", 5) == 0 && ascii_iswhite(cmd[5])) {
once = true;
cmd = skipwhite(cmd + 5);
}
// Check for "-nested" flag.
if (!nested
&& ((STRNCMP(cmd, "-nested", 7) == 0 && ascii_iswhite(cmd[7]))
// Deprecated form (without "-").
|| (STRNCMP(cmd, "nested", 6) == 0 && ascii_iswhite(cmd[6])))) {
nested = true;
cmd = skipwhite(cmd + ('-' == cmd[0] ? 7 : 6));
}
}
}
// Find the start of the commands.

View File

@ -59,9 +59,9 @@ describe('autocmd', function()
end)
end)
it('once', function() -- :help autocmd-once
it('-once', function() -- :help autocmd-once
--
-- ":autocmd ... once" executes its handler once, then removes the handler.
-- ":autocmd ... -once" executes its handler once, then removes the handler.
--
local expected = {
'Many1',
@ -76,10 +76,10 @@ describe('autocmd', function()
}
command('let g:foo = []')
command('autocmd TabNew * :call add(g:foo, "Many1")')
command('autocmd TabNew * once :call add(g:foo, "Once1")')
command('autocmd TabNew * once :call add(g:foo, "Once2")')
command('autocmd TabNew * -once :call add(g:foo, "Once1")')
command('autocmd TabNew * -once :call add(g:foo, "Once2")')
command('autocmd TabNew * :call add(g:foo, "Many2")')
command('autocmd TabNew * once :call add(g:foo, "Once3")')
command('autocmd TabNew * -once :call add(g:foo, "Once3")')
eq(dedent([[
--- Autocommands ---
@ -103,25 +103,25 @@ describe('autocmd', function()
funcs.execute('autocmd Tabnew'))
--
-- ":autocmd ... once" handlers can be deleted.
-- ":autocmd ... -once" handlers can be deleted.
--
expected = {}
command('let g:foo = []')
command('autocmd TabNew * once :call add(g:foo, "Once1")')
command('autocmd TabNew * -once :call add(g:foo, "Once1")')
command('autocmd! TabNew')
command('tabnew')
eq(expected, eval('g:foo'))
--
-- ":autocmd ... <buffer> once nested"
-- ":autocmd ... <buffer> -once -nested"
--
expected = {
'OptionSet-Once',
'CursorMoved-Once',
}
command('let g:foo = []')
command('autocmd OptionSet binary once nested :call add(g:foo, "OptionSet-Once")')
command('autocmd CursorMoved <buffer> once nested setlocal binary|:call add(g:foo, "CursorMoved-Once")')
command('autocmd OptionSet binary -nested -once :call add(g:foo, "OptionSet-Once")')
command('autocmd CursorMoved <buffer> -once -nested setlocal binary|:call add(g:foo, "CursorMoved-Once")')
command("put ='foo bar baz'")
feed('0llhlh')
eq(expected, eval('g:foo'))