# HG changeset patch # User Christian Brabandt # Date 1504098005 -7200 # Node ID c952a6af25e0e27f029f425b73fd5b28e49f3b92 # Parent e6560b4c47e04b429b6d436831cabffb72b6d347 patch 8.0.1016: gnome terminal echoes t_RC commit https://github.com/vim/vim/commit/f3af54eeb1575618b866aa837e7aca7665aca196 Author: Bram Moolenaar Date: Wed Aug 30 14:53:06 2017 +0200 patch 8.0.1016: gnome terminal echoes t_RC Problem: Gnome terminal echoes t_RC. Solution: Detect Gnome terminal by the version string. Add v: variables for all the term responses. diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1902,6 +1902,26 @@ v:termresponse The escape sequence retur always 95 or bigger). Pc is always zero. {only when compiled with |+termresponse| feature} + *v:termblinkresp* +v:termblinkresp The escape sequence returned by the terminal for the |t_RC| + termcap entry. This is used to find out whether the terminal + cursor is blinking. This is used by |term_getcursor()|. + + *v:termstyleresp* +v:termstyleresp The escape sequence returned by the terminal for the |t_RS| + termcap entry. This is used to find out what the shape of the + cursor is. This is used by |term_getcursor()|. + + *v:termrgbresp* +v:termrgbresp The escape sequence returned by the terminal for the |t_RB| + termcap entry. This is used to find out what the terminal + background color is, see 'background'. + + *v:termu7resp* +v:termu7resp The escape sequence returned by the terminal for the |t_u7| + termcap entry. This is used to find out what the terminal + does with ambiguous width characters, see 'ambiwidth'. + *v:testing* *testing-variable* v:testing Must be set before using `test_garbagecollect_now()`. Also, when set certain error messages won't be shown for 2 diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -187,6 +187,10 @@ static struct vimvar {VV_NAME("t_none", VAR_NUMBER), VV_RO}, {VV_NAME("t_job", VAR_NUMBER), VV_RO}, {VV_NAME("t_channel", VAR_NUMBER), VV_RO}, + {VV_NAME("termrgbresp", VAR_STRING), VV_RO}, + {VV_NAME("termu7resp", VAR_STRING), VV_RO}, + {VV_NAME("termstyleresp", VAR_STRING), VV_RO}, + {VV_NAME("termblinkresp", VAR_STRING), VV_RO}, }; /* shorthand */ diff --git a/src/term.c b/src/term.c --- a/src/term.c +++ b/src/term.c @@ -1369,9 +1369,7 @@ static int need_gather = FALSE; /* n static char_u termleader[256 + 1]; /* for check_termcode() */ #ifdef FEAT_TERMRESPONSE static int check_for_codes = FALSE; /* check for key code response */ -# ifdef MACOS -static int is_terminal_app = FALSE; /* recognized Terminal.app */ -# endif +static int is_not_xterm = FALSE; /* recognized not-really-xterm */ #endif static struct builtin_term * @@ -3506,13 +3504,10 @@ may_req_ambiguous_char_width(void) /* * Similar to requesting the version string: Request the terminal background * color when it is the right moment. - * Also request the cursor shape, if possible. */ void may_req_bg_color(void) { - int did_one = FALSE; - if (can_get_termresponse() && starting == 0) { /* Only request background if t_RB is set and 'background' wasn't @@ -3524,20 +3519,7 @@ may_req_bg_color(void) LOG_TR("Sending BG request"); out_str(T_RBG); rbg_status = STATUS_SENT; - did_one = TRUE; - } - - /* Only request cursor blinking mode if t_RC is set. */ - if (rbm_status == STATUS_GET && *T_CRC != NUL) - { - LOG_TR("Sending BC request"); - out_str(T_CRC); - rbm_status = STATUS_SENT; - did_one = TRUE; - } - - if (did_one) - { + /* check for the characters now, otherwise they might be eaten by * get_keystroke() */ out_flush(); @@ -4505,6 +4487,9 @@ check_termcode( key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; slen = i + 1; +# ifdef FEAT_EVAL + set_vim_var_string(VV_TERMU7RESP, tp, slen); +# endif } else #endif @@ -4530,6 +4515,8 @@ check_termcode( if (tp[1 + (tp[0] != CSI)] == '>' && semicols == 2) { + int need_flush = FALSE; + /* Only set 'ttymouse' automatically if it was not set * by the user already. */ if (!option_was_set((char_u *)"ttym")) @@ -4566,35 +4553,53 @@ check_termcode( may_adjust_color_count(256); } + /* Detect terminals that set $TERM to something like + * "xterm-256colors" but are not fully xterm + * compatible. */ # ifdef MACOS /* Mac Terminal.app sends 1;95;0 */ if (col == 95 && STRNCMP(tp + extra - 2, "1;95;0c", 7) == 0) - { - /* Terminal.app sets $TERM to "xterm-256colors", - * but it's not fully xterm compatible. */ - is_terminal_app = TRUE; - } + is_not_xterm = TRUE; # endif + /* Gnome Terminal.app sends 1;4402;0, assuming any + * version number over 4000 is not an xterm. */ + if (col >= 4000) + is_not_xterm = TRUE; /* Only request the cursor style if t_SH and t_RS are * set. Not for Terminal.app, it can't handle t_RS, it * echoes the characters to the screen. */ if (rcs_status == STATUS_GET -# ifdef MACOS - && !is_terminal_app -# endif + && !is_not_xterm && *T_CSH != NUL && *T_CRS != NUL) { LOG_TR("Sending cursor style request"); out_str(T_CRS); rcs_status = STATUS_SENT; + need_flush = TRUE; + } + + /* Only request the cursor blink mode if t_RC set. Not + * for Gnome terminal, it can't handle t_RC, it + * echoes the characters to the screen. */ + if (rbm_status == STATUS_GET + && !is_not_xterm + && *T_CRC != NUL) + { + LOG_TR("Sending cursor blink mode request"); + out_str(T_CRC); + rbm_status = STATUS_SENT; + need_flush = TRUE; + } + + if (need_flush) out_flush(); - } } + slen = i + 1; # ifdef FEAT_EVAL - set_vim_var_string(VV_TERMRESPONSE, tp, i + 1); + set_vim_var_string(VV_TERMRESPONSE, tp, slen); # endif # ifdef FEAT_AUTOCMD apply_autocmds(EVENT_TERMRESPONSE, @@ -4602,7 +4607,6 @@ check_termcode( # endif key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; - slen = i + 1; } /* Check blinking cursor from xterm: @@ -4626,6 +4630,9 @@ check_termcode( key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; slen = i + 1; +# ifdef FEAT_EVAL + set_vim_var_string(VV_TERMBLINKRESP, tp, slen); +# endif } /* @@ -4714,6 +4721,9 @@ check_termcode( /* Sometimes the 0x07 is followed by 0x18, unclear * when this happens. */ ++slen; +# ifdef FEAT_EVAL + set_vim_var_string(VV_TERMRGBRESP, tp, slen); +# endif break; } if (i == len) @@ -4788,6 +4798,9 @@ check_termcode( key_name[0] = (int)KS_EXTRA; key_name[1] = (int)KE_IGNORE; slen = i + 1 + (tp[i] == ESC); +# ifdef FEAT_EVAL + set_vim_var_string(VV_TERMSTYLERESP, tp, slen); +# endif } } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1016, +/**/ 1015, /**/ 1014, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -2012,7 +2012,11 @@ typedef int sock_T; #define VV_TYPE_NONE 78 #define VV_TYPE_JOB 79 #define VV_TYPE_CHANNEL 80 -#define VV_LEN 81 /* number of v: vars */ +#define VV_TERMRGBRESP 81 +#define VV_TERMU7RESP 82 +#define VV_TERMSTYLERESP 83 +#define VV_TERMBLINKRESP 84 +#define VV_LEN 85 /* number of v: vars */ /* used for v_number in VAR_SPECIAL */ #define VVAL_FALSE 0L