forked from aniani/vim
patch 9.0.1957: termcap options should change when setting keyprotocol
Problem: termcap options should change on keyprotocol setting Solution: Apply termcap entries when 'keyprotocol' changes When the 'keyprotocol' option was set after startup (including in a user's .vimrc) the termcap entries associated with the matching protocol were not applied. Thus, setting the option has no affect. When 'keyprotocol' is changed it should also update the termcap entries. closes: #13211 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Gregory Anders <greg@gpanders.com>
This commit is contained in:
committed by
Christian Brabandt
parent
28a23602e8
commit
3695d0e41b
@@ -1945,9 +1945,13 @@ did_set_keymodel(optset_T *args UNUSED)
|
|||||||
char *
|
char *
|
||||||
did_set_keyprotocol(optset_T *args UNUSED)
|
did_set_keyprotocol(optset_T *args UNUSED)
|
||||||
{
|
{
|
||||||
if (match_keyprotocol(NULL) == KEYPROTOCOL_FAIL)
|
char_u *term = T_NAME;
|
||||||
|
keyprot_T kpc = match_keyprotocol(term);
|
||||||
|
if (kpc == KEYPROTOCOL_FAIL)
|
||||||
return e_invalid_argument;
|
return e_invalid_argument;
|
||||||
|
|
||||||
|
apply_keyprotocol(term, kpc);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,6 +5,7 @@ void init_term_props(int all);
|
|||||||
void f_terminalprops(typval_T *argvars, typval_T *rettv);
|
void f_terminalprops(typval_T *argvars, typval_T *rettv);
|
||||||
void set_color_count(int nr);
|
void set_color_count(int nr);
|
||||||
keyprot_T match_keyprotocol(char_u *term);
|
keyprot_T match_keyprotocol(char_u *term);
|
||||||
|
void apply_keyprotocol(char_u *term, keyprot_T prot);
|
||||||
int set_termname(char_u *term);
|
int set_termname(char_u *term);
|
||||||
void free_cur_term(void);
|
void free_cur_term(void);
|
||||||
void getlinecol(long *cp, long *rp);
|
void getlinecol(long *cp, long *rp);
|
||||||
|
27
src/term.c
27
src/term.c
@@ -1607,6 +1607,23 @@ apply_builtin_tcap(char_u *term, tcap_entry_T *entries, int overwrite)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Apply builtin termcap entries for a given keyprotocol.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
apply_keyprotocol(char_u *term, keyprot_T prot)
|
||||||
|
{
|
||||||
|
if (prot == KEYPROTOCOL_KITTY)
|
||||||
|
apply_builtin_tcap(term, builtin_kitty, TRUE);
|
||||||
|
if (prot == KEYPROTOCOL_MOK2)
|
||||||
|
apply_builtin_tcap(term, builtin_mok2, TRUE);
|
||||||
|
|
||||||
|
if (prot != KEYPROTOCOL_NONE)
|
||||||
|
// Some function keys may accept modifiers even though the
|
||||||
|
// terminfo/termcap entry does not indicate this.
|
||||||
|
accept_modifiers_for_function_keys();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parsing of the builtin termcap entries.
|
* Parsing of the builtin termcap entries.
|
||||||
* Caller should check if "term" is a valid builtin terminal name.
|
* Caller should check if "term" is a valid builtin terminal name.
|
||||||
@@ -2083,10 +2100,7 @@ set_termname(char_u *term)
|
|||||||
// Use the 'keyprotocol' option to adjust the t_TE and t_TI
|
// Use the 'keyprotocol' option to adjust the t_TE and t_TI
|
||||||
// termcap entries if there is an entry matching "term".
|
// termcap entries if there is an entry matching "term".
|
||||||
keyprot_T kpc = match_keyprotocol(term);
|
keyprot_T kpc = match_keyprotocol(term);
|
||||||
if (kpc == KEYPROTOCOL_KITTY)
|
apply_keyprotocol(term, kpc);
|
||||||
apply_builtin_tcap(term, builtin_kitty, TRUE);
|
|
||||||
else if (kpc == KEYPROTOCOL_MOK2)
|
|
||||||
apply_builtin_tcap(term, builtin_mok2, TRUE);
|
|
||||||
|
|
||||||
#ifdef FEAT_TERMGUICOLORS
|
#ifdef FEAT_TERMGUICOLORS
|
||||||
// There is no good way to detect that the terminal supports RGB
|
// There is no good way to detect that the terminal supports RGB
|
||||||
@@ -2098,11 +2112,6 @@ set_termname(char_u *term)
|
|||||||
&& term_strings_not_set(KS_8U))
|
&& term_strings_not_set(KS_8U))
|
||||||
apply_builtin_tcap(term, builtin_rgb, TRUE);
|
apply_builtin_tcap(term, builtin_rgb, TRUE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (kpc != KEYPROTOCOL_NONE)
|
|
||||||
// Some function keys may accept modifiers even though the
|
|
||||||
// terminfo/termcap entry does not indicate this.
|
|
||||||
accept_modifiers_for_function_keys();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -1861,4 +1861,18 @@ func Test_binary_depending_options()
|
|||||||
call delete('Xoutput_bin')
|
call delete('Xoutput_bin')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_set_keyprotocol()
|
||||||
|
CheckNotGui
|
||||||
|
|
||||||
|
let term = &term
|
||||||
|
set term=ansi
|
||||||
|
call assert_equal('', &t_TI)
|
||||||
|
|
||||||
|
" Setting 'keyprotocol' should affect terminal codes without needing to
|
||||||
|
" reset 'term'
|
||||||
|
set keyprotocol+=ansi:kitty
|
||||||
|
call assert_equal("\<Esc>[=1;1u", &t_TI)
|
||||||
|
let &term = term
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -699,6 +699,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 */
|
||||||
|
/**/
|
||||||
|
1957,
|
||||||
/**/
|
/**/
|
||||||
1956,
|
1956,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user