1
0
forked from aniani/vim

patch 7.4.2103

Problem:    Can't have "augroup END" right after ":au!".
Solution:   Check for the bar character before the command argument.
This commit is contained in:
Bram Moolenaar
2016-07-26 20:43:40 +02:00
parent 45a249513f
commit e99e84497b
4 changed files with 112 additions and 58 deletions

View File

@@ -52,9 +52,6 @@ effects. Be careful not to destroy your text.
============================================================================== ==============================================================================
2. Defining autocommands *autocmd-define* 2. Defining autocommands *autocmd-define*
Note: The ":autocmd" command cannot be followed by another command, since any
'|' is considered part of the command.
*:au* *:autocmd* *:au* *:autocmd*
:au[tocmd] [group] {event} {pat} [nested] {cmd} :au[tocmd] [group] {event} {pat} [nested] {cmd}
Add {cmd} to the list of commands that Vim will Add {cmd} to the list of commands that Vim will
@@ -67,6 +64,12 @@ Note: The ":autocmd" command cannot be followed by another command, since any
The special pattern <buffer> or <buffer=N> defines a buffer-local autocommand. The special pattern <buffer> or <buffer=N> defines a buffer-local autocommand.
See |autocmd-buflocal|. See |autocmd-buflocal|.
Note: The ":autocmd" command can only be followed by another command when the
'|' appears before {cmd}. This works: >
:augroup mine | au! BufRead | augroup END
But this sees "augroup" as part of the defined command: >
:augroup mine | au BufRead * set tw=70 | augroup END
Note that special characters (e.g., "%", "<cword>") in the ":autocmd" Note that special characters (e.g., "%", "<cword>") in the ":autocmd"
arguments are not expanded when the autocommand is defined. These will be arguments are not expanded when the autocommand is defined. These will be
expanded when the Event is recognized, and the {cmd} is executed. The only expanded when the Event is recognized, and the {cmd} is executed. The only

View File

@@ -8100,8 +8100,8 @@ event_name2nr(char_u *start, char_u **end)
int i; int i;
int len; int len;
/* the event name ends with end of line, a blank or a comma */ /* the event name ends with end of line, '|', a blank or a comma */
for (p = start; *p && !vim_iswhite(*p) && *p != ','; ++p) for (p = start; *p && !vim_iswhite(*p) && *p != ',' && *p != '|'; ++p)
; ;
for (i = 0; event_names[i].name != NULL; ++i) for (i = 0; event_names[i].name != NULL; ++i)
{ {
@@ -8153,7 +8153,7 @@ find_end_event(
} }
else else
{ {
for (pat = arg; *pat && !vim_iswhite(*pat); pat = p) for (pat = arg; *pat && *pat != '|' && !vim_iswhite(*pat); pat = p)
{ {
if ((int)event_name2nr(pat, &p) >= (int)NUM_EVENTS) if ((int)event_name2nr(pat, &p) >= (int)NUM_EVENTS)
{ {
@@ -8286,8 +8286,9 @@ au_event_restore(char_u *old_ei)
* Mostly a {group} argument can optionally appear before <event>. * Mostly a {group} argument can optionally appear before <event>.
*/ */
void void
do_autocmd(char_u *arg, int forceit) do_autocmd(char_u *arg_in, int forceit)
{ {
char_u *arg = arg_in;
char_u *pat; char_u *pat;
char_u *envpat = NULL; char_u *envpat = NULL;
char_u *cmd; char_u *cmd;
@@ -8296,12 +8297,20 @@ do_autocmd(char_u *arg, int forceit)
int nested = FALSE; int nested = FALSE;
int group; int group;
if (*arg == '|')
{
arg = (char_u *)"";
group = AUGROUP_ALL; /* no argument, use all groups */
}
else
{
/* /*
* Check for a legal group name. If not, use AUGROUP_ALL. * Check for a legal group name. If not, use AUGROUP_ALL.
*/ */
group = au_get_grouparg(&arg); group = au_get_grouparg(&arg);
if (arg == NULL) /* out of memory */ if (arg == NULL) /* out of memory */
return; return;
}
/* /*
* Scan over the events. * Scan over the events.
@@ -8311,10 +8320,17 @@ do_autocmd(char_u *arg, int forceit)
if (pat == NULL) if (pat == NULL)
return; return;
pat = skipwhite(pat);
if (*pat == '|')
{
pat = (char_u *)"";
cmd = (char_u *)"";
}
else
{
/* /*
* Scan over the pattern. Put a NUL at the end. * Scan over the pattern. Put a NUL at the end.
*/ */
pat = skipwhite(pat);
cmd = pat; cmd = pat;
while (*cmd && (!vim_iswhite(*cmd) || cmd[-1] == '\\')) while (*cmd && (!vim_iswhite(*cmd) || cmd[-1] == '\\'))
cmd++; cmd++;
@@ -8359,6 +8375,7 @@ do_autocmd(char_u *arg, int forceit)
return; return;
need_free = TRUE; need_free = TRUE;
} }
}
/* /*
* Print header when showing autocommands. * Print header when showing autocommands.
@@ -8374,7 +8391,7 @@ do_autocmd(char_u *arg, int forceit)
*/ */
last_event = (event_T)-1; /* for listing the event name */ last_event = (event_T)-1; /* for listing the event name */
last_group = AUGROUP_ERROR; /* for listing the group name */ last_group = AUGROUP_ERROR; /* for listing the group name */
if (*arg == '*' || *arg == NUL) if (*arg == '*' || *arg == NUL || *arg == '|')
{ {
for (event = (event_T)0; (int)event < (int)NUM_EVENTS; for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
event = (event_T)((int)event + 1)) event = (event_T)((int)event + 1))
@@ -8384,7 +8401,7 @@ do_autocmd(char_u *arg, int forceit)
} }
else else
{ {
while (*arg && !vim_iswhite(*arg)) while (*arg && *arg != '|' && !vim_iswhite(*arg))
if (do_autocmd_event(event_name2nr(arg, &arg), pat, if (do_autocmd_event(event_name2nr(arg, &arg), pat,
nested, cmd, forceit, group) == FAIL) nested, cmd, forceit, group) == FAIL)
break; break;
@@ -8409,7 +8426,8 @@ au_get_grouparg(char_u **argp)
char_u *arg = *argp; char_u *arg = *argp;
int group = AUGROUP_ALL; int group = AUGROUP_ALL;
p = skiptowhite(arg); for (p = arg; *p && !vim_iswhite(*p) && *p != '|'; ++p)
;
if (p > arg) if (p > arg)
{ {
group_name = vim_strnsave(arg, (int)(p - arg)); group_name = vim_strnsave(arg, (int)(p - arg));

View File

@@ -19,6 +19,7 @@ if has('timers')
call timer_start(100, 'ExitInsertMode') call timer_start(100, 'ExitInsertMode')
call feedkeys('a', 'x!') call feedkeys('a', 'x!')
call assert_equal(1, g:triggered) call assert_equal(1, g:triggered)
au! CursorHoldI
endfunc endfunc
func Test_cursorhold_insert_ctrl_x() func Test_cursorhold_insert_ctrl_x()
@@ -29,6 +30,7 @@ if has('timers')
" CursorHoldI does not trigger after CTRL-X " CursorHoldI does not trigger after CTRL-X
call feedkeys("a\<C-X>", 'x!') call feedkeys("a\<C-X>", 'x!')
call assert_equal(0, g:triggered) call assert_equal(0, g:triggered)
au! CursorHoldI
endfunc endfunc
endif endif
@@ -58,6 +60,7 @@ function Test_bufunload()
bwipeout bwipeout
call assert_equal(["bufunload", "bufdelete", "bufwipeout"], s:li) call assert_equal(["bufunload", "bufdelete", "bufwipeout"], s:li)
au! test_bufunload_group
augroup! test_bufunload_group augroup! test_bufunload_group
endfunc endfunc
@@ -120,3 +123,31 @@ func Test_win_tab_autocmd()
augroup END augroup END
unlet g:record unlet g:record
endfunc endfunc
func s:AddAnAutocmd()
augroup vimBarTest
au BufReadCmd * echo 'hello'
augroup END
call assert_equal(3, len(split(execute('au vimBarTest'), "\n")))
endfunc
func Test_early_bar()
" test that a bar is recognized before the {event}
call s:AddAnAutocmd()
augroup vimBarTest | au! | augroup END
call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
call s:AddAnAutocmd()
augroup vimBarTest| au!| augroup END
call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
" test that a bar is recognized after the {event}
call s:AddAnAutocmd()
augroup vimBarTest| au!BufReadCmd| augroup END
call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
" test that a bar is recognized after the {group}
call s:AddAnAutocmd()
au! vimBarTest|echo 'hello'
call assert_equal(1, len(split(execute('au vimBarTest'), "\n")))
endfunc

View File

@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2103,
/**/ /**/
2102, 2102,
/**/ /**/