mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
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.
This commit is contained in:
@@ -1902,6 +1902,26 @@ v:termresponse The escape sequence returned by the terminal for the |t_RV|
|
|||||||
always 95 or bigger). Pc is always zero.
|
always 95 or bigger). Pc is always zero.
|
||||||
{only when compiled with |+termresponse| feature}
|
{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* *testing-variable*
|
||||||
v:testing Must be set before using `test_garbagecollect_now()`.
|
v:testing Must be set before using `test_garbagecollect_now()`.
|
||||||
Also, when set certain error messages won't be shown for 2
|
Also, when set certain error messages won't be shown for 2
|
||||||
|
@@ -187,6 +187,10 @@ static struct vimvar
|
|||||||
{VV_NAME("t_none", VAR_NUMBER), VV_RO},
|
{VV_NAME("t_none", VAR_NUMBER), VV_RO},
|
||||||
{VV_NAME("t_job", VAR_NUMBER), VV_RO},
|
{VV_NAME("t_job", VAR_NUMBER), VV_RO},
|
||||||
{VV_NAME("t_channel", 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 */
|
/* shorthand */
|
||||||
|
73
src/term.c
73
src/term.c
@@ -1369,9 +1369,7 @@ static int need_gather = FALSE; /* need to fill termleader[] */
|
|||||||
static char_u termleader[256 + 1]; /* for check_termcode() */
|
static char_u termleader[256 + 1]; /* for check_termcode() */
|
||||||
#ifdef FEAT_TERMRESPONSE
|
#ifdef FEAT_TERMRESPONSE
|
||||||
static int check_for_codes = FALSE; /* check for key code response */
|
static int check_for_codes = FALSE; /* check for key code response */
|
||||||
# ifdef MACOS
|
static int is_not_xterm = FALSE; /* recognized not-really-xterm */
|
||||||
static int is_terminal_app = FALSE; /* recognized Terminal.app */
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct builtin_term *
|
static struct builtin_term *
|
||||||
@@ -3506,13 +3504,10 @@ may_req_ambiguous_char_width(void)
|
|||||||
/*
|
/*
|
||||||
* Similar to requesting the version string: Request the terminal background
|
* Similar to requesting the version string: Request the terminal background
|
||||||
* color when it is the right moment.
|
* color when it is the right moment.
|
||||||
* Also request the cursor shape, if possible.
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
may_req_bg_color(void)
|
may_req_bg_color(void)
|
||||||
{
|
{
|
||||||
int did_one = FALSE;
|
|
||||||
|
|
||||||
if (can_get_termresponse() && starting == 0)
|
if (can_get_termresponse() && starting == 0)
|
||||||
{
|
{
|
||||||
/* Only request background if t_RB is set and 'background' wasn't
|
/* 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");
|
LOG_TR("Sending BG request");
|
||||||
out_str(T_RBG);
|
out_str(T_RBG);
|
||||||
rbg_status = STATUS_SENT;
|
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
|
/* check for the characters now, otherwise they might be eaten by
|
||||||
* get_keystroke() */
|
* get_keystroke() */
|
||||||
out_flush();
|
out_flush();
|
||||||
@@ -4505,6 +4487,9 @@ check_termcode(
|
|||||||
key_name[0] = (int)KS_EXTRA;
|
key_name[0] = (int)KS_EXTRA;
|
||||||
key_name[1] = (int)KE_IGNORE;
|
key_name[1] = (int)KE_IGNORE;
|
||||||
slen = i + 1;
|
slen = i + 1;
|
||||||
|
# ifdef FEAT_EVAL
|
||||||
|
set_vim_var_string(VV_TERMU7RESP, tp, slen);
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@@ -4530,6 +4515,8 @@ check_termcode(
|
|||||||
|
|
||||||
if (tp[1 + (tp[0] != CSI)] == '>' && semicols == 2)
|
if (tp[1 + (tp[0] != CSI)] == '>' && semicols == 2)
|
||||||
{
|
{
|
||||||
|
int need_flush = FALSE;
|
||||||
|
|
||||||
/* Only set 'ttymouse' automatically if it was not set
|
/* Only set 'ttymouse' automatically if it was not set
|
||||||
* by the user already. */
|
* by the user already. */
|
||||||
if (!option_was_set((char_u *)"ttym"))
|
if (!option_was_set((char_u *)"ttym"))
|
||||||
@@ -4566,35 +4553,53 @@ check_termcode(
|
|||||||
may_adjust_color_count(256);
|
may_adjust_color_count(256);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Detect terminals that set $TERM to something like
|
||||||
|
* "xterm-256colors" but are not fully xterm
|
||||||
|
* compatible. */
|
||||||
# ifdef MACOS
|
# ifdef MACOS
|
||||||
/* Mac Terminal.app sends 1;95;0 */
|
/* Mac Terminal.app sends 1;95;0 */
|
||||||
if (col == 95
|
if (col == 95
|
||||||
&& STRNCMP(tp + extra - 2, "1;95;0c", 7) == 0)
|
&& STRNCMP(tp + extra - 2, "1;95;0c", 7) == 0)
|
||||||
{
|
is_not_xterm = TRUE;
|
||||||
/* Terminal.app sets $TERM to "xterm-256colors",
|
|
||||||
* but it's not fully xterm compatible. */
|
|
||||||
is_terminal_app = TRUE;
|
|
||||||
}
|
|
||||||
# endif
|
# 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
|
/* Only request the cursor style if t_SH and t_RS are
|
||||||
* set. Not for Terminal.app, it can't handle t_RS, it
|
* set. Not for Terminal.app, it can't handle t_RS, it
|
||||||
* echoes the characters to the screen. */
|
* echoes the characters to the screen. */
|
||||||
if (rcs_status == STATUS_GET
|
if (rcs_status == STATUS_GET
|
||||||
# ifdef MACOS
|
&& !is_not_xterm
|
||||||
&& !is_terminal_app
|
|
||||||
# endif
|
|
||||||
&& *T_CSH != NUL
|
&& *T_CSH != NUL
|
||||||
&& *T_CRS != NUL)
|
&& *T_CRS != NUL)
|
||||||
{
|
{
|
||||||
LOG_TR("Sending cursor style request");
|
LOG_TR("Sending cursor style request");
|
||||||
out_str(T_CRS);
|
out_str(T_CRS);
|
||||||
rcs_status = STATUS_SENT;
|
rcs_status = STATUS_SENT;
|
||||||
out_flush();
|
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
|
# ifdef FEAT_EVAL
|
||||||
set_vim_var_string(VV_TERMRESPONSE, tp, i + 1);
|
set_vim_var_string(VV_TERMRESPONSE, tp, slen);
|
||||||
# endif
|
# endif
|
||||||
# ifdef FEAT_AUTOCMD
|
# ifdef FEAT_AUTOCMD
|
||||||
apply_autocmds(EVENT_TERMRESPONSE,
|
apply_autocmds(EVENT_TERMRESPONSE,
|
||||||
@@ -4602,7 +4607,6 @@ check_termcode(
|
|||||||
# endif
|
# endif
|
||||||
key_name[0] = (int)KS_EXTRA;
|
key_name[0] = (int)KS_EXTRA;
|
||||||
key_name[1] = (int)KE_IGNORE;
|
key_name[1] = (int)KE_IGNORE;
|
||||||
slen = i + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check blinking cursor from xterm:
|
/* Check blinking cursor from xterm:
|
||||||
@@ -4626,6 +4630,9 @@ check_termcode(
|
|||||||
key_name[0] = (int)KS_EXTRA;
|
key_name[0] = (int)KS_EXTRA;
|
||||||
key_name[1] = (int)KE_IGNORE;
|
key_name[1] = (int)KE_IGNORE;
|
||||||
slen = i + 1;
|
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
|
/* Sometimes the 0x07 is followed by 0x18, unclear
|
||||||
* when this happens. */
|
* when this happens. */
|
||||||
++slen;
|
++slen;
|
||||||
|
# ifdef FEAT_EVAL
|
||||||
|
set_vim_var_string(VV_TERMRGBRESP, tp, slen);
|
||||||
|
# endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == len)
|
if (i == len)
|
||||||
@@ -4788,6 +4798,9 @@ check_termcode(
|
|||||||
key_name[0] = (int)KS_EXTRA;
|
key_name[0] = (int)KS_EXTRA;
|
||||||
key_name[1] = (int)KE_IGNORE;
|
key_name[1] = (int)KE_IGNORE;
|
||||||
slen = i + 1 + (tp[i] == ESC);
|
slen = i + 1 + (tp[i] == ESC);
|
||||||
|
# ifdef FEAT_EVAL
|
||||||
|
set_vim_var_string(VV_TERMSTYLERESP, tp, slen);
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -769,6 +769,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1016,
|
||||||
/**/
|
/**/
|
||||||
1015,
|
1015,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -2012,7 +2012,11 @@ typedef int sock_T;
|
|||||||
#define VV_TYPE_NONE 78
|
#define VV_TYPE_NONE 78
|
||||||
#define VV_TYPE_JOB 79
|
#define VV_TYPE_JOB 79
|
||||||
#define VV_TYPE_CHANNEL 80
|
#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 */
|
/* used for v_number in VAR_SPECIAL */
|
||||||
#define VVAL_FALSE 0L
|
#define VVAL_FALSE 0L
|
||||||
|
Reference in New Issue
Block a user