Hi Bram,
Some people report that this patch does not work well and causes wrong behavior
in TERM=ansi environment.
The problem reproduces with the following shell command:
$ TERM=ansi vim -u NONE -N
Launching Vim with this option, The mode goes to REPLACE(not Normal) at the
start-up time.
I think the patch#859 should be reverted until it come to include the
workaround for this problem.
I confirm this problem on the following environments:
OSX Terminal.app
OSX iTerm2
OSX xterm
Ubuntu 12.10 gnome-terminal
Ubuntu 12.10 konsole
Ubuntu 12.10 xterm
Thanks,
Hayaki Saito
On 2013/03/14, at 3:29, Bram Moolenaar wrote:
>
> Patch 7.3.859
> Problem: 'ambiwidth' must be set by the user.
> Solution: Detects East Asian ambiguous width (UAX #11) state of the terminal
> at the start-up time and 'ambiwidth' accordingly. (Hayaki Saito)
> Files: src/main.c, src/option.c, src/term.c, src/term.h,
> src/proto/term.pro
>
>
> *** ../vim-7.3.858/src/main.c 2013-01-17 13:59:56.000000000 +0100
> --- src/main.c 2013-03-13 19:09:03.000000000 +0100
> ***************
> *** 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 */
> *** ../vim-7.3.858/src/option.c 2013-02-13 15:44:22.000000000 +0100
> --- src/option.c 2013-03-13 19:09:03.000000000 +0100
> ***************
> *** 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)
> *** ../vim-7.3.858/src/term.c 2013-02-26 14:56:24.000000000 +0100
> --- src/term.c 2013-03-13 19:18:22.000000000 +0100
> ***************
> *** 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}
> };
>
> ***************
> *** 3183,3189 ****
> /* 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();
> }
> --- 3191,3198 ----
> /* 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();
> }
> ***************
> *** 3245,3251 ****
> # 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. */
> --- 3254,3260 ----
> # 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. */
> ***************
> *** 3299,3304 ****
> --- 3308,3355 ----
> (void)vpeekc_nomap();
> }
> }
> +
> + # if defined(FEAT_MBYTE) || defined(PROTO)
> + /*
> + * 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((char_u *)"ambiwidth"))
> + {
> + char_u 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((char_u *)" ");
> + term_windgoto(0, 0);
> + /* check for the characters now, otherwise they might be eaten by
> + * get_keystroke() */
> + out_flush();
> + (void)vpeekc_nomap();
> + }
> + }
> + # endif
> #endif
>
> /*
> ***************
> *** 4049,4061 ****
> /* URXVT mouse uses <ESC>[#;#;#M, but we are matching <ESC>[ */
> || key_name[0] == KS_URXVT_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;
> --- 4100,4121 ----
> /* URXVT mouse uses <ESC>[#;#;#M, but we are matching <ESC>[ */
> || key_name[0] == KS_URXVT_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;
> ***************
> *** 4067,4074 ****
> 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;
>
> --- 4127,4153 ----
> 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')
> + {
> + char *p = NULL;
> +
> + u7_status = U7_GOT;
> + if (extra == 2)
> + p = "single";
> + else if (extra == 3)
> + p = "double";
> + if (p != NULL)
> + set_option_value((char_u *)"ambw", 0L, (char_u *)p, 0);
> + 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;
>
> *** ../vim-7.3.858/src/term.h 2010-08-15 21:57:25.000000000 +0200
> --- src/term.h 2013-03-13 19:09:03.000000000 +0100
> ***************
> *** 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) */
> *** ../vim-7.3.858/src/proto/term.pro 2012-02-05 22:05:44.000000000 +0100
> --- src/proto/term.pro 2013-03-13 19:09:54.000000000 +0100
> ***************
> *** 34,39 ****
> --- 34,40 ----
> void starttermcap __ARGS((void));
> void stoptermcap __ARGS((void));
> void may_req_termresponse __ARGS((void));
> + void may_req_ambiguous_character_width __ARGS((void));
> int swapping_screen __ARGS((void));
> void setmouse __ARGS((void));
> int mouse_has __ARGS((int c));
> *** ../vim-7.3.858/src/version.c 2013-03-13 19:02:37.000000000 +0100
> --- src/version.c 2013-03-13 19:27:31.000000000 +0100
> ***************
> *** 730,731 ****
> --- 730,733 ----
> { /* Add new patch number below this line */
> + /**/
> + 859,
> /**/
>
> --
> Microsoft is to software what McDonalds is to gourmet cooking
>
> /// 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/groups/opt_out.
>
--
--
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/groups/opt_out.