diff -cr vim.ba8835947b8b/runtime/doc/options.txt vim/runtime/doc/options.txt
*** vim.ba8835947b8b/runtime/doc/options.txt	2013-02-11 01:39:09.000000000 +0900
--- vim/runtime/doc/options.txt	2013-02-11 01:39:09.000000000 +0900
***************
*** 699,704 ****
--- 699,709 ----
  	when the system locale is set to one of CJK locales.  See Unicode
  	Standard Annex #11 (http://www.unicode.org/reports/tr11).
  
+ 	Vim may set this option automatically at the startup time.
+ 	This only works when Vim is compiled with the |+termresponse|
+ 	feature and if |t_u7| is set to the sescape sequense to request
+ 	cursor position report.
+ 
  			*'antialias'* *'anti'* *'noantialias'* *'noanti'*
  'antialias' 'anti'	boolean (default: off)
  			global
diff -cr vim.ba8835947b8b/runtime/doc/tags vim/runtime/doc/tags
*** vim.ba8835947b8b/runtime/doc/tags	2013-02-11 01:39:09.000000000 +0900
--- vim/runtime/doc/tags	2013-02-11 01:39:09.000000000 +0900
***************
*** 964,969 ****
--- 964,970 ----
  't_te'	term.txt	/*'t_te'*
  't_ti'	term.txt	/*'t_ti'*
  't_ts'	term.txt	/*'t_ts'*
+ 't_u7'	term.txt	/*'t_u7'*
  't_ue'	term.txt	/*'t_ue'*
  't_us'	term.txt	/*'t_us'*
  't_ut'	term.txt	/*'t_ut'*
***************
*** 7972,7977 ****
--- 7973,7979 ----
  t_tp	version4.txt	/*t_tp*
  t_ts	term.txt	/*t_ts*
  t_ts_old	version4.txt	/*t_ts_old*
+ t_u7	term.txt	/*t_u7*
  t_ue	term.txt	/*t_ue*
  t_undo	version4.txt	/*t_undo*
  t_us	term.txt	/*t_us*
diff -cr vim.ba8835947b8b/runtime/doc/term.txt vim/runtime/doc/term.txt
*** vim.ba8835947b8b/runtime/doc/term.txt	2013-02-11 01:39:09.000000000 +0900
--- vim/runtime/doc/term.txt	2013-02-11 01:39:09.000000000 +0900
***************
*** 294,299 ****
--- 294,301 ----
  		|termcap-cursor-shape|
  	t_RV	request terminal version string (for xterm)	*t_RV* *'t_RV'*
  		|xterm-8bit| |v:termresponse| |'ttymouse'| |xterm-codes|
+ 	t_u7	request cursor position (for xterm)		*t_u7* *'t_u7'*
+ 		|'ambiwidth'|
  
  KEY CODES
  Note: Use the <> form if possible
diff -cr vim.ba8835947b8b/src/main.c vim/src/main.c
*** vim.ba8835947b8b/src/main.c	2013-02-11 01:39:09.000000000 +0900
--- vim/src/main.c	2013-02-11 01:39:09.000000000 +0900
***************
*** 804,809 ****
--- 804,812 ----
  
      starttermcap();	    /* start termcap if not done by wait_return() */
      TIME_MSG("start termcap");
+ #if defined(FEAT_TERMRESPONSE) && defined(FEAT_MBYTE)
+     may_req_ambiguous_character_width();
+ #endif
  
  #ifdef FEAT_MOUSE
      setmouse();				/* may start using the mouse */
diff -cr vim.ba8835947b8b/src/option.c vim/src/option.c
*** vim.ba8835947b8b/src/option.c	2013-02-11 01:39:09.000000000 +0900
--- vim/src/option.c	2013-02-11 01:39:09.000000000 +0900
***************
*** 2900,2905 ****
--- 2900,2906 ----
      p_term("t_op", T_OP)
      p_term("t_RI", T_CRI)
      p_term("t_RV", T_CRV)
+     p_term("t_u7", T_U7)
      p_term("t_Sb", T_CSB)
      p_term("t_Sf", T_CSF)
      p_term("t_se", T_SE)
diff -cr vim.ba8835947b8b/src/term.c vim/src/term.c
*** vim.ba8835947b8b/src/term.c	2013-02-11 01:39:09.000000000 +0900
--- vim/src/term.c	2013-02-11 01:39:09.000000000 +0900
***************
*** 111,116 ****
--- 111,121 ----
  #  define CRV_SENT	2	/* did send T_CRV, waiting for answer */
  #  define CRV_GOT	3	/* received T_CRV response */
  static int crv_status = CRV_GET;
+ /* Request Cursor position report: */
+ #  define U7_GET	1	/* send T_U7 when switched to RAW mode */
+ #  define U7_SENT	2	/* did send T_U7, waiting for answer */
+ #  define U7_GOT	3	/* received T_U7 response */
+ static int u7_status = U7_GET;
  # endif
  
  /*
***************
*** 933,938 ****
--- 938,944 ----
      {(int)KS_CWP,	IF_EB("\033[3;%d;%dt", ESC_STR "[3;%d;%dt")},
  #  endif
      {(int)KS_CRV,	IF_EB("\033[>c", ESC_STR "[>c")},
+     {(int)KS_U7,	IF_EB("\033[6n", ESC_STR "[6n")},
  
      {K_UP,		IF_EB("\033O*A", ESC_STR "O*A")},
      {K_DOWN,		IF_EB("\033O*B", ESC_STR "O*B")},
***************
*** 1221,1226 ****
--- 1227,1233 ----
      {(int)KS_CWP,	"[%dCWP%d]"},
  #  endif
      {(int)KS_CRV,	"[CRV]"},
+     {(int)KS_U7,	"[U7]"},
      {K_UP,		"[KU]"},
      {K_DOWN,		"[KD]"},
      {K_LEFT,		"[KL]"},
***************
*** 1596,1601 ****
--- 1603,1609 ----
  				{KS_TS, "ts"}, {KS_FS, "fs"},
  				{KS_CWP, "WP"}, {KS_CWS, "WS"},
  				{KS_CSI, "SI"}, {KS_CEI, "EI"},
+ 				{KS_U7, "u7"},
  				{(enum SpecialKey)0, NULL}
  			    };
  
***************
*** 3181,3187 ****
  		/* May need to check for T_CRV response and termcodes, it
  		 * doesn't work in Cooked mode, an external program may get
  		 * them. */
! 		if (tmode != TMODE_RAW && crv_status == CRV_SENT)
  		    (void)vpeekc_nomap();
  		check_for_codes_from_term();
  	    }
--- 3189,3196 ----
  		/* May need to check for T_CRV response and termcodes, it
  		 * doesn't work in Cooked mode, an external program may get
  		 * them. */
! 		if (tmode != TMODE_RAW && (crv_status == CRV_SENT
! 					 || u7_status == U7_SENT))
  		    (void)vpeekc_nomap();
  		check_for_codes_from_term();
  	    }
***************
*** 3243,3249 ****
  # endif
  	{
  	    /* May need to check for T_CRV response. */
! 	    if (crv_status == CRV_SENT)
  		(void)vpeekc_nomap();
  	    /* Check for termcodes first, otherwise an external program may
  	     * get them. */
--- 3252,3258 ----
  # endif
  	{
  	    /* May need to check for T_CRV response. */
! 	    if (crv_status == CRV_SENT || u7_status == U7_SENT)
  		(void)vpeekc_nomap();
  	    /* Check for termcodes first, otherwise an external program may
  	     * get them. */
***************
*** 3297,3302 ****
--- 3306,3351 ----
  	(void)vpeekc_nomap();
      }
  }
+ 
+ # ifdef FEAT_MBYTE
+ /* Check how the terminal treats ambiguous character width (UAX #11).
+  * First, we move the cursor to (0, 0) and print a test ambiguous character
+  * \u25bd (WHITE DOWN-POINTING TRIANGLE) and query current cursor position.
+  * If the terminal treats \u25bd as single width, the position is (0, 1),
+  * or if it is treated as double width, that will be (0, 2).
+  * This function has the side effect that changes cursor position, so
+  * it must be called immediately after entering termcap mode.
+  */
+     void
+ may_req_ambiguous_character_width()
+ {
+     if (u7_status == U7_GET
+ 	    && cur_tmode == TMODE_RAW
+ 	    && termcap_active
+ 	    && p_ek
+ #  ifdef UNIX
+ 	    && isatty(1)
+ 	    && isatty(read_cmd_fd)
+ #  endif
+ 	    && *T_U7 != NUL
+ 	    && !option_was_set("ambiwidth"))
+     {
+ 	 char	buf[16];
+ 	 term_windgoto(0, 0);
+ 	 buf[mb_char2bytes(0x25bd, buf)] = 0;
+ 	 out_str(buf);
+ 	 out_str(T_U7);
+ 	 u7_status = U7_SENT;
+ 	 term_windgoto(0, 0);
+ 	 out_str("  ");
+ 	 term_windgoto(0, 0);
+ 	 /* check for the characters now, otherwise they might be eaten by
+ 	  * get_keystroke() */
+ 	 out_flush();
+ 	 (void)vpeekc_nomap();
+     }
+ }
+ # endif
  #endif
  
  /*
***************
*** 4048,4060 ****
  	    || key_name[0] == KS_URXVT_MOUSE
  	    || key_name[0] == KS_SGR_MOUSE)
  	{
! 	    /* Check for xterm version string: "<Esc>[>{x};{vers};{y}c".  Also
! 	     * eat other possible responses to t_RV, rxvt returns
! 	     * "<Esc>[?1;2c".  Also accept CSI instead of <Esc>[.
! 	     * mrxvt has been reported to have "+" in the version. Assume
! 	     * the escape sequence ends with a letter or one of "{|}~". */
! 	    if (*T_CRV != NUL && ((tp[0] == ESC && tp[1] == '[' && len >= 3)
! 					       || (tp[0] == CSI && len >= 2)))
  	    {
  		j = 0;
  		extra = 0;
--- 4097,4118 ----
  	    || key_name[0] == KS_URXVT_MOUSE
  	    || key_name[0] == KS_SGR_MOUSE)
  	{
! 	    /* Check for some responses from terminal start with "<Esc>[" or
! 	     * CSI.
! 	     *
! 	     * - xterm version string: <Esc>[>{x};{vers};{y}c
! 	     *   Also eat other possible responses to t_RV, rxvt returns
! 	     *   "<Esc>[?1;2c". Also accept CSI instead of <Esc>[.
! 	     *   mrxvt has been reported to have "+" in the version. Assume
! 	     *   the escape sequence ends with a letter or one of "{|}~".
! 	     *
! 	     * - cursor position report: <Esc>[{row};{col}R
! 	     *   The final byte is 'R'. now it is only used for checking for
! 	     *   ambiguous-width character state.
! 	     */
! 	    if ((*T_CRV != NUL || *T_U7 != NUL)
! 			&& (tp[0] == ESC && tp[1] == '[' && len >= 3)
! 			|| (tp[0] == CSI && len >= 2))
  	    {
  		j = 0;
  		extra = 0;
***************
*** 4066,4073 ****
  		if (i == len)
  		    return -1;		/* not enough characters */
  
  		/* eat it when at least one digit and ending in 'c' */
! 		if (i > 2 + (tp[0] != CSI) && tp[i] == 'c')
  		{
  		    crv_status = CRV_GOT;
  
--- 4124,4147 ----
  		if (i == len)
  		    return -1;		/* not enough characters */
  
+ #ifdef FEAT_MBYTE
+ 		/* eat it when it has 2 arguments and ends in 'R' */
+ 		if (u7_status == U7_SENT && j == 1 && tp[i] == 'R')
+ 		{
+ 		    u7_status = U7_GOT;
+ 		    if (extra == 2) {
+ 			p_ambw = "single";
+ 		    } else if (extra == 3) {
+ 			p_ambw = "double";
+ 		    }
+ 		    key_name[0] = (int)KS_EXTRA;
+ 		    key_name[1] = (int)KE_IGNORE;
+ 		    slen = i + 1;
+ 		}
+ 		else
+ #endif
  		/* eat it when at least one digit and ending in 'c' */
! 		if (*T_CRV != NUL && i > 2 + (tp[0] != CSI) && tp[i] == 'c')
  		{
  		    crv_status = CRV_GOT;
  
diff -cr vim.ba8835947b8b/src/term.h vim/src/term.h
*** vim.ba8835947b8b/src/term.h	2013-02-11 01:39:09.000000000 +0900
--- vim/src/term.h	2013-02-11 01:39:09.000000000 +0900
***************
*** 83,92 ****
  #ifdef FEAT_VERTSPLIT
      KS_CSV,	/* scroll region vertical */
  #endif
!     KS_OP	/* original color pair */
  };
  
! #define KS_LAST	    KS_OP
  
  /*
   * the terminal capabilities are stored in this array
--- 83,93 ----
  #ifdef FEAT_VERTSPLIT
      KS_CSV,	/* scroll region vertical */
  #endif
!     KS_OP,	/* original color pair */
!     KS_U7	/* request cursor position */
  };
  
! #define KS_LAST	    KS_U7
  
  /*
   * the terminal capabilities are stored in this array
***************
*** 158,163 ****
--- 159,165 ----
  #define T_CEI	(term_str(KS_CEI))	/* end insert mode */
  #define T_CRV	(term_str(KS_CRV))	/* request version string */
  #define T_OP	(term_str(KS_OP))	/* original color pair */
+ #define T_U7	(term_str(KS_U7))	/* request cursor position */
  
  #define TMODE_COOK  0	/* terminal mode for external cmds and Ex mode */
  #define TMODE_SLEEP 1	/* terminal mode for sleeping (cooked but no echo) */
