forked from aniani/vim
patch 9.0.0655: passing modifier codes to a shell running in the GUI
Problem: passing modifier codes to a shell running in the GUI. (Gary Johnson) Solution: Include modifier codes into the key and drop the modifiers.
This commit is contained in:
@@ -5106,7 +5106,8 @@ mch_call_shell_fork(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
len = term_replace_bs_del_keycode(ta_buf, ta_len, len);
|
// Remove Vim-specific codes from the input.
|
||||||
|
len = term_replace_keycodes(ta_buf, ta_len, len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For pipes: echo the typed characters.
|
* For pipes: echo the typed characters.
|
||||||
|
@@ -4531,7 +4531,7 @@ mch_system_piped(char *cmd, int options)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
len = term_replace_bs_del_keycode(ta_buf, ta_len, len);
|
len = term_replace_keycodes(ta_buf, ta_len, len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For pipes: echo the typed characters. For a pty this
|
* For pipes: echo the typed characters. For a pty this
|
||||||
|
@@ -86,5 +86,5 @@ void update_tcap(int attr);
|
|||||||
void swap_tcap(void);
|
void swap_tcap(void);
|
||||||
void ansi_color2rgb(int nr, char_u *r, char_u *g, char_u *b, char_u *ansi_idx);
|
void ansi_color2rgb(int nr, char_u *r, char_u *g, char_u *b, char_u *ansi_idx);
|
||||||
void cterm_color2rgb(int nr, char_u *r, char_u *g, char_u *b, char_u *ansi_idx);
|
void cterm_color2rgb(int nr, char_u *r, char_u *g, char_u *b, char_u *ansi_idx);
|
||||||
int term_replace_bs_del_keycode(char_u *ta_buf, int ta_len, int len_arg);
|
int term_replace_keycodes(char_u *ta_buf, int ta_len, int len_arg);
|
||||||
/* vim: set ft=c : */
|
/* vim: set ft=c : */
|
||||||
|
20
src/term.c
20
src/term.c
@@ -6734,10 +6734,11 @@ cterm_color2rgb(int nr, char_u *r, char_u *g, char_u *b, char_u *ansi_idx)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Replace K_BS by <BS> and K_DEL by <DEL>.
|
* Replace K_BS by <BS> and K_DEL by <DEL>.
|
||||||
|
* Include any modifiers into the key and drop them.
|
||||||
* Returns "len" adjusted for replaced codes.
|
* Returns "len" adjusted for replaced codes.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
term_replace_bs_del_keycode(char_u *ta_buf, int ta_len, int len_arg)
|
term_replace_keycodes(char_u *ta_buf, int ta_len, int len_arg)
|
||||||
{
|
{
|
||||||
int len = len_arg;
|
int len = len_arg;
|
||||||
int i;
|
int i;
|
||||||
@@ -6745,13 +6746,26 @@ term_replace_bs_del_keycode(char_u *ta_buf, int ta_len, int len_arg)
|
|||||||
|
|
||||||
for (i = ta_len; i < ta_len + len; ++i)
|
for (i = ta_len; i < ta_len + len; ++i)
|
||||||
{
|
{
|
||||||
if (ta_buf[i] == CSI && len - i > 2)
|
if (ta_buf[i] == CSI && len - i > 3 && ta_buf[i + 1] == KS_MODIFIER)
|
||||||
|
{
|
||||||
|
int modifiers = ta_buf[i + 2];
|
||||||
|
int key = ta_buf[i + 3];
|
||||||
|
|
||||||
|
// Try to use the modifier to modify the key. In any case drop the
|
||||||
|
// modifier.
|
||||||
|
mch_memmove(ta_buf + i + 1, ta_buf + i + 4, (size_t)(len - i - 3));
|
||||||
|
len -= 3;
|
||||||
|
if (key < 0x80)
|
||||||
|
key = merge_modifyOtherKeys(key, &modifiers);
|
||||||
|
ta_buf[i] = key;
|
||||||
|
}
|
||||||
|
else if (ta_buf[i] == CSI && len - i > 2)
|
||||||
{
|
{
|
||||||
c = TERMCAP2KEY(ta_buf[i + 1], ta_buf[i + 2]);
|
c = TERMCAP2KEY(ta_buf[i + 1], ta_buf[i + 2]);
|
||||||
if (c == K_DEL || c == K_KDEL || c == K_BS)
|
if (c == K_DEL || c == K_KDEL || c == K_BS)
|
||||||
{
|
{
|
||||||
mch_memmove(ta_buf + i + 1, ta_buf + i + 3,
|
mch_memmove(ta_buf + i + 1, ta_buf + i + 3,
|
||||||
(size_t)(len - i - 2));
|
(size_t)(len - i - 2));
|
||||||
if (c == K_DEL || c == K_KDEL)
|
if (c == K_DEL || c == K_KDEL)
|
||||||
ta_buf[i] = DEL;
|
ta_buf[i] = DEL;
|
||||||
else
|
else
|
||||||
|
@@ -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 */
|
||||||
|
/**/
|
||||||
|
655,
|
||||||
/**/
|
/**/
|
||||||
654,
|
654,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user