changeset 11814:d3d0db111d17 v8.0.0787

patch 8.0.0787: cannot send CTRL-W command to terminal job commit https://github.com/vim/vim/commit/1f28b4c6a30d1519a8770d16cbb874735ccced97 Author: Bram Moolenaar <Bram@vim.org> 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.
author Christian Brabandt <cb@256bit.org>
date Fri, 28 Jul 2017 14:00:06 +0200
parents a74603a6495c
children e684f73cca04
files runtime/doc/terminal.txt src/option.c src/terminal.c src/version.c
diffstat 4 files changed, 54 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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}
--- 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. */
--- 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,