diff --git a/7.3.1248 b/7.3.1248
new file mode 100644
index 0000000..dbfeff2
--- /dev/null
+++ b/7.3.1248
@@ -0,0 +1,286 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 7.3.1248
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.3.1248
+Problem:    Still have old hacking code for Input Method.
+Solution:   Add 'imactivatefunc' and 'imstatusfunc' as a generic solution to
+	    Input Method activation. (Yukihiro Nakadaira)
+Files:	    runtime/doc/options.txt, src/fileio.c, src/mbyte.c, src/option.c,
+	    src/option.h, src/proto/fileio.pro
+
+
+*** ../vim-7.3.1247/runtime/doc/options.txt	2013-06-04 22:13:45.000000000 +0200
+--- runtime/doc/options.txt	2013-06-26 19:00:28.000000000 +0200
+***************
+*** 3937,3942 ****
+--- 3993,4018 ----
+  	Can be overruled by using "\c" or "\C" in the pattern, see
+  	|/ignorecase|.
+  
++ 						*'imactivatefunc'* *'imaf'*
++ 'imactivatefunc' 'imaf'	string (default "")
++ 			global
++ 			{not in Vi}
++ 			{only available when compiled with |+xim| and
++ 			|+GUI_GTK|}
++ 	This option specifies a function that will be called to
++ 	activate/inactivate Input Method.
++ 
++ 	Example: >
++ 		function ImActivateFunc(active)
++ 		  if a:active
++ 		    ... do something
++ 		  else
++ 		    ... do something
++ 		  endif
++ 		  " return value is not used
++ 		endfunction
++ 		set imactivatefunc=ImActivateFunc
++ <
+  						*'imactivatekey'* *'imak'*
+  'imactivatekey' 'imak'	string (default "")
+  			global
+***************
+*** 4033,4038 ****
+--- 4109,4132 ----
+  	The value 0 may not work correctly with Athena and Motif with some XIM
+  	methods.  Use 'imdisable' to disable XIM then.
+  
++ 						*'imstatusfunc'* *'imsf'*
++ 'imstatusfunc' 'imsf'	string (default "")
++ 			global
++ 			{not in Vi}
++ 			{only available when compiled with |+xim| and
++ 			|+GUI_GTK|}
++ 	This option specifies a function that is called to obtain the status
++ 	of Input Method.  It must return a positive number when IME is active.
++ 
++ 	Example: >
++ 		function ImStatusFunc()
++ 		  let is_active = ...do something
++ 		  return is_active ? 1 : 0
++ 		endfunction
++ 		set imstatusfunc=ImStatusFunc
++ <
++ 	NOTE: This function is invoked very often.  Keep it fast.
++ 
+  						*'include'* *'inc'*
+  'include' 'inc'		string	(default "^\s*#\s*include")
+  			global or local to buffer |global-local|
+*** ../vim-7.3.1247/src/fileio.c	2013-06-12 22:41:30.000000000 +0200
+--- src/fileio.c	2013-06-26 18:41:39.000000000 +0200
+***************
+*** 9572,9577 ****
+--- 9572,9583 ----
+  # endif
+  }
+  
++     int
++ is_autocmd_blocked()
++ {
++     return autocmd_blocked != 0;
++ }
++ 
+  /*
+   * Find next autocommand pattern that matches.
+   */
+*** ../vim-7.3.1247/src/mbyte.c	2013-05-06 04:21:35.000000000 +0200
+--- src/mbyte.c	2013-06-26 19:10:41.000000000 +0200
+***************
+*** 4447,4453 ****
+  {
+      int was_active;
+  
+!     was_active = !!im_is_active;
+      im_is_active = (active && !p_imdisable);
+  
+      if (im_is_active != was_active)
+--- 4447,4453 ----
+  {
+      int was_active;
+  
+!     was_active = !!im_get_status();
+      im_is_active = (active && !p_imdisable);
+  
+      if (im_is_active != was_active)
+***************
+*** 5071,5114 ****
+  {
+      if (xic != NULL)
+      {
+- 	/*
+- 	 * The third-party imhangul module (and maybe others too) ignores
+- 	 * gtk_im_context_reset() or at least doesn't reset the active state.
+- 	 * Thus sending imactivatekey would turn it off if it was on before,
+- 	 * which is clearly not what we want.  Fortunately we can work around
+- 	 * that for imhangul by sending GDK_Escape, but I don't know if it
+- 	 * works with all IM modules that support an activation key :/
+- 	 *
+- 	 * An alternative approach would be to destroy the IM context and
+- 	 * recreate it.  But that means loading/unloading the IM module on
+- 	 * every mode switch, which causes a quite noticeable delay even on
+- 	 * my rather fast box...
+- 	 * *
+- 	 * Moreover, there are some XIM which cannot respond to
+- 	 * im_synthesize_keypress(). we hope that they reset by
+- 	 * xim_shutdown().
+- 	 */
+- 	if (im_activatekey_keyval != GDK_VoidSymbol && im_is_active)
+- 	    im_synthesize_keypress(GDK_Escape, 0U);
+- 
+  	gtk_im_context_reset(xic);
+  
+- 	/*
+- 	 * HACK for Ami: This sequence of function calls makes Ami handle
+- 	 * the IM reset graciously, without breaking loads of other stuff.
+- 	 * It seems to force English mode as well, which is exactly what we
+- 	 * want because it makes the Ami status display work reliably.
+- 	 */
+- 	gtk_im_context_set_use_preedit(xic, FALSE);
+- 
+  	if (p_imdisable)
+  	    im_shutdown();
+  	else
+  	{
+- 	    gtk_im_context_set_use_preedit(xic, TRUE);
+  	    xim_set_focus(gui.in_focus);
+  
+! 	    if (im_activatekey_keyval != GDK_VoidSymbol)
+  	    {
+  		if (im_is_active)
+  		{
+--- 5071,5095 ----
+  {
+      if (xic != NULL)
+      {
+  	gtk_im_context_reset(xic);
+  
+  	if (p_imdisable)
+  	    im_shutdown();
+  	else
+  	{
+  	    xim_set_focus(gui.in_focus);
+  
+! 	    if (p_imaf[0] != NUL)
+! 	    {
+! 		char_u *argv[1];
+! 
+! 		if (im_is_active)
+! 		    argv[0] = (char_u *)"1";
+! 		else
+! 		    argv[0] = (char_u *)"0";
+! 		(void)call_func_retnr(p_imaf, 1, argv, FALSE);
+! 	    }
+! 	    else if (im_activatekey_keyval != GDK_VoidSymbol)
+  	    {
+  		if (im_is_active)
+  		{
+***************
+*** 5268,5273 ****
+--- 5249,5268 ----
+      int
+  im_get_status(void)
+  {
++     if (p_imsf[0] != NUL)
++     {
++ 	int is_active;
++ 
++ 	/* FIXME: Don't execute user function in unsafe situation. */
++ 	if (exiting || is_autocmd_blocked())
++ 	    return FALSE;
++ 	/* FIXME: :py print 'xxx' is shown duplicate result.
++ 	 * Use silent to avoid it. */
++ 	++msg_silent;
++ 	is_active = call_func_retnr(p_imsf, 0, NULL, FALSE);
++ 	--msg_silent;
++ 	return (is_active > 0);
++     }
+      return im_is_active;
+  }
+  
+*** ../vim-7.3.1247/src/option.c	2013-06-16 16:01:20.000000000 +0200
+--- src/option.c	2013-06-26 18:41:39.000000000 +0200
+***************
+*** 1425,1430 ****
+--- 1425,1439 ----
+      {"ignorecase",  "ic",   P_BOOL|P_VI_DEF,
+  			    (char_u *)&p_ic, PV_NONE,
+  			    {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
++     {"imactivatefunc","imaf",P_STRING|P_VI_DEF|P_SECURE,
++ # if defined(FEAT_EVAL) && defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
++ 			    (char_u *)&p_imaf, PV_NONE,
++ 			    {(char_u *)"", (char_u *)NULL}
++ # else
++ 			    (char_u *)NULL, PV_NONE,
++ 			    {(char_u *)NULL, (char_u *)0L}
++ # endif
++ 			    SCRIPTID_INIT},
+      {"imactivatekey","imak",P_STRING|P_VI_DEF,
+  #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
+  			    (char_u *)&p_imak, PV_NONE,
+***************
+*** 1467,1472 ****
+--- 1476,1490 ----
+  			    {(char_u *)B_IMODE_NONE, (char_u *)0L}
+  #endif
+  			    SCRIPTID_INIT},
++     {"imstatusfunc","imse",P_STRING|P_VI_DEF|P_SECURE,
++ # if defined(FEAT_EVAL) && defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
++ 			    (char_u *)&p_imsf, PV_NONE,
++ 			    {(char_u *)"", (char_u *)NULL}
++ # else
++ 			    (char_u *)NULL, PV_NONE,
++ 			    {(char_u *)NULL, (char_u *)0L}
++ # endif
++ 			    SCRIPTID_INIT},
+      {"include",	    "inc",  P_STRING|P_ALLOCED|P_VI_DEF,
+  #ifdef FEAT_FIND_ID
+  			    (char_u *)&p_inc, PV_INC,
+*** ../vim-7.3.1247/src/option.h	2013-05-19 19:16:25.000000000 +0200
+--- src/option.h	2013-06-26 18:41:39.000000000 +0200
+***************
+*** 558,563 ****
+--- 558,565 ----
+  EXTERN int	p_ic;		/* 'ignorecase' */
+  #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
+  EXTERN char_u	*p_imak;	/* 'imactivatekey' */
++ EXTERN char_u	*p_imaf;	/* 'imactivatefunc' */
++ EXTERN char_u	*p_imsf;	/* 'imstatusfunc' */
+  #endif
+  #ifdef USE_IM_CONTROL
+  EXTERN int	p_imcmdline;	/* 'imcmdline' */
+*** ../vim-7.3.1247/src/proto/fileio.pro	2013-03-19 13:33:18.000000000 +0100
+--- src/proto/fileio.pro	2013-06-26 18:45:49.000000000 +0200
+***************
+*** 49,54 ****
+--- 49,55 ----
+  int has_insertcharpre __ARGS((void));
+  void block_autocmds __ARGS((void));
+  void unblock_autocmds __ARGS((void));
++ int is_autocmd_blocked __ARGS((void));
+  char_u *getnextac __ARGS((int c, void *cookie, int indent));
+  int has_autocmd __ARGS((event_T event, char_u *sfname, buf_T *buf));
+  char_u *get_augroup_name __ARGS((expand_T *xp, int idx));
+*** ../vim-7.3.1247/src/version.c	2013-06-26 18:16:55.000000000 +0200
+--- src/version.c	2013-06-26 19:12:37.000000000 +0200
+***************
+*** 730,731 ****
+--- 730,733 ----
+  {   /* Add new patch number below this line */
++ /**/
++     1248,
+  /**/
+
+-- 
+I'd like to meet the man who invented sex and see what he's working on now.
+
+ /// 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    ///