1
0
forked from aniani/vim

patch 8.2.2246: cursor keys not recognized at the hit-Enter prompt

Problem:    Cursor keys not recognized at the hit-Enter prompt after executing
            an external command.
Solution:   Change the codes for the extra cursor keys. (closes #7562)
            Tune the delays to avoid test flakyness.
This commit is contained in:
Bram Moolenaar
2020-12-29 20:53:33 +01:00
parent 285b15fce1
commit 4d8c96d466
4 changed files with 33 additions and 12 deletions

View File

@@ -217,6 +217,10 @@ it's different from Alt). They can be combined. Examples: >
Another speciality about these codes is that they are not overwritten by Another speciality about these codes is that they are not overwritten by
another code. That is to avoid that the codes obtained from xterm directly another code. That is to avoid that the codes obtained from xterm directly
|t_RV| overwrite them. |t_RV| overwrite them.
Another special value is a termcap entry ending in "@;*X". This is for cursor
keys, which either use "CSI X" or "CSI 1 ; modifier X". Thus the "@"
stands for either "1" if a modifier follows, or nothing.
*xterm-scroll-region* *xterm-scroll-region*
The default termcap entry for xterm on Sun and other platforms does not The default termcap entry for xterm on Sun and other platforms does not
contain the entry for scroll regions. Add ":cs=\E[%i%d;%dr:" to the xterm contain the entry for scroll regions. Add ":cs=\E[%i%d;%dr:" to the xterm

View File

@@ -914,10 +914,10 @@ static struct builtin_term builtin_termcaps[] =
{K_RIGHT, IF_EB("\033O*C", ESC_STR "O*C")}, {K_RIGHT, IF_EB("\033O*C", ESC_STR "O*C")},
{K_LEFT, IF_EB("\033O*D", ESC_STR "O*D")}, {K_LEFT, IF_EB("\033O*D", ESC_STR "O*D")},
// An extra set of cursor keys for vt100 mode // An extra set of cursor keys for vt100 mode
{K_XUP, IF_EB("\033[1;*A", ESC_STR "[1;*A")}, {K_XUP, IF_EB("\033[@;*A", ESC_STR "[@;*A")},
{K_XDOWN, IF_EB("\033[1;*B", ESC_STR "[1;*B")}, {K_XDOWN, IF_EB("\033[@;*B", ESC_STR "[@;*B")},
{K_XRIGHT, IF_EB("\033[1;*C", ESC_STR "[1;*C")}, {K_XRIGHT, IF_EB("\033[@;*C", ESC_STR "[@;*C")},
{K_XLEFT, IF_EB("\033[1;*D", ESC_STR "[1;*D")}, {K_XLEFT, IF_EB("\033[@;*D", ESC_STR "[@;*D")},
// An extra set of function keys for vt100 mode // An extra set of function keys for vt100 mode
{K_XF1, IF_EB("\033O*P", ESC_STR "O*P")}, {K_XF1, IF_EB("\033O*P", ESC_STR "O*P")},
{K_XF2, IF_EB("\033O*Q", ESC_STR "O*Q")}, {K_XF2, IF_EB("\033O*Q", ESC_STR "O*Q")},
@@ -4230,7 +4230,12 @@ add_termcode(char_u *name, char_u *string, int flags)
termcodes[i].modlen = 0; termcodes[i].modlen = 0;
j = termcode_star(s, len); j = termcode_star(s, len);
if (j > 0) if (j > 0)
{
termcodes[i].modlen = len - 1 - j; termcodes[i].modlen = len - 1 - j;
// For "CSI[@;X" the "@" is not included in "modlen".
if (termcodes[i].code[termcodes[i].modlen - 1] == '@')
--termcodes[i].modlen;
}
++tc_len; ++tc_len;
} }
@@ -4242,7 +4247,7 @@ add_termcode(char_u *name, char_u *string, int flags)
static int static int
termcode_star(char_u *code, int len) termcode_star(char_u *code, int len)
{ {
// Shortest is <M-O>*X. With ; shortest is <CSI>1;*X // Shortest is <M-O>*X. With ; shortest is <CSI>@;*X
if (len >= 3 && code[len - 2] == '*') if (len >= 3 && code[len - 2] == '*')
{ {
if (len >= 5 && code[len - 3] == ';') if (len >= 5 && code[len - 3] == ';')
@@ -5329,15 +5334,19 @@ check_termcode(
/* /*
* Check for code with modifier, like xterm uses: * Check for code with modifier, like xterm uses:
* <Esc>[123;*X (modslen == slen - 3) * <Esc>[123;*X (modslen == slen - 3)
* <Esc>[@;*X (matches <Esc>[X and <Esc>[1;9X )
* Also <Esc>O*X and <M-O>*X (modslen == slen - 2). * Also <Esc>O*X and <M-O>*X (modslen == slen - 2).
* When there is a modifier the * matches a number. * When there is a modifier the * matches a number.
* When there is no modifier the ;* or * is omitted. * When there is no modifier the ;* or * is omitted.
*/ */
if (termcodes[idx].modlen > 0) if (termcodes[idx].modlen > 0)
{ {
int at_code;
modslen = termcodes[idx].modlen; modslen = termcodes[idx].modlen;
if (cpo_koffset && offset && len < modslen) if (cpo_koffset && offset && len < modslen)
continue; continue;
at_code = termcodes[idx].code[modslen] == '@';
if (STRNCMP(termcodes[idx].code, tp, if (STRNCMP(termcodes[idx].code, tp,
(size_t)(modslen > len ? len : modslen)) == 0) (size_t)(modslen > len ? len : modslen)) == 0)
{ {
@@ -5347,9 +5356,14 @@ check_termcode(
return -1; // need to get more chars return -1; // need to get more chars
if (tp[modslen] == termcodes[idx].code[slen - 1]) if (tp[modslen] == termcodes[idx].code[slen - 1])
slen = modslen + 1; // no modifiers // no modifiers
slen = modslen + 1;
else if (tp[modslen] != ';' && modslen == slen - 3) else if (tp[modslen] != ';' && modslen == slen - 3)
continue; // no match // no match for "code;*X" with "code;"
continue;
else if (at_code && tp[modslen] != '1')
// no match for "<Esc>[@" with "<Esc>[1"
continue;
else else
{ {
// Skip over the digits, the final char must // Skip over the digits, the final char must

View File

@@ -101,7 +101,7 @@ func Test_terminal_in_popup()
let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15}) let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15})
call TermWait(buf, 100) call TermWait(buf, 100)
call term_sendkeys(buf, ":call OpenTerm(0)\<CR>") call term_sendkeys(buf, ":call OpenTerm(0)\<CR>")
call TermWait(buf, 100) call TermWait(buf, 500)
call term_sendkeys(buf, ":\<CR>") call term_sendkeys(buf, ":\<CR>")
call TermWait(buf, 100) call TermWait(buf, 100)
call term_sendkeys(buf, "\<C-W>:echo getwinvar(g:winid, \"&buftype\") win_gettype(g:winid)\<CR>") call term_sendkeys(buf, "\<C-W>:echo getwinvar(g:winid, \"&buftype\") win_gettype(g:winid)\<CR>")
@@ -111,7 +111,7 @@ func Test_terminal_in_popup()
call VerifyScreenDump(buf, 'Test_terminal_popup_2', {}) call VerifyScreenDump(buf, 'Test_terminal_popup_2', {})
call term_sendkeys(buf, ":call OpenTerm(1)\<CR>") call term_sendkeys(buf, ":call OpenTerm(1)\<CR>")
call TermWait(buf, 150) call TermWait(buf, 500)
call term_sendkeys(buf, ":set hlsearch\<CR>") call term_sendkeys(buf, ":set hlsearch\<CR>")
call TermWait(buf, 100) call TermWait(buf, 100)
call term_sendkeys(buf, "/edit\<CR>") call term_sendkeys(buf, "/edit\<CR>")
@@ -138,7 +138,7 @@ func Test_terminal_in_popup()
call TermWait(buf, 50) call TermWait(buf, 50)
call term_sendkeys(buf, ":q\<CR>") call term_sendkeys(buf, ":q\<CR>")
call TermWait(buf, 150) " wait for terminal to vanish call TermWait(buf, 250) " wait for terminal to vanish
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
call delete('Xtext') call delete('Xtext')
@@ -309,6 +309,7 @@ func Test_term_keycode_translation()
let buf = RunVimInTerminal('', {}) let buf = RunVimInTerminal('', {})
call term_sendkeys(buf, ":set nocompatible\<CR>") call term_sendkeys(buf, ":set nocompatible\<CR>")
call term_sendkeys(buf, ":set timeoutlen=20\<CR>")
let keys = ["\<F1>", "\<F2>", "\<F3>", "\<F4>", "\<F5>", "\<F6>", "\<F7>", let keys = ["\<F1>", "\<F2>", "\<F3>", "\<F4>", "\<F5>", "\<F6>", "\<F7>",
\ "\<F8>", "\<F9>", "\<F10>", "\<F11>", "\<F12>", "\<Home>", \ "\<F8>", "\<F9>", "\<F10>", "\<F11>", "\<F12>", "\<Home>",
@@ -325,7 +326,7 @@ func Test_term_keycode_translation()
call term_sendkeys(buf, "i") call term_sendkeys(buf, "i")
for i in range(len(keys)) for i in range(len(keys))
call term_sendkeys(buf, "\<C-U>\<C-K>" .. keys[i]) call term_sendkeys(buf, "\<C-U>\<C-K>" .. keys[i])
call WaitForAssert({-> assert_equal(output[i], term_getline(buf, 1))}) call WaitForAssert({-> assert_equal(output[i], term_getline(buf, 1))}, 200)
endfor endfor
let keypad_keys = ["\<k0>", "\<k1>", "\<k2>", "\<k3>", "\<k4>", "\<k5>", let keypad_keys = ["\<k0>", "\<k1>", "\<k2>", "\<k3>", "\<k4>", "\<k5>",
@@ -340,7 +341,7 @@ func Test_term_keycode_translation()
continue continue
endif endif
call term_sendkeys(buf, "\<C-U>" .. keypad_keys[i]) call term_sendkeys(buf, "\<C-U>" .. keypad_keys[i])
call WaitForAssert({-> assert_equal(keypad_output[i], term_getline(buf, 1))}) call WaitForAssert({-> assert_equal(keypad_output[i], term_getline(buf, 1))}, 100)
endfor endfor
call feedkeys("\<C-U>\<kEnter>\<BS>one\<C-W>.two", 'xt') call feedkeys("\<C-U>\<kEnter>\<BS>one\<C-W>.two", 'xt')

View File

@@ -750,6 +750,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 */
/**/
2246,
/**/ /**/
2245, 2245,
/**/ /**/