# HG changeset patch # User Bram Moolenaar # Date 1671386406 -3600 # Node ID 7f79eb4ad11a8394fecabfb442484dbb70b6149b # Parent 4362410023f99312e58f8d41fa325820e28807ec patch 9.0.1073: using "xterm-kitty" for 'term' causes problems Commit: https://github.com/vim/vim/commit/731d00770d9006e7dab6a66e2ea86603ed5ef212 Author: Bram Moolenaar Date: Sun Dec 18 17:47:18 2022 +0000 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. diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt --- a/runtime/doc/term.txt +++ b/runtime/doc/term.txt @@ -294,6 +294,26 @@ When Vim receives a response to the |t_R starts with CSI, it assumes that the terminal is in 8-bit mode and will 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* diff --git a/src/term.c b/src/term.c --- a/src/term.c +++ b/src/term.c @@ -2071,6 +2071,12 @@ set_termname(char_u *term) else 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 /* * Any "stty" settings override the default for t_kb from the termcap. @@ -2599,15 +2605,34 @@ tgoto(char *cm, int x, int y) void termcapinit(char_u *name) { - char_u *term; - - if (name != NULL && *name == NUL) - name = NULL; // empty name is equal to no name - term = name; + char_u *term = name; + + if (term != NULL && *term == NUL) + term = NULL; // empty name is equal to no name #ifndef MSWIN + char_u *tofree = NULL; if (term == NULL) + { 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 if (term == NULL || *term == NUL) term = DEFAULT_TERM; @@ -2617,10 +2642,12 @@ termcapinit(char_u *name) set_string_default("term", 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); + +#ifndef MSWIN + vim_free(tofree); +#endif } /* @@ -4999,6 +5026,9 @@ handle_version_response(int first, int * { term_props[TPR_KITTY].tpr_status = TPR_YES; 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. diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1073, +/**/ 1072, /**/ 1071,