To: vim_dev@googlegroups.com Subject: Patch 7.4.389 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.389 Problem: Still sometimes Vim enters Replace mode when starting up. Solution: Use a different solution in detecting the termresponse and location response. (Hayaki Saito) Files: src/globals.h, src/os_unix.c, src/term.c, src/proto/term.pro *** ../vim-7.4.388/src/globals.h 2014-06-12 14:01:27.575769788 +0200 --- src/globals.h 2014-07-30 17:02:57.711526671 +0200 *************** *** 1336,1344 **** #if defined(UNIX) || defined(VMS) EXTERN int term_is_xterm INIT(= FALSE); /* xterm-like 'term' */ #endif - #if defined(UNIX) - EXTERN int xterm_conflict_mouse INIT(= FALSE); - #endif #ifdef BACKSLASH_IN_FILENAME EXTERN char psepc INIT(= '\\'); /* normal path separator character */ --- 1336,1341 ---- *** ../vim-7.4.388/src/os_unix.c 2014-07-09 19:13:45.007701718 +0200 --- src/os_unix.c 2014-07-30 17:06:02.375525344 +0200 *************** *** 3667,3674 **** void check_mouse_termcode() { - xterm_conflict_mouse = FALSE; - # ifdef FEAT_MOUSE_XTERM if (use_xterm_mouse() # ifdef FEAT_MOUSE_URXVT --- 3667,3672 ---- *************** *** 3713,3719 **** # endif # ifdef FEAT_MOUSE_JSB ! /* There is no conflict, but it was disabled for xterm before. */ if (!use_xterm_mouse() # ifdef FEAT_GUI && !gui.in_use --- 3711,3717 ---- # endif # ifdef FEAT_MOUSE_JSB ! /* Conflicts with xterm mouse: "\033[" and "\033[M" ??? */ if (!use_xterm_mouse() # ifdef FEAT_GUI && !gui.in_use *************** *** 3740,3784 **** # endif # ifdef FEAT_MOUSE_DEC ! /* Conflicts with xterm mouse: "\033[" and "\033[M". ! * Also conflicts with the xterm termresponse, skip this if it was ! * requested already. */ if (!use_xterm_mouse() - # ifdef FEAT_TERMRESPONSE - && !did_request_esc_sequence() - # endif # ifdef FEAT_GUI && !gui.in_use # endif ) - { set_mouse_termcode(KS_DEC_MOUSE, (char_u *)(term_is_8bit(T_NAME) ? IF_EB("\233", CSI_STR) : IF_EB("\033[", ESC_STR "["))); - xterm_conflict_mouse = TRUE; - } else del_mouse_termcode(KS_DEC_MOUSE); # endif # ifdef FEAT_MOUSE_PTERM ! /* same as the dec mouse */ if (!use_xterm_mouse() - # ifdef FEAT_TERMRESPONSE - && !did_request_esc_sequence() - # endif # ifdef FEAT_GUI && !gui.in_use # endif ) - { set_mouse_termcode(KS_PTERM_MOUSE, (char_u *) IF_EB("\033[", ESC_STR "[")); - xterm_conflict_mouse = TRUE; - } else del_mouse_termcode(KS_PTERM_MOUSE); # endif # ifdef FEAT_MOUSE_URXVT ! /* same as the dec mouse */ if (use_xterm_mouse() == 3 # ifdef FEAT_GUI && !gui.in_use --- 3738,3768 ---- # endif # ifdef FEAT_MOUSE_DEC ! /* Conflicts with xterm mouse: "\033[" and "\033[M" */ if (!use_xterm_mouse() # ifdef FEAT_GUI && !gui.in_use # endif ) set_mouse_termcode(KS_DEC_MOUSE, (char_u *)(term_is_8bit(T_NAME) ? IF_EB("\233", CSI_STR) : IF_EB("\033[", ESC_STR "["))); else del_mouse_termcode(KS_DEC_MOUSE); # endif # ifdef FEAT_MOUSE_PTERM ! /* same conflict as the dec mouse */ if (!use_xterm_mouse() # ifdef FEAT_GUI && !gui.in_use # endif ) set_mouse_termcode(KS_PTERM_MOUSE, (char_u *) IF_EB("\033[", ESC_STR "[")); else del_mouse_termcode(KS_PTERM_MOUSE); # endif # ifdef FEAT_MOUSE_URXVT ! /* same conflict as the dec mouse */ if (use_xterm_mouse() == 3 # ifdef FEAT_GUI && !gui.in_use *************** *** 3794,3801 **** mch_setmouse(FALSE); setmouse(); } - /* It's OK to request the xterm version for uxterm. */ - resume_get_esc_sequence(); } else del_mouse_termcode(KS_URXVT_MOUSE); --- 3778,3783 ---- *** ../vim-7.4.388/src/term.c 2014-07-09 20:51:04.519583033 +0200 --- src/term.c 2014-07-30 17:20:54.915518929 +0200 *************** *** 153,163 **** static char_u *vim_tgetstr __ARGS((char *s, char_u **pp)); #endif /* HAVE_TGETENT */ - #if defined(FEAT_TERMRESPONSE) - static int xt_index_in = 0; - static int xt_index_out = 0; - #endif - static int detected_8bit = FALSE; /* detected 8-bit terminal */ static struct builtin_term builtin_termcaps[] = --- 153,158 ---- *************** *** 3312,3351 **** } #if defined(FEAT_TERMRESPONSE) || defined(PROTO) - # if defined(UNIX) || defined(PROTO) - /* - * Return TRUE when the xterm version was requested or anything else that - * would send an ESC sequence back to Vim. - * If not sent yet, prevent it from being sent soon. - * Used to check whether it is OK to enable checking for DEC mouse codes, - * which conflict with may xterm ESC sequences. - */ - int - did_request_esc_sequence() - { - if (crv_status == CRV_GET) - crv_status = 0; - if (u7_status == U7_GET) - u7_status = 0; - return crv_status == CRV_SENT || u7_status == U7_SENT - || xt_index_out > xt_index_in; - } - - /* - * If requesting the version was disabled in did_request_esc_sequence(), - * enable it again. - */ - void - resume_get_esc_sequence() - { - if (crv_status == 0) - crv_status = CRV_GET; - if (u7_status == 0) - u7_status = U7_GET; - } - # endif - - /* * Request version string (for xterm) when needed. * Only do this after switching to raw mode, otherwise the result will be --- 3307,3312 ---- *************** *** 3358,3365 **** * Insert mode. * On Unix only do it when both output and input are a tty (avoid writing * request to terminal while reading from a file). - * Do not do this when a mouse is being detected that starts with the same ESC - * sequence as the termresponse. * The result is caught in check_termcode(). */ void --- 3319,3324 ---- *************** *** 3373,3379 **** # ifdef UNIX && isatty(1) && isatty(read_cmd_fd) - && !xterm_conflict_mouse # endif && *T_CRV != NUL) { --- 3332,3337 ---- *************** *** 3742,3749 **** #if defined(WIN3264) && !defined(FEAT_GUI) if (s[0] == K_NUL) { ! STRMOVE(s + 1, s); ! s[1] = 3; } #endif --- 3700,3707 ---- #if defined(WIN3264) && !defined(FEAT_GUI) if (s[0] == K_NUL) { ! STRMOVE(s + 1, s); ! s[1] = 3; } #endif *************** *** 4212,4235 **** #ifdef FEAT_TERMRESPONSE if (key_name[0] == NUL ! /* URXVT mouse uses [#;#;#M, but we are matching [ */ || key_name[0] == KS_URXVT_MOUSE - # ifdef FEAT_MBYTE - || u7_status == U7_SENT # endif ! ) { ! /* Check for some responses from terminal start with "[" or ! * CSI. * ! * - xterm version string: [>{x};{vers};{y}c * Also eat other possible responses to t_RV, rxvt returns * "[?1;2c". Also accept CSI instead of [. * mrxvt has been reported to have "+" in the version. Assume * the escape sequence ends with a letter or one of "{|}~". * ! * - cursor position report: [{row};{col}R ! * The final byte is 'R'. now it is only used for checking for * ambiguous-width character state. */ p = tp[0] == CSI ? tp + 1 : tp + 2; --- 4170,4200 ---- #ifdef FEAT_TERMRESPONSE if (key_name[0] == NUL ! /* Mouse codes of DEC, pterm, and URXVT start with [. When ! * detecting the start of these mouse codes they might as well be ! * another key code or terminal response. */ ! # ifdef FEAT_MOUSE_DEC ! || key_name[0] == KS_DEC_MOUSE ! # endif ! # ifdef FEAT_MOUSE_PTERM ! || key_name[0] == KS_PTERM_MOUSE ! # endif ! # ifdef FEAT_MOUSE_URXVT || key_name[0] == KS_URXVT_MOUSE # endif ! ) { ! /* Check for some responses from the terminal starting with ! * "[" or CSI: * ! * - Xterm version string: [>{x};{vers};{y}c * Also eat other possible responses to t_RV, rxvt returns * "[?1;2c". Also accept CSI instead of [. * mrxvt has been reported to have "+" in the version. Assume * the escape sequence ends with a letter or one of "{|}~". * ! * - Cursor position report: [{row};{col}R ! * The final byte must be 'R'. It is used for checking the * ambiguous-width character state. */ p = tp[0] == CSI ? tp + 1 : tp + 2; *************** *** 4269,4304 **** * u7_status is not "sent", it may be from a previous Vim that * just exited. But not for , it sends something * similar, check for row and column to make sense. */ ! if (j == 1 && tp[i] == 'R' && row_char == '2' && col >= 2) { ! char *aw = NULL; ! LOG_TR("Received U7 status"); ! u7_status = U7_GOT; # ifdef FEAT_AUTOCMD ! did_cursorhold = TRUE; # endif ! if (col == 2) ! aw = "single"; ! else if (col == 3) ! aw = "double"; ! if (aw != NULL && STRCMP(aw, p_ambw) != 0) ! { ! /* Setting the option causes a screen redraw. Do that ! * right away if possible, keeping any messages. */ ! set_option_value((char_u *)"ambw", 0L, (char_u *)aw, 0); ! # ifdef DEBUG_TERMRESPONSE { ! char buf[100]; ! int r = redraw_asap(CLEAR); ! sprintf(buf, "set 'ambiwidth', redraw_asap(): %d", ! r); ! log_tr(buf); ! } # else ! redraw_asap(CLEAR); # endif } key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; --- 4234,4275 ---- * u7_status is not "sent", it may be from a previous Vim that * just exited. But not for , it sends something * similar, check for row and column to make sense. */ ! if (j == 1 && tp[i] == 'R') { ! if (row_char == '2' && col >= 2) ! { ! char *aw = NULL; ! LOG_TR("Received U7 status"); ! u7_status = U7_GOT; # ifdef FEAT_AUTOCMD ! did_cursorhold = TRUE; # endif ! if (col == 2) ! aw = "single"; ! else if (col == 3) ! aw = "double"; ! if (aw != NULL && STRCMP(aw, p_ambw) != 0) { ! /* Setting the option causes a screen redraw. Do ! * that right away if possible, keeping any ! * messages. */ ! set_option_value((char_u *)"ambw", 0L, ! (char_u *)aw, 0); ! # ifdef DEBUG_TERMRESPONSE ! { ! char buf[100]; ! int r = redraw_asap(CLEAR); ! sprintf(buf, ! "set 'ambiwidth', redraw_asap(): %d", ! r); ! log_tr(buf); ! } # else ! redraw_asap(CLEAR); # endif + } } key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; *************** *** 4563,4581 **** return -1; /* when mouse reporting is SGR, add 32 to mouse code */ ! if (key_name[0] == KS_SGR_MOUSE) ! mouse_code += 32; mouse_col = getdigits(&p) - 1; if (*p++ != ';') return -1; mouse_row = getdigits(&p) - 1; ! if (key_name[0] == KS_SGR_MOUSE && *p == 'm') mouse_code |= MOUSE_RELEASE; ! else if (*p != 'M') return -1; ! p++; slen += (int)(p - (tp + slen)); --- 4534,4552 ---- return -1; /* when mouse reporting is SGR, add 32 to mouse code */ ! if (key_name[0] == KS_SGR_MOUSE) ! mouse_code += 32; mouse_col = getdigits(&p) - 1; if (*p++ != ';') return -1; mouse_row = getdigits(&p) - 1; ! if (key_name[0] == KS_SGR_MOUSE && *p == 'm') mouse_code |= MOUSE_RELEASE; ! else if (*p != 'M') return -1; ! p++; slen += (int)(p - (tp + slen)); *************** *** 4592,4598 **** for (slen2 = slen; slen2 < len; slen2++) { if (tp[slen2] == 'M' ! || (key_name[0] == KS_SGR_MOUSE && tp[slen2] == 'm')) { cmd_complete = 1; --- 4563,4569 ---- for (slen2 = slen; slen2 < len; slen2++) { if (tp[slen2] == 'M' ! || (key_name[0] == KS_SGR_MOUSE && tp[slen2] == 'm')) { cmd_complete = 1; *************** *** 5769,5774 **** --- 5740,5748 ---- * termcap codes from the terminal itself. * We get them one by one to avoid a very long response string. */ + static int xt_index_in = 0; + static int xt_index_out = 0; + static void req_codes_from_term() { *** ../vim-7.4.388/src/proto/term.pro 2014-07-09 19:13:45.007701718 +0200 --- src/proto/term.pro 2014-07-30 17:04:40.791525930 +0200 *************** *** 34,41 **** void settmode __ARGS((int tmode)); void starttermcap __ARGS((void)); void stoptermcap __ARGS((void)); - int did_request_esc_sequence __ARGS((void)); - void resume_get_esc_sequence __ARGS((void)); void may_req_termresponse __ARGS((void)); void may_req_ambiguous_char_width __ARGS((void)); int swapping_screen __ARGS((void)); --- 34,39 ---- *** ../vim-7.4.388/src/version.c 2014-07-30 16:44:17.503534723 +0200 --- src/version.c 2014-07-30 17:03:13.715526556 +0200 *************** *** 736,737 **** --- 736,739 ---- { /* Add new patch number below this line */ + /**/ + 389, /**/ -- The only way the average employee can speak to an executive is by taking a second job as a golf caddie. (Scott Adams - The Dilbert principle) /// 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 ///