changeset 31481:7f79eb4ad11a v9.0.1073

patch 9.0.1073: using "xterm-kitty" for 'term' causes problems Commit: https://github.com/vim/vim/commit/731d00770d9006e7dab6a66e2ea86603ed5ef212 Author: Bram Moolenaar <Bram@vim.org> 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.
author Bram Moolenaar <Bram@vim.org>
date Sun, 18 Dec 2022 19:00:06 +0100
parents 4362410023f9
children ac877632b863
files runtime/doc/term.txt src/term.c src/version.c
diffstat 3 files changed, 60 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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*
 
--- 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.
--- 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,