Problem: Cannot send CTRL-W command to terminal job.
Solution: Make CTRL-W . a prefex for sending a key to the job.
-*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
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
{"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}
* 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:
* - 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?
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
/* 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. */
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 787,
/**/
786,
/**/