To: vim_dev@googlegroups.com Subject: Patch 7.4.2103 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.2103 Problem: Can't have "augroup END" right after ":au!". Solution: Check for the bar character before the command argument. Files: src/fileio.c, src/testdir/test_autocmd.vim, runtime/doc/autocmd.txt *** ../vim-7.4.2102/src/fileio.c 2016-07-24 21:58:39.704057634 +0200 --- src/fileio.c 2016-07-26 20:36:53.020012452 +0200 *************** *** 8100,8107 **** 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) ; for (i = 0; event_names[i].name != NULL; ++i) { --- 8100,8107 ---- 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 != '|'; ++p) ; for (i = 0; event_names[i].name != NULL; ++i) { *************** *** 8153,8159 **** } else { ! for (pat = arg; *pat && !vim_iswhite(*pat); pat = p) { if ((int)event_name2nr(pat, &p) >= (int)NUM_EVENTS) { --- 8153,8159 ---- } else { ! for (pat = arg; *pat && *pat != '|' && !vim_iswhite(*pat); pat = p) { if ((int)event_name2nr(pat, &p) >= (int)NUM_EVENTS) { *************** *** 8286,8293 **** * Mostly a {group} argument can optionally appear before . */ void ! do_autocmd(char_u *arg, int forceit) { char_u *pat; char_u *envpat = NULL; char_u *cmd; --- 8286,8294 ---- * Mostly a {group} argument can optionally appear before . */ void ! do_autocmd(char_u *arg_in, int forceit) { + char_u *arg = arg_in; char_u *pat; char_u *envpat = NULL; char_u *cmd; *************** *** 8296,8307 **** 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; /* * Scan over the events. --- 8297,8316 ---- int nested = FALSE; 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. ! */ ! group = au_get_grouparg(&arg); ! if (arg == NULL) /* out of memory */ ! return; ! } /* * Scan over the events. *************** *** 8311,8363 **** 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) { #ifdef BACKSLASH_IN_FILENAME ! int p_ssl_save = p_ssl; ! p_ssl = TRUE; #endif ! envpat = expand_env_save(pat); #ifdef BACKSLASH_IN_FILENAME ! p_ssl = p_ssl_save; #endif ! 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); ! } ! /* ! * Find the start of the commands. ! * Expand in it. ! */ ! if (*cmd != NUL) ! { ! cmd = expand_sfile(cmd); ! if (cmd == NULL) /* some error */ ! return; ! need_free = TRUE; } /* --- 8320,8380 ---- if (pat == NULL) return; pat = skipwhite(pat); ! 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; ! p_ssl = TRUE; #endif ! envpat = expand_env_save(pat); #ifdef BACKSLASH_IN_FILENAME ! p_ssl = p_ssl_save; #endif ! 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); ! } ! /* ! * Find the start of the commands. ! * Expand in it. ! */ ! if (*cmd != NUL) ! { ! cmd = expand_sfile(cmd); ! if (cmd == NULL) /* some error */ ! return; ! need_free = TRUE; ! } } /* *************** *** 8374,8380 **** */ last_event = (event_T)-1; /* for listing the event name */ last_group = AUGROUP_ERROR; /* for listing the group name */ ! if (*arg == '*' || *arg == NUL) { for (event = (event_T)0; (int)event < (int)NUM_EVENTS; event = (event_T)((int)event + 1)) --- 8391,8397 ---- */ last_event = (event_T)-1; /* for listing the event name */ last_group = AUGROUP_ERROR; /* for listing the group name */ ! if (*arg == '*' || *arg == NUL || *arg == '|') { for (event = (event_T)0; (int)event < (int)NUM_EVENTS; event = (event_T)((int)event + 1)) *************** *** 8384,8390 **** } else { ! while (*arg && !vim_iswhite(*arg)) if (do_autocmd_event(event_name2nr(arg, &arg), pat, nested, cmd, forceit, group) == FAIL) break; --- 8401,8407 ---- } else { ! while (*arg && *arg != '|' && !vim_iswhite(*arg)) if (do_autocmd_event(event_name2nr(arg, &arg), pat, nested, cmd, forceit, group) == FAIL) break; *************** *** 8409,8415 **** char_u *arg = *argp; int group = AUGROUP_ALL; ! p = skiptowhite(arg); if (p > arg) { group_name = vim_strnsave(arg, (int)(p - arg)); --- 8426,8433 ---- char_u *arg = *argp; int group = AUGROUP_ALL; ! for (p = arg; *p && !vim_iswhite(*p) && *p != '|'; ++p) ! ; if (p > arg) { group_name = vim_strnsave(arg, (int)(p - arg)); *** ../vim-7.4.2102/src/testdir/test_autocmd.vim 2016-07-19 23:12:18.716611687 +0200 --- src/testdir/test_autocmd.vim 2016-07-26 20:26:58.577461120 +0200 *************** *** 19,24 **** --- 19,25 ---- call timer_start(100, 'ExitInsertMode') call feedkeys('a', 'x!') call assert_equal(1, g:triggered) + au! CursorHoldI endfunc func Test_cursorhold_insert_ctrl_x() *************** *** 29,34 **** --- 30,36 ---- " CursorHoldI does not trigger after CTRL-X call feedkeys("a\", 'x!') call assert_equal(0, g:triggered) + au! CursorHoldI endfunc endif *************** *** 58,63 **** --- 60,66 ---- bwipeout call assert_equal(["bufunload", "bufdelete", "bufwipeout"], s:li) + au! test_bufunload_group augroup! test_bufunload_group endfunc *************** *** 120,122 **** --- 123,153 ---- augroup END unlet g:record 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 *** ../vim-7.4.2102/runtime/doc/autocmd.txt 2016-07-19 23:12:18.716611687 +0200 --- runtime/doc/autocmd.txt 2016-07-26 20:24:26.482855960 +0200 *************** *** 52,60 **** ============================================================================== 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[tocmd] [group] {event} {pat} [nested] {cmd} Add {cmd} to the list of commands that Vim will --- 52,57 ---- *************** *** 67,72 **** --- 64,75 ---- The special pattern or defines a buffer-local autocommand. 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., "%", "") in the ":autocmd" 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 *** ../vim-7.4.2102/src/version.c 2016-07-24 22:25:11.217375024 +0200 --- src/version.c 2016-07-25 21:53:52.123603600 +0200 *************** *** 760,761 **** --- 760,763 ---- { /* Add new patch number below this line */ + /**/ + 2103, /**/ -- An indication you must be a manager: You can explain to somebody the difference between "re-engineering", "down-sizing", "right-sizing", and "firing people's asses". /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///