Problem: Kitty terminal is not recognized.
Solution: Recognize Kitty by the termresponse and then do not set
seenModifyOtherKeys, since Kitty doesn't support that.
(issue #11413)
cursor_blink_mode whether sending |t_RC| works **
underline_rgb whether |t_8u| works **
mouse mouse type supported
+ kitty whether Kitty terminal was detected
** value 'u' for unknown, 'y' for yes, 'n' for no
#define TPR_UNDERLINE_RGB 2
// mouse support - TPR_MOUSE_XTERM, TPR_MOUSE_XTERM2 or TPR_MOUSE_SGR
#define TPR_MOUSE 3
+// term response indicates kitty
+#define TPR_KITTY 4
// table size
-#define TPR_COUNT 4
+#define TPR_COUNT 5
static termprop_T term_props[TPR_COUNT];
term_props[TPR_UNDERLINE_RGB].tpr_set_by_termresponse = TRUE;
term_props[TPR_MOUSE].tpr_name = "mouse";
term_props[TPR_MOUSE].tpr_set_by_termresponse = TRUE;
+ term_props[TPR_KITTY].tpr_name = "kitty";
+ term_props[TPR_KITTY].tpr_set_by_termresponse = FALSE;
for (i = 0; i < TPR_COUNT; ++i)
if (all || term_props[i].tpr_set_by_termresponse)
// else if (version == 115 && arg[0] == 0 && arg[2] == 0)
// term_props[TPR_UNDERLINE_RGB].tpr_status = TPR_YES;
+ // Kitty sends 1;400{version};{secondary-version}
+ if (arg[0] == 1 && arg[1] >= 4000 && arg[1] <= 4009)
+ {
+ term_props[TPR_KITTY].tpr_status = TPR_YES;
+ term_props[TPR_KITTY].tpr_set_by_termresponse = TRUE;
+ }
+
// GNU screen sends 83;30600;0, 83;40500;0, etc.
// 30600/40500 is a version number of GNU screen. DA2 support is added
// on 3.6. DCS string has a special meaning to GNU screen, but xterm
int modifiers;
char_u string[MAX_KEY_CODE_LEN + 1];
- seenModifyOtherKeys = TRUE;
+ // Do not set seenModifyOtherKeys for kitty, it does send some sequences
+ // like this but does not have the modifyOtherKeys feature.
+ if (term_props[TPR_KITTY].tpr_status != TPR_YES)
+ seenModifyOtherKeys = TRUE;
+
if (trail == 'u')
key = arg[0];
else
\ cursor_style: 'u',
\ cursor_blink_mode: 'u',
\ underline_rgb: 'u',
- \ mouse: 's'
+ \ mouse: 's',
+ \ kitty: 'u',
\ }, terminalprops())
set t_RV=
\ cursor_style: 'n',
\ cursor_blink_mode: 'u',
\ underline_rgb: 'u',
- \ mouse: 's'
+ \ mouse: 's',
+ \ kitty: 'u',
\ }, terminalprops())
set t_RV=
\ cursor_style: 'n',
\ cursor_blink_mode: 'u',
\ underline_rgb: 'u',
- \ mouse: 's'
+ \ mouse: 's',
+ \ kitty: 'u',
\ }, terminalprops())
endfunc
\ cursor_style: 'n',
\ cursor_blink_mode: 'u',
\ underline_rgb: 'y',
- \ mouse: 's'
+ \ mouse: 's',
+ \ kitty: 'u',
\ }, terminalprops())
call assert_equal("\<Esc>[58;2;%lu;%lu;%lum", &t_8u)
\ cursor_style: 'n',
\ cursor_blink_mode: 'u',
\ underline_rgb: 'y',
- \ mouse: 's'
+ \ mouse: 's',
+ \ kitty: 'u',
\ }, terminalprops())
set t_RV=
\ cursor_style: 'n',
\ cursor_blink_mode: 'n',
\ underline_rgb: 'y',
- \ mouse: 's'
+ \ mouse: 's',
+ \ kitty: 'u',
\ }, terminalprops())
set t_RV=
\ cursor_style: 'u',
\ cursor_blink_mode: 'u',
\ underline_rgb: 'u',
- \ mouse: 's'
+ \ mouse: 's',
+ \ kitty: 'u',
\ }, terminalprops())
call assert_equal(a:set_by_user ? default_value : '', &t_8u)
endfunc
\ cursor_style: 'n',
\ cursor_blink_mode: 'u',
\ underline_rgb: 'y',
- \ mouse: 'u'
+ \ mouse: 'u',
+ \ kitty: 'u',
\ }, terminalprops())
" xterm >= 95 < 277 "xterm2"
\ cursor_style: 'n',
\ cursor_blink_mode: 'u',
\ underline_rgb: 'u',
- \ mouse: '2'
+ \ mouse: '2',
+ \ kitty: 'u',
\ }, terminalprops())
" xterm >= 277: "sgr"
\ cursor_style: 'n',
\ cursor_blink_mode: 'u',
\ underline_rgb: 'u',
- \ mouse: 's'
+ \ mouse: 's',
+ \ kitty: 'u',
\ }, terminalprops())
" xterm >= 279: "sgr" and cursor_style not reset; also check t_8u reset,
call test_override('term_props', 0)
endfunc
+func Test_xx08_kitty_response()
+ " Termresponse is only parsed when t_RV is not empty.
+ set t_RV=x
+ call test_override('term_props', 1)
+
+ set ttymouse=xterm
+ call test_option_not_set('ttymouse')
+ let seq = "\<Esc>[>1;4001;12c"
+ call feedkeys(seq, 'Lx!')
+ call assert_equal(seq, v:termresponse)
+ call assert_equal('sgr', &ttymouse)
+
+ call assert_equal(#{
+ \ cursor_style: 'u',
+ \ cursor_blink_mode: 'u',
+ \ underline_rgb: 'y',
+ \ mouse: 's',
+ \ kitty: 'y',
+ \ }, terminalprops())
+
+ set t_RV=
+ call test_override('term_props', 0)
+endfunc
+
func Test_focus_events()
let save_term = &term
let save_ttymouse = &ttymouse
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 813,
/**/
812,
/**/