# HG changeset patch # User Christian Brabandt # Date 1501243206 -7200 # Node ID d3d0db111d17ca9f49bfce276d70280d20f2a13f # Parent a74603a6495c8baebb22110193b851f91d354d90 patch 8.0.0787: cannot send CTRL-W command to terminal job commit https://github.com/vim/vim/commit/1f28b4c6a30d1519a8770d16cbb874735ccced97 Author: Bram Moolenaar Date: Fri Jul 28 13:48:34 2017 +0200 patch 8.0.0787: cannot send CTRL-W command to terminal job Problem: Cannot send CTRL-W command to terminal job. Solution: Make CTRL-W . a prefex for sending a key to the job. diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt --- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -1,4 +1,4 @@ -*terminal.txt* For Vim version 8.0. Last change: 2017 Jul 24 +*terminal.txt* For Vim version 8.0. Last change: 2017 Jul 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -33,22 +33,27 @@ Or to run a debugger: > The job runs asynchronously from Vim, the window will be updated to show output from the job, also while editing in any other window. +Typing ~ + When the keyboard focus is in the terminal window, typed keys will be send to -the job. This uses a pty when possible. +the job. This uses a pty when possible. You can click outside of the +terminal window to move keyboard focus elsewhere. -Navigate between windows with CTRL-W commands (and mouse). -E.g. CTRL-W CTRL-W moves focus to the next window. -Use "CTRL-W :" to edit an Ex command. +Navigate between windows with CTRL-W commands. E.g. CTRL-W CTRL-W moves focus +to the next window. Use "CTRL-W :" to edit an Ex command. Use "CTRL-W ." to +send a CTRL-W to the job in the terminal. -See option 'termkey' for specifying the key that precedes a Vim command. -Default is CTRL-W. +See option 'termkey' for specifying another key that precedes a Vim command. +Typing 'termkey' twice sends 'termkey' to the job. + +Size ~ See option 'termsize' for controlling the size of the terminal window. (TODO: scrolling when the terminal is larger than the window) Syntax ~ -:ter[minal][!] [command] *:ter* *:terminal* +:ter[minal] [command] *:ter* *:terminal* Open a new terminal window. If [command] is provided run it as a job and connect diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -2773,7 +2773,7 @@ static struct vimoption options[] = {"termkey", "tk", P_STRING|P_ALLOCED|P_RWIN|P_VI_DEF, #ifdef FEAT_TERMINAL (char_u *)VAR_WIN, PV_TK, - {(char_u *)"\x17", (char_u *)NULL} + {(char_u *)"", (char_u *)NULL} #else (char_u *)NULL, PV_NONE, {(char_u *)NULL, (char_u *)0L} diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -33,9 +33,9 @@ * while, if the terminal window is visible, the screen contents is drawn. * * TODO: + * - To set BS correctly, check get_stty(); Pass the fd of the pty. * - include functions from #1871 * - do not store terminal buffer in viminfo. Or prefix term:// ? - * - Make CTRL-W . send CTRL-W to terminal? * - Add a scrollback buffer (contains lines to scroll off the top). * Can use the buf_T lines, store attributes somewhere else? * - When the job ends: @@ -50,7 +50,6 @@ * - when closing window and job has not ended, make terminal hidden? * - don't allow exiting Vim when a terminal is still running a job * - use win_del_lines() to make scroll-up efficient. - * - command line completion for :terminal * - add test for giving error for invalid 'termsize' value. * - support minimal size when 'termsize' is "rows*cols". * - support minimal size when 'termsize' is empty? @@ -459,6 +458,24 @@ term_convert_key(int c, char *buf) } /* + * Get a key from the user without mapping. + * TODO: use terminal mode mappings. + */ + static int +term_vgetc() +{ + int c; + + ++no_mapping; + ++allow_keys; + got_int = FALSE; + c = vgetc(); + --no_mapping; + --allow_keys; + return c; +} + +/* * Wait for input and send it to the job. * Return when the start of a CTRL-W command is typed or anything else that * should be handled as a Normal mode command. @@ -481,17 +498,28 @@ terminal_loop(void) /* TODO: skip screen update when handling a sequence of keys. */ update_screen(0); update_cursor(curbuf->b_term, FALSE); - ++no_mapping; - ++allow_keys; - got_int = FALSE; - c = vgetc(); - --no_mapping; - --allow_keys; + c = term_vgetc(); if (c == (termkey == 0 ? Ctrl_W : termkey)) { - stuffcharReadbuff(Ctrl_W); - return; +#ifdef FEAT_CMDL_INFO + if (add_to_showcmd(c)) + out_flush(); +#endif + c = term_vgetc(); +#ifdef FEAT_CMDL_INFO + clear_showcmd(); +#endif + + if (termkey == 0 && c == '.') + /* "CTRL-W .": send CTRL-W to the job */ + c = Ctrl_W; + else if (termkey == 0 || c != termkey) + { + stuffcharReadbuff(Ctrl_W); + stuffcharReadbuff(c); + return; + } } /* Catch keys that need to be handled as in Normal mode. */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 787, +/**/ 786, /**/ 785,