forked from aniani/vim
		
	updated for version 7.4.414
Problem:    Cannot define a command only when it's used.
Solution:   Add the CmdUndefined autocommand event. (partly by Yasuhiro
            Matsumoto)
			
			
This commit is contained in:
		| @@ -278,6 +278,7 @@ Name			triggered by ~ | |||||||
| |ShellCmdPost|		after executing a shell command | |ShellCmdPost|		after executing a shell command | ||||||
| |ShellFilterPost|	after filtering with 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 | |FuncUndefined|		a user function is used but it isn't defined | ||||||
| |SpellFileMissing|	a spell file is used but it can't be found | |SpellFileMissing|	a spell file is used but it can't be found | ||||||
| |SourcePre|		before sourcing a Vim script | |SourcePre|		before sourcing a Vim script | ||||||
| @@ -465,6 +466,16 @@ BufWriteCmd			Before writing the whole buffer to a file. | |||||||
| 							*BufWritePost* | 							*BufWritePost* | ||||||
| BufWritePost			After writing the whole buffer to a file | BufWritePost			After writing the whole buffer to a file | ||||||
| 				(should undo the commands for BufWritePre). | 				(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* | ||||||
| CmdwinEnter			After entering the command-line window. | CmdwinEnter			After entering the command-line window. | ||||||
| 				Useful for setting options specifically for | 				Useful for setting options specifically for | ||||||
| @@ -670,6 +681,8 @@ FuncUndefined			When a user function is used but it isn't | |||||||
| 				when it's used.  The pattern is matched | 				when it's used.  The pattern is matched | ||||||
| 				against the function name.  Both <amatch> and | 				against the function name.  Both <amatch> and | ||||||
| 				<afile> are set to the name of the function. | 				<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|. | 				See |autoload-functions|. | ||||||
| 							*GUIEnter* | 							*GUIEnter* | ||||||
| GUIEnter			After starting the GUI successfully, and after | GUIEnter			After starting the GUI successfully, and after | ||||||
|   | |||||||
| @@ -2143,6 +2143,26 @@ do_one_cmd(cmdlinep, sourcing, | |||||||
|     /* Find the command and let "p" point to after it. */ |     /* Find the command and let "p" point to after it. */ | ||||||
|     p = find_command(&ea, NULL); |     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 | #ifdef FEAT_USR_CMDS | ||||||
|     if (p == NULL) |     if (p == NULL) | ||||||
|     { |     { | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								src/fileio.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								src/fileio.c
									
									
									
									
									
								
							| @@ -7641,6 +7641,7 @@ static struct event_name | |||||||
|     {"BufWriteCmd",	EVENT_BUFWRITECMD}, |     {"BufWriteCmd",	EVENT_BUFWRITECMD}, | ||||||
|     {"CmdwinEnter",	EVENT_CMDWINENTER}, |     {"CmdwinEnter",	EVENT_CMDWINENTER}, | ||||||
|     {"CmdwinLeave",	EVENT_CMDWINLEAVE}, |     {"CmdwinLeave",	EVENT_CMDWINLEAVE}, | ||||||
|  |     {"CmdUndefined",	EVENT_CMDUNDEFINED}, | ||||||
|     {"ColorScheme",	EVENT_COLORSCHEME}, |     {"ColorScheme",	EVENT_COLORSCHEME}, | ||||||
|     {"CompleteDone",	EVENT_COMPLETEDONE}, |     {"CompleteDone",	EVENT_COMPLETEDONE}, | ||||||
|     {"CursorHold",	EVENT_CURSORHOLD}, |     {"CursorHold",	EVENT_CURSORHOLD}, | ||||||
| @@ -9159,6 +9160,24 @@ has_insertcharpre() | |||||||
|     return (first_autopat[(int)EVENT_INSERTCHARPRE] != NULL); |     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 |     static int | ||||||
| apply_autocmds_group(event, fname, fname_io, force, group, buf, eap) | apply_autocmds_group(event, fname, fname_io, force, group, buf, eap) | ||||||
|     event_T	event; |     event_T	event; | ||||||
|   | |||||||
| @@ -47,6 +47,8 @@ int has_cursormovedI __ARGS((void)); | |||||||
| int has_textchanged __ARGS((void)); | int has_textchanged __ARGS((void)); | ||||||
| int has_textchangedI __ARGS((void)); | int has_textchangedI __ARGS((void)); | ||||||
| int has_insertcharpre __ARGS((void)); | int has_insertcharpre __ARGS((void)); | ||||||
|  | int has_cmdundefined __ARGS((void)); | ||||||
|  | int has_funcundefined __ARGS((void)); | ||||||
| void block_autocmds __ARGS((void)); | void block_autocmds __ARGS((void)); | ||||||
| void unblock_autocmds __ARGS((void)); | void unblock_autocmds __ARGS((void)); | ||||||
| int is_autocmd_blocked __ARGS((void)); | int is_autocmd_blocked __ARGS((void)); | ||||||
|   | |||||||
| @@ -741,6 +741,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     414, | ||||||
| /**/ | /**/ | ||||||
|     413, |     413, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user