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:
@@ -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*
|
||||||
|
|
||||||
|
44
src/term.c
44
src/term.c
@@ -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.
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user