summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-07-28 13:48:34 +0200
committerBram Moolenaar <Bram@vim.org>2017-07-28 13:48:34 +0200
commit1f28b4c6a30d1519a8770d16cbb874735ccced97 (patch)
treec2d6e32ab0070b3d1dd695fe8ccc1e8895d6709a
parent8bcc99b821706fe4a0a4b8e1b588d453bbf0dfbd (diff)
downloadvim-git-1f28b4c6a30d1519a8770d16cbb874735ccced97.tar.gz
patch 8.0.0787: cannot send CTRL-W command to terminal jobv8.0.0787
Problem: Cannot send CTRL-W command to terminal job. Solution: Make CTRL-W . a prefex for sending a key to the job.
-rw-r--r--runtime/doc/terminal.txt21
-rw-r--r--src/option.c2
-rw-r--r--src/terminal.c48
-rw-r--r--src/version.c2
4 files changed, 54 insertions, 19 deletions
diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt
index 73bcf9971..89689463a 100644
--- 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. 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
diff --git a/src/option.c b/src/option.c
index e2dfa88ec..ad5892581 100644
--- 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
index c4e1a5208..4e87b51a1 100644
--- 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
index 174524a06..92c1eb432 100644
--- 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,