mirror of
https://github.com/vim/vim
synced 2025-03-26 11:45:22 +01:00
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.
This commit is contained in:
parent
8bcc99b821
commit
1f28b4c6a3
4 changed files with 54 additions and 19 deletions
|
@ -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
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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?
|
||||
|
@ -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
|
||||
|
@ -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. */
|
||||
|
|
|
@ -769,6 +769,8 @@ static char *(features[]) =
|
|||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
787,
|
||||
/**/
|
||||
786,
|
||||
/**/
|
||||
|
|
Loading…
Add table
Reference in a new issue