diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-07-26 20:43:40 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-07-26 20:43:40 +0200 |
commit | e99e84497b89e5f91df519790802770920ecf4fe (patch) | |
tree | 00b7113a373bf2346efb361cd36aced5ecf3ccdd /src/fileio.c | |
parent | 45a249513f5ed2de0a6f6b5cb6e32015e35644be (diff) | |
download | vim-git-e99e84497b89e5f91df519790802770920ecf4fe.tar.gz |
patch 7.4.2103v7.4.2103
Problem: Can't have "augroup END" right after ":au!".
Solution: Check for the bar character before the command argument.
Diffstat (limited to 'src/fileio.c')
-rw-r--r-- | src/fileio.c | 120 |
1 files changed, 69 insertions, 51 deletions
diff --git a/src/fileio.c b/src/fileio.c index c4066173d..4542f6a19 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -8100,8 +8100,8 @@ event_name2nr(char_u *start, char_u **end) int i; int len; - /* the event name ends with end of line, a blank or a comma */ - for (p = start; *p && !vim_iswhite(*p) && *p != ','; ++p) + /* the event name ends with end of line, '|', a blank or a comma */ + for (p = start; *p && !vim_iswhite(*p) && *p != ',' && *p != '|'; ++p) ; for (i = 0; event_names[i].name != NULL; ++i) { @@ -8153,7 +8153,7 @@ find_end_event( } 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) { @@ -8286,8 +8286,9 @@ au_event_restore(char_u *old_ei) * Mostly a {group} argument can optionally appear before <event>. */ 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 *envpat = NULL; char_u *cmd; @@ -8296,12 +8297,20 @@ do_autocmd(char_u *arg, int forceit) int nested = FALSE; int group; - /* - * Check for a legal group name. If not, use AUGROUP_ALL. - */ - group = au_get_grouparg(&arg); - if (arg == NULL) /* out of memory */ - return; + 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. + */ + group = au_get_grouparg(&arg); + if (arg == NULL) /* out of memory */ + return; + } /* * Scan over the events. @@ -8311,53 +8320,61 @@ do_autocmd(char_u *arg, int forceit) if (pat == NULL) return; - /* - * Scan over the pattern. Put a NUL at the end. - */ pat = skipwhite(pat); - cmd = pat; - while (*cmd && (!vim_iswhite(*cmd) || cmd[-1] == '\\')) - cmd++; - if (*cmd) - *cmd++ = NUL; - - /* Expand environment variables in the pattern. Set 'shellslash', we want - * forward slashes here. */ - if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL) + if (*pat == '|') { + pat = (char_u *)""; + cmd = (char_u *)""; + } + else + { + /* + * Scan over the pattern. Put a NUL at the end. + */ + cmd = pat; + while (*cmd && (!vim_iswhite(*cmd) || cmd[-1] == '\\')) + cmd++; + if (*cmd) + *cmd++ = NUL; + + /* Expand environment variables in the pattern. Set 'shellslash', we want + * forward slashes here. */ + if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL) + { #ifdef BACKSLASH_IN_FILENAME - int p_ssl_save = p_ssl; + int p_ssl_save = p_ssl; - p_ssl = TRUE; + p_ssl = TRUE; #endif - envpat = expand_env_save(pat); + envpat = expand_env_save(pat); #ifdef BACKSLASH_IN_FILENAME - p_ssl = p_ssl_save; + p_ssl = p_ssl_save; #endif - if (envpat != NULL) - pat = envpat; - } + if (envpat != NULL) + pat = envpat; + } - /* - * Check for "nested" flag. - */ - cmd = skipwhite(cmd); - if (*cmd != NUL && STRNCMP(cmd, "nested", 6) == 0 && vim_iswhite(cmd[6])) - { - nested = TRUE; - cmd = skipwhite(cmd + 6); - } + /* + * Check for "nested" flag. + */ + cmd = skipwhite(cmd); + if (*cmd != NUL && STRNCMP(cmd, "nested", 6) == 0 && vim_iswhite(cmd[6])) + { + nested = TRUE; + cmd = skipwhite(cmd + 6); + } - /* - * Find the start of the commands. - * Expand <sfile> in it. - */ - if (*cmd != NUL) - { - cmd = expand_sfile(cmd); - if (cmd == NULL) /* some error */ - return; - need_free = TRUE; + /* + * Find the start of the commands. + * Expand <sfile> in it. + */ + if (*cmd != NUL) + { + cmd = expand_sfile(cmd); + if (cmd == NULL) /* some error */ + return; + need_free = TRUE; + } } /* @@ -8374,7 +8391,7 @@ do_autocmd(char_u *arg, int forceit) */ last_event = (event_T)-1; /* for listing the event 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; event = (event_T)((int)event + 1)) @@ -8384,7 +8401,7 @@ do_autocmd(char_u *arg, int forceit) } else { - while (*arg && !vim_iswhite(*arg)) + while (*arg && *arg != '|' && !vim_iswhite(*arg)) if (do_autocmd_event(event_name2nr(arg, &arg), pat, nested, cmd, forceit, group) == FAIL) break; @@ -8409,7 +8426,8 @@ au_get_grouparg(char_u **argp) char_u *arg = *argp; int group = AUGROUP_ALL; - p = skiptowhite(arg); + for (p = arg; *p && !vim_iswhite(*p) && *p != '|'; ++p) + ; if (p > arg) { group_name = vim_strnsave(arg, (int)(p - arg)); |