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 <amatch> and
+                               <afile> 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 <amatch> and
                                <afile> 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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui