0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 9.0.1080: the "kitty" terminfo entry is not widespread

Problem:    The "kitty" terminfo entry is not widespread, resulting in the
            kitty terminal not working properly.
Solution:   Go back to using "xterm-kitty" and avoid the problems it causes in
            another way.
This commit is contained in:
Bram Moolenaar 2022-12-19 18:56:48 +00:00
parent 33e543038b
commit afa3f1cc72
4 changed files with 33 additions and 36 deletions

View File

@ -306,9 +306,14 @@ 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 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 builtin xterm termcap entries should be used. Many other terminals depend on
this. However, Kitty is not fully xterm compatible. The author suggested to this. However, Kitty is not fully xterm compatible. The author suggested to
ignore the "xterm-" prefix and use the terminfo entry anyway, but that ignore the "xterm-" prefix and use the terminfo entry anyway, so that is what
conflicts with what is needed for other terminals. Therefore Vim removes the happens now, the builtin xterm termcap entries are not used. However, the
"xterm-" prefix from "xterm-kitty" when it comes from $TERM. t_RV is set, otherwise other things would not work, such as automatically
setting 'ttymouse' to "sgr".
It is not clear why kitty sets $TERM to "xterm-kitty", the terminal isn't
really xterm compatible. "kitty" would be more appropriate, but a terminfo
entry with that name is not widespread.
Note that using the kitty keyboard protocol is a separate feature, see Note that using the kitty keyboard protocol is a separate feature, see
|kitty-keyboard-protocol|. |kitty-keyboard-protocol|.

View File

@ -2353,6 +2353,8 @@ mch_restore_title(int which)
/* /*
* Return TRUE if "name" looks like some xterm name. * Return TRUE if "name" looks like some xterm name.
* This matches "xterm.*", thus "xterm-256color", "xterm-kitty", etc. * This matches "xterm.*", thus "xterm-256color", "xterm-kitty", etc.
* Do not consider "xterm-kitty" an xterm, it is not fully xterm compatible,
* using the "xterm-kitty" terminfo entry should work better.
* Seiichi Sato mentioned that "mlterm" works like xterm. * Seiichi Sato mentioned that "mlterm" works like xterm.
*/ */
int int
@ -2360,7 +2362,8 @@ vim_is_xterm(char_u *name)
{ {
if (name == NULL) if (name == NULL)
return FALSE; return FALSE;
return (STRNICMP(name, "xterm", 5) == 0 return ((STRNICMP(name, "xterm", 5) == 0
&& STRNICMP(name, "xterm-kitty", 11) != 0)
|| STRNICMP(name, "nxterm", 6) == 0 || STRNICMP(name, "nxterm", 6) == 0
|| STRNICMP(name, "kterm", 5) == 0 || STRNICMP(name, "kterm", 5) == 0
|| STRNICMP(name, "mlterm", 6) == 0 || STRNICMP(name, "mlterm", 6) == 0

View File

@ -1675,6 +1675,12 @@ static char *(key_names[]) =
#endif #endif
#ifdef HAVE_TGETENT #ifdef HAVE_TGETENT
/*
* Get the termcap entries we need with tgetstr(), tgetflag() and tgetnum().
* "invoke_tgetent()" must have been called before.
* If "*height" or "*width" are not zero then use the "li" and "col" entries to
* get their value.
*/
static void static void
get_term_entries(int *height, int *width) get_term_entries(int *height, int *width)
{ {
@ -2033,14 +2039,6 @@ set_termname(char_u *term)
#endif #endif
parse_builtin_tcap(term); parse_builtin_tcap(term);
// Use the 'keyprotocol' option to adjust the t_TE and t_TI
// termcap entries if there is an entry maching "term".
keyprot_T kpc = match_keyprotocol(term);
if (kpc == KEYPROTOCOL_KITTY)
apply_builtin_tcap(term, builtin_kitty, TRUE);
else if (kpc == KEYPROTOCOL_MOK2)
apply_builtin_tcap(term, builtin_mok2, TRUE);
#ifdef FEAT_GUI #ifdef FEAT_GUI
if (term_is_gui(term)) if (term_is_gui(term))
{ {
@ -2060,6 +2058,19 @@ set_termname(char_u *term)
} }
#endif #endif
#ifdef FEAT_GUI
if (!gui.in_use)
#endif
{
// Use the 'keyprotocol' option to adjust the t_TE and t_TI
// termcap entries if there is an entry maching "term".
keyprot_T kpc = match_keyprotocol(term);
if (kpc == KEYPROTOCOL_KITTY)
apply_builtin_tcap(term, builtin_kitty, TRUE);
else if (kpc == KEYPROTOCOL_MOK2)
apply_builtin_tcap(term, builtin_mok2, TRUE);
}
/* /*
* special: There is no info in the termcap about whether the cursor * special: There is no info in the termcap about whether the cursor
* positioning is relative to the start of the screen or to the start of the * positioning is relative to the start of the screen or to the start of the
@ -2611,28 +2622,8 @@ termcapinit(char_u *name)
term = NULL; // empty name is equal to no name term = NULL; // empty name is equal to no 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;
@ -2644,10 +2635,6 @@ termcapinit(char_u *name)
// 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
} }
/* /*

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 */
/**/
1080,
/**/ /**/
1079, 1079,
/**/ /**/