1
0
forked from aniani/vim

patch 9.0.1073: using "xterm-kitty" for 'term' causes problems

Problem:    Using "xterm-kitty" for 'term' causes problems.
Solution:   Remove the "xterm-" part when 'term' is set from $TERM.  Detect a
            few kitty-specific properties based on the version response
            instead of the terminal name.
This commit is contained in:
Bram Moolenaar
2022-12-18 17:47:18 +00:00
parent ba2d191932
commit 731d00770d
3 changed files with 59 additions and 7 deletions

View File

@@ -294,6 +294,26 @@ When Vim receives a response to the |t_RV| (request version) sequence and it
starts with CSI, it assumes that the terminal is in 8-bit mode and will starts with CSI, it assumes that the terminal is in 8-bit mode and will
convert all key sequences to their 8-bit variants. convert all key sequences to their 8-bit variants.
*xterm-kitty* *kitty-terminal*
The Kitty terminal is a special case. Mainly because it works different from
most other terminals, but also because, instead of trying the fit in and make
it behave like other terminals by default, it dictates how applications need
to work when using Kitty. This makes it very difficult for Vim to work in a
Kitty terminal. Some exceptions have been hard coded, but it is not at all
nice to have to make exceptions for one specific terminal.
One of the problems is that the value for $TERM is set to "xterm-kitty". For
Vim this is an indication that the terminal is xterm-compatible and the
builtin xterm termcap entries should be used. Many other terminals depend on
this. However, Kitty is not fully xterm compatible. The author suggested to
ignore the "xterm-" prefix and use the terminfo entry anyway, but that
conflicts with what is needed for other terminals. Therefore Vim removes the
"xterm-" prefix from "xterm-kitty" when it comes from $TERM.
Note that using the kitty keyboard protocol is a separate feature, see
|kitty-keyboard-protocol|.
============================================================================== ==============================================================================
2. Terminal options *terminal-options* *termcap-options* *E436* 2. Terminal options *terminal-options* *termcap-options* *E436*

View File

@@ -2071,6 +2071,12 @@ set_termname(char_u *term)
else else
T_CCS = empty_option; T_CCS = empty_option;
// Special case: "kitty" does not normally have a "RV" entry in terminfo,
// but we need to request the version for several other things to work.
if (strstr((char *)term, "kitty") != NULL
&& (T_CRV == NULL || *T_CRV == NUL))
T_CRV = (char_u *)"\033[>c";
#ifdef UNIX #ifdef UNIX
/* /*
* Any "stty" settings override the default for t_kb from the termcap. * Any "stty" settings override the default for t_kb from the termcap.
@@ -2599,15 +2605,34 @@ tgoto(char *cm, int x, int y)
void void
termcapinit(char_u *name) termcapinit(char_u *name)
{ {
char_u *term; char_u *term = name;
if (name != NULL && *name == NUL) if (term != NULL && *term == NUL)
name = NULL; // empty name is equal to no name term = NULL; // empty name is equal to no name
term = name;
#ifndef MSWIN #ifndef MSWIN
char_u *tofree = NULL;
if (term == NULL) if (term == NULL)
{
term = mch_getenv((char_u *)"TERM"); term = mch_getenv((char_u *)"TERM");
// "xterm-kitty" is used for Kitty, but it is not actually compatible
// with xterm. Remove the "xterm-" part to avoid trouble.
if (term != NULL && STRNCMP(term, "xterm-kitty", 11) == 0)
{
#ifdef FEAT_EVAL
ch_log(NULL, "Removing xterm- prefix from terminal name %s", term);
#endif
if (p_verbose > 0)
{
verbose_enter();
smsg(_("Removing xterm- prefix from terminal name %s"), term);
verbose_leave();
}
term = vim_strsave(term + 6);
tofree = term;
}
}
#endif #endif
if (term == NULL || *term == NUL) if (term == NULL || *term == NUL)
term = DEFAULT_TERM; term = DEFAULT_TERM;
@@ -2617,10 +2642,12 @@ termcapinit(char_u *name)
set_string_default("term", term); set_string_default("term", term);
set_string_default("ttytype", term); set_string_default("ttytype", term);
/* // Avoid using "term" here, because the next mch_getenv() may overwrite it.
* Avoid using "term" here, because the next mch_getenv() may overwrite it.
*/
set_termname(T_NAME != NULL ? T_NAME : term); set_termname(T_NAME != NULL ? T_NAME : term);
#ifndef MSWIN
vim_free(tofree);
#endif
} }
/* /*
@@ -4999,6 +5026,9 @@ handle_version_response(int first, int *arg, int argc, char_u *tp)
{ {
term_props[TPR_KITTY].tpr_status = TPR_YES; term_props[TPR_KITTY].tpr_status = TPR_YES;
term_props[TPR_KITTY].tpr_set_by_termresponse = TRUE; term_props[TPR_KITTY].tpr_set_by_termresponse = TRUE;
// Kitty can handle SGR mouse reporting.
term_props[TPR_MOUSE].tpr_status = TPR_MOUSE_SGR;
} }
// GNU screen sends 83;30600;0, 83;40500;0, etc. // GNU screen sends 83;30600;0, 83;40500;0, etc.

View File

@@ -695,6 +695,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 */
/**/
1073,
/**/ /**/
1072, 1072,
/**/ /**/