# HG changeset patch # User Christian Brabandt # Date 1501935304 -7200 # Node ID a932d3da41c8846dca1e4f6ab4f872618506be95 # Parent 045453b06831a5773fce9ef2803935ec8f9616af patch 8.0.0863: a remote command does not work in the terminal window commit https://github.com/vim/vim/commit/69198197fd4b061be7cadcf441cd8a7246a17148 Author: Bram Moolenaar Date: Sat Aug 5 14:10:48 2017 +0200 patch 8.0.0863: a remote command does not work in the terminal window Problem: A remote command starting with CTRL-\ CTRL-N does not work in the terminal window. (Christian J. Robinson) Solution: Use CTRL-\ CTRL-N as a prefix or a Normal mode command. diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt --- a/runtime/doc/terminal.txt +++ b/runtime/doc/terminal.txt @@ -61,6 +61,11 @@ the job. For example: 'termkey' . send a CTRL-W to the job in the terminal 'termkey' N go to terminal Normal mode, see below 'termkey' CTRL-N same as CTRL-W N + *t_CTRL-\_CTRL-N* +The special key combination CTRL-\ CTRL-N can be used to prefix one Normal +mode command. This is especially useful for remote commands, when you don't +know whether Vim currently has focus in a terminal window. Note that only one +Normal mode command can be used. Size ~ @@ -142,6 +147,23 @@ displayed. In Terminal mode the statusline and window title show "(Terminal)". If the job ends while in Terminal mode this changes to "(Terminal-finished)". +Environment variables are used to pass information to the running job: + TERM name of the terminal, 'term' + ROWS number of rows in the terminal initially + LINES same as ROWS + COLUMNS number of columns in the terminal initially + COLORS number of colors, 't_Co' (256*256*256 in the GUI) + VIM_SERVERNAME v:servername + +The |client-server| feature can be used to communicate with the Vim instance +where the job was started. This only works when v:servername is not empty. +If needed you can set it with: > + call remote_startserver('vim-server') + +In the job you can then do something like: > + vim --servername $VIM_SERVERNAME --remote +123 some_file.c +This will open the file "some_file.c" and put the cursor on line 123. + Unix ~ diff --git a/src/terminal.c b/src/terminal.c --- a/src/terminal.c +++ b/src/terminal.c @@ -52,6 +52,9 @@ * - make term_getcursor() return type (none/block/bar/underline) and * attributes (color, blink, etc.) * - To set BS correctly, check get_stty(); Pass the fd of the pty. + * For the GUI fill termios with default values, perhaps like pangoterm: + * http://bazaar.launchpad.net/~leonerd/pangoterm/trunk/view/head:/main.c#L134 + * Also get the NL behavior from there. * - do not store terminal window in viminfo. Or prefix term:// ? * - add a character in :ls output * - add 't' to mode() @@ -64,7 +67,8 @@ * - support minimal size when 'termsize' is "rows*cols". * - support minimal size when 'termsize' is empty? * - implement "term" for job_start(): more job options when starting a - * terminal. + * terminal. Might allow reading stdin from a file or buffer, sending stderr + * to a file or /dev/null, but something must be connected to the terminal. * - support ":term NONE" to open a terminal with a pty but not running a job * in it. The pty can be passed to gdb to run the executable in. * - if the job in the terminal does not support the mouse, we can use the @@ -862,6 +866,8 @@ term_vgetc() /* * Send keys to terminal. + * Return FAIL when the key needs to be handled in Normal mode. + * Return OK when the key was dropped or sent to the terminal. */ static int send_keys_to_term(term_T *term, int c, int typed) @@ -1038,7 +1044,7 @@ terminal_loop(void) mch_stop_job(curbuf->b_term->tl_job, (char_u *)"quit"); #endif - if (c == (termkey == 0 ? Ctrl_W : termkey)) + if (c == (termkey == 0 ? Ctrl_W : termkey) || c == Ctrl_BSL) { int prev_c = c; @@ -1054,7 +1060,15 @@ terminal_loop(void) /* job finished while waiting for a character */ break; - if (termkey == 0 && c == '.') + if (prev_c == Ctrl_BSL) + { + if (c == Ctrl_N) + /* CTRL-\ CTRL-N : execute one Normal mode command. */ + return OK; + /* Send both keys to the terminal. */ + send_keys_to_term(curbuf->b_term, prev_c, TRUE); + } + else if (termkey == 0 && c == '.') { /* "CTRL-W .": send CTRL-W to the job */ c = Ctrl_W; diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 863, +/**/ 862, /**/ 861,