To: vim_dev@googlegroups.com Subject: Patch 7.4.414 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.414 Problem: Cannot define a command only when it's used. Solution: Add the CmdUndefined autocommand event. (partly by Yasuhiro Matsumoto) Files: runtime/doc/autocmd.txt, src/ex_docmd.c, src/fileio.c, src/proto/fileio.pro *** ../vim-7.4.413/runtime/doc/autocmd.txt 2013-11-28 18:53:47.000000000 +0100 --- runtime/doc/autocmd.txt 2014-08-22 20:10:24.026988365 +0200 *************** *** 278,283 **** --- 278,284 ---- |ShellCmdPost| after executing a shell command |ShellFilterPost| after filtering with a shell command + |CmdUndefined| a user command is used but it isn't defined |FuncUndefined| a user function is used but it isn't defined |SpellFileMissing| a spell file is used but it can't be found |SourcePre| before sourcing a Vim script *************** *** 462,467 **** --- 466,481 ---- *BufWritePost* BufWritePost After writing the whole buffer to a file (should undo the commands for BufWritePre). + *CmdUndefined* + CmdUndefined When a user command is used but it isn't + defined. Useful for defining a command only + when it's used. The pattern is matched + against the command name. Both and + are set to the name of the command. + NOTE: Autocompletion won't work until the + command is defined. An alternative is to + always define the user command and have it + invoke an autoloaded function. See |autoload|. *CmdwinEnter* CmdwinEnter After entering the command-line window. Useful for setting options specifically for *************** *** 663,668 **** --- 681,688 ---- when it's used. The pattern is matched against the function name. Both and are set to the name of the function. + NOTE: When writing Vim scripts a better + alternative is to use an autoloaded function. See |autoload-functions|. *GUIEnter* GUIEnter After starting the GUI successfully, and after *** ../vim-7.4.413/src/ex_docmd.c 2014-08-10 13:34:59.056785459 +0200 --- src/ex_docmd.c 2014-08-22 20:23:43.426959373 +0200 *************** *** 2143,2148 **** --- 2143,2168 ---- /* Find the command and let "p" point to after it. */ p = find_command(&ea, NULL); + #ifdef FEAT_AUTOCMD + /* If this looks like an undefined user command and there are CmdUndefined + * autocommands defined, trigger the matching autocommands. */ + if (p != NULL && ea.cmdidx == CMD_SIZE && !ea.skip + && ASCII_ISUPPER(*ea.cmd) + && has_cmdundefined()) + { + char_u *p = ea.cmd; + int ret; + + while (ASCII_ISALNUM(*p)) + ++p; + p = vim_strnsave(ea.cmd, p - ea.cmd); + ret = apply_autocmds(EVENT_CMDUNDEFINED, p, p, TRUE, NULL); + vim_free(p); + if (ret && !aborting()) + p = find_command(&ea, NULL); + } + #endif + #ifdef FEAT_USR_CMDS if (p == NULL) { *** ../vim-7.4.413/src/fileio.c 2014-08-13 21:58:24.820885492 +0200 --- src/fileio.c 2014-08-22 20:25:26.826955623 +0200 *************** *** 7641,7646 **** --- 7641,7647 ---- {"BufWriteCmd", EVENT_BUFWRITECMD}, {"CmdwinEnter", EVENT_CMDWINENTER}, {"CmdwinLeave", EVENT_CMDWINLEAVE}, + {"CmdUndefined", EVENT_CMDUNDEFINED}, {"ColorScheme", EVENT_COLORSCHEME}, {"CompleteDone", EVENT_COMPLETEDONE}, {"CursorHold", EVENT_CURSORHOLD}, *************** *** 9159,9164 **** --- 9160,9183 ---- return (first_autopat[(int)EVENT_INSERTCHARPRE] != NULL); } + /* + * Return TRUE when there is an CmdUndefined autocommand defined. + */ + int + has_cmdundefined() + { + return (first_autopat[(int)EVENT_CMDUNDEFINED] != NULL); + } + + /* + * Return TRUE when there is an FuncUndefined autocommand defined. + */ + int + has_funcundefined() + { + return (first_autopat[(int)EVENT_FUNCUNDEFINED] != NULL); + } + static int apply_autocmds_group(event, fname, fname_io, force, group, buf, eap) event_T event; *** ../vim-7.4.413/src/proto/fileio.pro 2014-08-10 13:34:59.060785459 +0200 --- src/proto/fileio.pro 2014-08-22 20:25:38.862955186 +0200 *************** *** 47,52 **** --- 47,54 ---- int has_textchanged __ARGS((void)); int has_textchangedI __ARGS((void)); int has_insertcharpre __ARGS((void)); + int has_cmdundefined __ARGS((void)); + int has_funcundefined __ARGS((void)); void block_autocmds __ARGS((void)); void unblock_autocmds __ARGS((void)); int is_autocmd_blocked __ARGS((void)); *** ../vim-7.4.413/src/version.c 2014-08-22 18:44:30.307175276 +0200 --- src/version.c 2014-08-22 20:55:31.406890176 +0200 *************** *** 743,744 **** --- 743,746 ---- { /* Add new patch number below this line */ + /**/ + 414, /**/ -- hundred-and-one symptoms of being an internet addict: 44. Your friends no longer send you e-mail...they just log on to your IRC channel. /// 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 ///