mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	vim-patch:7.4.414
Problem:    Cannot define a command only when it's used.
Solution:   Add the CmdUndefined autocommand event. (partly by Yasuhiro
            Matsumoto)
https://code.google.com/p/vim/source/detail?r=v7-4-414
			
			
This commit is contained in:
		| @@ -278,6 +278,7 @@ Name			triggered by ~ | ||||
| |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 | ||||
| @@ -466,6 +467,16 @@ BufWriteCmd			Before writing the whole buffer to a file. | ||||
| 							*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 | ||||
| @@ -671,6 +682,8 @@ FuncUndefined			When a user function is used but it isn't | ||||
| 				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 | ||||
|   | ||||
| @@ -1459,6 +1459,24 @@ static char_u * do_one_cmd(char_u **cmdlinep, | ||||
|   /* Find the command and let "p" point to after it. */ | ||||
|   p = find_command(&ea, NULL); | ||||
|  | ||||
|   // 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; | ||||
|  | ||||
|     while (ASCII_ISALNUM(*p)) { | ||||
|       ++p; | ||||
|     } | ||||
|     p = vim_strnsave(ea.cmd, p - ea.cmd); | ||||
|     int ret = apply_autocmds(EVENT_CMDUNDEFINED, p, p, TRUE, NULL); | ||||
|     free(p); | ||||
|     if (ret && !aborting()) { | ||||
|       p = find_command(&ea, NULL); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   if (p == NULL) { | ||||
|     if (!ea.skip) | ||||
|       errormsg = (char_u *)_("E464: Ambiguous use of user-defined command"); | ||||
|   | ||||
| @@ -5198,6 +5198,7 @@ static struct event_name { | ||||
|   {"BufWriteCmd",     EVENT_BUFWRITECMD}, | ||||
|   {"CmdwinEnter",     EVENT_CMDWINENTER}, | ||||
|   {"CmdwinLeave",     EVENT_CMDWINLEAVE}, | ||||
|   {"CmdUndefined",    EVENT_CMDUNDEFINED}, | ||||
|   {"ColorScheme",     EVENT_COLORSCHEME}, | ||||
|   {"CompleteDone",    EVENT_COMPLETEDONE}, | ||||
|   {"CursorHold",      EVENT_CURSORHOLD}, | ||||
| @@ -6462,6 +6463,18 @@ int has_insertcharpre(void) | ||||
|   return first_autopat[(int)EVENT_INSERTCHARPRE] != NULL; | ||||
| } | ||||
|  | ||||
| /// @returns true when there is an CmdUndefined autocommand defined. | ||||
| int has_cmdundefined(void) | ||||
| { | ||||
|   return first_autopat[(int)EVENT_CMDUNDEFINED] != NULL; | ||||
| } | ||||
|  | ||||
| /// @returns true when there is an FuncUndefined autocommand defined. | ||||
| int has_funcundefined(void) | ||||
| { | ||||
|   return first_autopat[(int)EVENT_FUNCUNDEFINED] != NULL; | ||||
| } | ||||
|  | ||||
| static int  | ||||
| apply_autocmds_group ( | ||||
|     event_T event, | ||||
|   | ||||
| @@ -251,7 +251,7 @@ static int included_patches[] = { | ||||
|   //417, | ||||
|   //416, | ||||
|   //415, | ||||
|   //414, | ||||
|   414, | ||||
|   //413 NA | ||||
|   //412 NA | ||||
|   411, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Scott Prager
					Scott Prager