summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/evalvars.c5
-rw-r--r--src/term.c5
-rw-r--r--src/testdir/test_termcodes.vim31
-rw-r--r--src/version.c2
4 files changed, 41 insertions, 2 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index 132de4c717..793f5632c2 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1343,6 +1343,11 @@ skip_var_one(char_u *arg, int include_type)
if (*arg == '@' && arg[1] != NUL)
return arg + 2;
+
+ // termcap option name may have non-alpha characters
+ if (STRNCMP(arg, "&t_", 3) == 0 && arg[3] != NUL && arg[4] != NUL)
+ return arg + 5;
+
end = find_name_end(*arg == '$' || *arg == '&' ? arg + 1 : arg,
NULL, NULL, FNE_INCL_BR | FNE_CHECK_START);
diff --git a/src/term.c b/src/term.c
index 4d43139e9b..b626aef26e 100644
--- a/src/term.c
+++ b/src/term.c
@@ -4720,7 +4720,7 @@ handle_version_response(int first, int *arg, int argc, char_u *tp)
// 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}
+ // Kitty up to 9.x sends 1;400{version};{secondary-version}
if (arg[0] == 1 && arg[1] >= 4000 && arg[1] <= 4009)
{
term_props[TPR_KITTY].tpr_status = TPR_YES;
@@ -5520,7 +5520,8 @@ check_termcode(
// no match for "code;*X" with "code;"
continue;
else if (termcodes[idx].code[modslen] == '@'
- && (tp[modslen] != '1' || tp[modslen + 1] != ';'))
+ && (tp[modslen] != '1'
+ || tp[modslen + 1] != ';'))
// no match for "<Esc>[@" with "<Esc>[1;"
continue;
else
diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim
index 8715ebf146..6d1d39682f 100644
--- a/src/testdir/test_termcodes.vim
+++ b/src/testdir/test_termcodes.vim
@@ -2531,6 +2531,37 @@ func Test_special_term_keycodes()
bw!
endfunc
+func Test_home_key_works()
+ " The '@' character in K_HOME must only match "1" when followed by ";",
+ " otherwise this code for Home is not recognized: "<Esc>[1~"
+ " Set termcap values like "xterm" uses them.
+ let save_kh = &t_kh
+ let save_K1 = &t_K1
+ let save_k2 = &t_k2
+ let save_k3 = &t_k3
+ let save_end = &t_@7
+ let &t_K1 = "\<Esc>[1;*~" " <kHome>
+ let &t_kh = "\<Esc>[@;*H" " <Home>
+ let &t_k2 = "\<Esc>O*H[1;*~" " use <F2> for <xHome>
+ let &t_k3 = "\<Esc>[7;*~" " use <F3> for <zHome>
+ let &t_@7 = "\<Esc>[@;*F" " <End>
+
+ new
+ call feedkeys("i\<C-K>\<Esc>OH\n\<Esc>", 'tx')
+ call feedkeys("i\<C-K>\<Esc>[1~\n\<Esc>", 'tx')
+ call assert_equal([
+ \ '<Home>',
+ \ '<kHome>',
+ \ ''], getline(1, '$'))
+
+ bwipe!
+ let &t_kh = save_kh
+ let &t_K1 = save_K1
+ let &t_k2 = save_k2
+ let &t_k3 = save_k3
+ let &t_@7 = save_end
+endfunc
+
func Test_terminal_builtin_without_gui()
CheckNotMSWindows
diff --git a/src/version.c b/src/version.c
index e6526e0279..927f9c00ca 100644
--- 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 */
/**/
+ 890,
+/**/
889,
/**/
888,