Mercurial > vim
changeset 23406:24ce202a7d68 v8.2.2246
patch 8.2.2246: cursor keys not recognized at the hit-Enter prompt
Commit: https://github.com/vim/vim/commit/4d8c96d4668ac965d4e84b9676fba6d7efe62a32
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Dec 29 20:53:33 2020 +0100
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 29 Dec 2020 21:00:08 +0100 |
parents | 9f9f30f22f42 |
children | 675b60086d83 |
files | runtime/doc/term.txt src/term.c src/testdir/test_terminal3.vim src/version.c |
diffstat | 4 files changed, 33 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/term.txt +++ b/runtime/doc/term.txt @@ -217,6 +217,10 @@ it's different from Alt). They can be c 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 |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* 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
--- a/src/term.c +++ b/src/term.c @@ -914,10 +914,10 @@ static struct builtin_term builtin_termc {K_RIGHT, IF_EB("\033O*C", ESC_STR "O*C")}, {K_LEFT, IF_EB("\033O*D", ESC_STR "O*D")}, // An extra set of cursor keys for vt100 mode - {K_XUP, IF_EB("\033[1;*A", ESC_STR "[1;*A")}, - {K_XDOWN, IF_EB("\033[1;*B", ESC_STR "[1;*B")}, - {K_XRIGHT, IF_EB("\033[1;*C", ESC_STR "[1;*C")}, - {K_XLEFT, IF_EB("\033[1;*D", ESC_STR "[1;*D")}, + {K_XUP, IF_EB("\033[@;*A", ESC_STR "[@;*A")}, + {K_XDOWN, IF_EB("\033[@;*B", ESC_STR "[@;*B")}, + {K_XRIGHT, IF_EB("\033[@;*C", ESC_STR "[@;*C")}, + {K_XLEFT, IF_EB("\033[@;*D", ESC_STR "[@;*D")}, // An extra set of function keys for vt100 mode {K_XF1, IF_EB("\033O*P", ESC_STR "O*P")}, {K_XF2, IF_EB("\033O*Q", ESC_STR "O*Q")}, @@ -4230,7 +4230,12 @@ add_termcode(char_u *name, char_u *strin termcodes[i].modlen = 0; j = termcode_star(s, len); if (j > 0) + { 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; } @@ -4242,7 +4247,7 @@ add_termcode(char_u *name, char_u *strin static int 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 >= 5 && code[len - 3] == ';') @@ -5329,15 +5334,19 @@ check_termcode( /* * Check for code with modifier, like xterm uses: * <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). * When there is a modifier the * matches a number. * When there is no modifier the ;* or * is omitted. */ if (termcodes[idx].modlen > 0) { + int at_code; + modslen = termcodes[idx].modlen; if (cpo_koffset && offset && len < modslen) continue; + at_code = termcodes[idx].code[modslen] == '@'; if (STRNCMP(termcodes[idx].code, tp, (size_t)(modslen > len ? len : modslen)) == 0) { @@ -5347,9 +5356,14 @@ check_termcode( return -1; // need to get more chars 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) - 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 { // Skip over the digits, the final char must
--- a/src/testdir/test_terminal3.vim +++ b/src/testdir/test_terminal3.vim @@ -101,7 +101,7 @@ func Test_terminal_in_popup() let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15}) call TermWait(buf, 100) call term_sendkeys(buf, ":call OpenTerm(0)\<CR>") - call TermWait(buf, 100) + call TermWait(buf, 500) call term_sendkeys(buf, ":\<CR>") call TermWait(buf, 100) 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 term_sendkeys(buf, ":call OpenTerm(1)\<CR>") - call TermWait(buf, 150) + call TermWait(buf, 500) call term_sendkeys(buf, ":set hlsearch\<CR>") call TermWait(buf, 100) call term_sendkeys(buf, "/edit\<CR>") @@ -138,7 +138,7 @@ func Test_terminal_in_popup() call TermWait(buf, 50) 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 delete('Xtext') @@ -309,6 +309,7 @@ func Test_term_keycode_translation() let buf = RunVimInTerminal('', {}) call term_sendkeys(buf, ":set nocompatible\<CR>") + call term_sendkeys(buf, ":set timeoutlen=20\<CR>") let keys = ["\<F1>", "\<F2>", "\<F3>", "\<F4>", "\<F5>", "\<F6>", "\<F7>", \ "\<F8>", "\<F9>", "\<F10>", "\<F11>", "\<F12>", "\<Home>", @@ -325,7 +326,7 @@ func Test_term_keycode_translation() call term_sendkeys(buf, "i") for i in range(len(keys)) 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 let keypad_keys = ["\<k0>", "\<k1>", "\<k2>", "\<k3>", "\<k4>", "\<k5>", @@ -340,7 +341,7 @@ func Test_term_keycode_translation() continue endif 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 call feedkeys("\<C-U>\<kEnter>\<BS>one\<C-W>.two", 'xt')