# HG changeset patch # User Christian Brabandt # Date 1525194007 -7200 # Node ID 044337cbf854ad57cee252f3941c69575473056e # Parent 4dece4ef17bdf8c82b8c8bcb5078a5fef4ec129e patch 8.0.1786: no test for 'termwinkey' commit https://github.com/vim/vim/commit/b2ac14c0b5e23f8ab97c5c784bcd83e13ba8ded3 Author: Bram Moolenaar Date: Tue May 1 18:47:59 2018 +0200 patch 8.0.1786: no test for 'termwinkey' Problem: No test for 'termwinkey'. Solution: Add a test. Make feedkeys() handle terminal_loop() returning before characters are consumed. diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -3311,18 +3311,12 @@ f_feedkeys(typval_T *argvars, typval_T * /* Avoid a 1 second delay when the keys start Insert mode. */ msg_scroll = FALSE; -#ifdef FEAT_TERMINAL - if (term_use_loop()) - terminal_loop(FALSE); - else -#endif - { - if (!dangerous) - ++ex_normal_busy; - exec_normal(TRUE); - if (!dangerous) - --ex_normal_busy; - } + if (!dangerous) + ++ex_normal_busy; + exec_normal(TRUE); + if (!dangerous) + --ex_normal_busy; + msg_scroll |= save_msg_scroll; } } diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -10340,7 +10340,21 @@ exec_normal(int was_typed) && typebuf.tb_len > 0)) && !got_int) { update_topline_cursor(); - normal_cmd(&oa, TRUE); /* execute a Normal mode cmd */ +#ifdef FEAT_TERMINAL + if (term_use_loop() + && oa.op_type == OP_NOP && oa.regname == NUL + && !VIsual_active) + { + /* If terminal_loop() returns OK we got a key that is handled + * in Normal model. With FAIL we first need to position the + * cursor and the screen needs to be redrawn. */ + if (terminal_loop(TRUE) == OK) + normal_cmd(&oa, TRUE); + } + else +#endif + /* execute a Normal mode cmd */ + normal_cmd(&oa, TRUE); } } diff --git a/src/getchar.c b/src/getchar.c --- a/src/getchar.c +++ b/src/getchar.c @@ -2059,7 +2059,7 @@ vgetorpeek(int advance) c = inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 0L); /* * If inchar() returns TRUE (script file was active) or we - * are inside a mapping, get out of insert mode. + * are inside a mapping, get out of Insert mode. * Otherwise we behave like having gotten a CTRL-C. * As a result typing CTRL-C in insert mode will * really insert a CTRL-C. @@ -2755,6 +2755,10 @@ vgetorpeek(int advance) * cmdline window. */ if (p_im && (State & INSERT)) c = Ctrl_L; +#ifdef FEAT_TERMINAL + else if (terminal_is_active()) + c = K_CANCEL; +#endif else if ((State & CMDLINE) #ifdef FEAT_CMDWIN || (cmdwin_type > 0 && tc == ESC) @@ -2898,8 +2902,8 @@ vgetorpeek(int advance) } /* for (;;) */ } /* if (!character from stuffbuf) */ - /* if advance is FALSE don't loop on NULs */ - } while (c < 0 || (advance && c == NUL)); + /* if advance is FALSE don't loop on NULs */ + } while ((c < 0 && c != K_CANCEL) || (advance && c == NUL)); /* * The "INSERT" message is taken care of here: diff --git a/src/keymap.h b/src/keymap.h --- a/src/keymap.h +++ b/src/keymap.h @@ -270,6 +270,7 @@ enum key_extra , KE_FOCUSGAINED = 98 /* focus gained */ , KE_FOCUSLOST = 99 /* focus lost */ , KE_MOUSEMOVE = 100 /* mouse moved with no button down */ + , KE_CANCEL = 101 /* return from vgetc() */ }; /* @@ -455,6 +456,7 @@ enum key_extra #define K_IGNORE TERMCAP2KEY(KS_EXTRA, KE_IGNORE) #define K_NOP TERMCAP2KEY(KS_EXTRA, KE_NOP) +#define K_CANCEL TERMCAP2KEY(KS_EXTRA, KE_CANCEL) #define K_MOUSEDOWN TERMCAP2KEY(KS_EXTRA, KE_MOUSEDOWN) #define K_MOUSEUP TERMCAP2KEY(KS_EXTRA, KE_MOUSEUP) diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -42,7 +42,6 @@ * redirection. Probably in call to channel_set_pipes(). * - Win32: Redirecting output does not work, Test_terminal_redir_file() * is disabled. - * - Add test for 'termwinkey'. * - When starting terminal window with shell in terminal, then using :gui to * switch to GUI, shell stops working. Scrollback seems wrong, command * running in shell is still running. @@ -1690,6 +1689,7 @@ send_keys_to_term(term_T *term, int c, i return FAIL; case K_IGNORE: + case K_CANCEL: // used for :normal when running out of chars return FAIL; case K_LEFTDRAG: @@ -1826,9 +1826,9 @@ term_paste_register(int prev_c UNUSED) } } -#if defined(FEAT_GUI) || defined(PROTO) /* - * Return TRUE when the cursor of the terminal should be displayed. + * Return TRUE when waiting for a character in the terminal, the cursor of the + * terminal should be displayed. */ int terminal_is_active() @@ -1836,6 +1836,7 @@ terminal_is_active() return in_terminal_loop != NULL; } +#if defined(FEAT_GUI) || defined(PROTO) cursorentry_T * term_get_cursor_shape(guicolor_T *fg, guicolor_T *bg) { diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim --- a/src/testdir/test_terminal.vim +++ b/src/testdir/test_terminal.vim @@ -1471,3 +1471,19 @@ func Test_terminal_termwinsize_mininmum( set termwinsize= endfunc + +func Test_terminal_termwinkey() + call assert_equal(1, winnr('$')) + let thiswin = win_getid() + + let buf = Run_shell_in_terminal({}) + let termwin = bufwinid(buf) + set termwinkey= + call feedkeys("\w", 'tx') + call assert_equal(thiswin, win_getid()) + call feedkeys("\w", 'tx') + + let job = term_getjob(buf) + call feedkeys("\\", 'tx') + call WaitForAssert({-> assert_equal("dead", job_status(job))}) +endfunc diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1786, +/**/ 1785, /**/ 1784,