Skip to content

Commit

Permalink
patch 8.0.0787: cannot send CTRL-W command to terminal job
Browse files Browse the repository at this point in the history
Problem:    Cannot send CTRL-W command to terminal job.
Solution:   Make CTRL-W . a prefex for sending a key to the job.
  • Loading branch information
brammool committed Jul 28, 2017
1 parent 8bcc99b commit 1f28b4c
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 19 deletions.
21 changes: 13 additions & 8 deletions runtime/doc/terminal.txt
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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. 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.

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.
See option 'termkey' for specifying another key that precedes a Vim command.
Typing 'termkey' twice sends 'termkey' to the job.

See option 'termkey' for specifying the key that precedes a Vim command.
Default is CTRL-W.
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
Expand Down
2 changes: 1 addition & 1 deletion src/option.c
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down
48 changes: 38 additions & 10 deletions src/terminal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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?
Expand Down Expand Up @@ -458,6 +457,24 @@ term_convert_key(int c, char *buf)
return (int)vterm_output_read(vterm, buf, KEY_BUF_LEN);
}

/*
* 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
Expand All @@ -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. */
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -769,6 +769,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
787,
/**/
786,
/**/
Expand Down

0 comments on commit 1f28b4c

Please sign in to comment.