blob: 9e903d26a4feaaedea815824f45d5fd453f0e435 [file] [log] [blame]
Bram Moolenaare561a7e2017-08-29 22:44:59 +02001*terminal.txt* For Vim version 8.0. Last change: 2017 Aug 29
Bram Moolenaare4f25e42017-07-07 11:54:15 +02002
3
4 VIM REFERENCE MANUAL by Bram Moolenaar
5
6
7Terminal window support *terminal*
8
9
10WARNING: THIS IS ONLY PARTLY IMPLEMENTED, ANYTHING CAN STILL CHANGE
11
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +020012The terminal feature is optional, use this to check if your Vim has it: >
13 echo has('terminal')
14If the result is "1" you have it.
15
Bram Moolenaare4f25e42017-07-07 11:54:15 +020016
171. Basic use |terminal-use|
182. Remote testing |terminal-testing|
193. Debugging |terminal-debug|
20
21{Vi does not have any of these commands}
Bram Moolenaarc572da52017-08-27 16:52:01 +020022{only available when compiled with the |+terminal| feature}
23
24The terminal feature requires the |+multi_byte|, |+job| and |+channel| features.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020025
26==============================================================================
271. Basic use *terminal-use*
28
29This feature is for running a terminal emulator in a Vim window. A job can be
30started connected to the terminal emulator. For example, to run a shell: >
31 :term bash
32
33Or to run a debugger: >
34 :term gdb vim
35
36The job runs asynchronously from Vim, the window will be updated to show
37output from the job, also while editing in any other window.
38
Bram Moolenaar423802d2017-07-30 16:52:24 +020039
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020040Typing ~
41
Bram Moolenaardd693ce2017-08-10 23:15:19 +020042When the keyboard focus is in the terminal window, typed keys will be sent to
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020043the job. This uses a pty when possible. You can click outside of the
44terminal window to move keyboard focus elsewhere.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020045
Bram Moolenaar423802d2017-07-30 16:52:24 +020046CTRL-W can be used to navigate between windows and other CTRL-W commands, e.g.:
47 CTRL-W CTRL-W move focus to the next window
48 CTRL-W : enter an Ex command
49See |CTRL-W| for more commands.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020050
Bram Moolenaar423802d2017-07-30 16:52:24 +020051Special in the terminal window: *CTRL-W_.* *CTRL-W_N*
52 CTRL-W . send a CTRL-W to the job in the terminal
Bram Moolenaardd693ce2017-08-10 23:15:19 +020053 CTRL-W N go to Terminal-Normal mode, see |Terminal-mode|
54 CTRL-\ CTRL-N go to Terminal-Normal mode, see |Terminal-mode|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +020055 CTRL-W " {reg} paste register {reg} *CTRL-W_quote*
56 Also works with the = register to insert the result of
57 evaluating an expression.
Bram Moolenaar8e539c52017-08-18 22:57:06 +020058 CTRL-W CTRL-C ends the job, see below |t_CTRL-W_CTRL-C|
Bram Moolenaar423802d2017-07-30 16:52:24 +020059
60See option 'termkey' for specifying another key instead of CTRL-W that
61will work like CTRL-W. However, typing 'termkey' twice sends 'termkey' to
62the job. For example:
63 'termkey' CTRL-W move focus to the next window
64 'termkey' : enter an Ex command
65 'termkey' 'termkey' send 'termkey' to the job in the terminal
66 'termkey' . send a CTRL-W to the job in the terminal
67 'termkey' N go to terminal Normal mode, see below
68 'termkey' CTRL-N same as CTRL-W N
Bram Moolenaar8e539c52017-08-18 22:57:06 +020069 'termkey' CTRL-C same as |t_CTRL-W_CTRL-C|
Bram Moolenaar69198192017-08-05 14:10:48 +020070 *t_CTRL-\_CTRL-N*
Bram Moolenaardd693ce2017-08-10 23:15:19 +020071The special key combination CTRL-\ CTRL-N can be used to switch to Normal
72mode, just like this works in any other mode.
Bram Moolenaar8e539c52017-08-18 22:57:06 +020073 *t_CTRL-W_CTRL-C*
74CTRL-W CTRL-C can be typed to forcefully end the job. On MS-Windows a
75CTRL-BREAK will also kill the job.
76
77If you type CTRL-C the effect depends on what the pty has been configured to
78do. For simple commands this causes a SIGINT to be sent to the job, which
79would end it. Other commands may ignore the SIGINT or handle the CTRL-C
80themselves (like Vim does).
Bram Moolenaar423802d2017-07-30 16:52:24 +020081
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020082
Bram Moolenaar8e539c52017-08-18 22:57:06 +020083Size and color ~
Bram Moolenaare4f25e42017-07-07 11:54:15 +020084
Bram Moolenaar74675a62017-07-15 13:53:23 +020085See option 'termsize' for controlling the size of the terminal window.
86(TODO: scrolling when the terminal is larger than the window)
Bram Moolenaare4f25e42017-07-07 11:54:15 +020087
Bram Moolenaar8e539c52017-08-18 22:57:06 +020088The terminal uses the 'background' option to decide whether the terminal
89window will start with a white or black background. The job running in the
90terminal can change the colors.
91
Bram Moolenaar423802d2017-07-30 16:52:24 +020092
Bram Moolenaare4f25e42017-07-07 11:54:15 +020093Syntax ~
Bram Moolenaar8a773062017-07-24 22:29:21 +020094
Bram Moolenaardd693ce2017-08-10 23:15:19 +020095:[range]ter[minal] [options] [command] *:ter* *:terminal*
Bram Moolenaar8a773062017-07-24 22:29:21 +020096 Open a new terminal window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020097
98 If [command] is provided run it as a job and connect
99 the input and output to the terminal.
100 If [command] is not given the 'shell' option is used.
Bram Moolenaarc572da52017-08-27 16:52:01 +0200101 if [command] is NONE no job is started, the pty of the
102 terminal can be used by a command like gdb.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200103
104 A new buffer will be created, using [command] or
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200105 'shell' as the name, prefixed with a "!". If a buffer
106 by this name already exists a number is added in
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200107 parentheses. E.g. if "gdb" exists the second terminal
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200108 buffer will use "!gdb (1)".
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200109
Bram Moolenaarb2412082017-08-20 18:09:14 +0200110 If [range] is given the specified lines are used as
111 input for the job. It will not be possible to type
112 keys in the terminal window.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200113
114 Two comma separated numbers are used as "rows,cols".
115 E.g. `:24,80gdb` opens a terminal with 24 rows and 80
116 columns. However, if the terminal window spans the
117 Vim window with, there is no vertical split, the Vim
118 window width is used.
119 *term++close* *term++open*
120 Supported [options] are:
121 ++close The terminal window will close
122 automatically when the job terminates.
123 ++open When the job terminates and no window
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200124 shows it, a window will be opened.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200125 Note that this can be interruptive.
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200126 ++curwin Open the terminal in the current
127 window, do not split the current
128 window. Fails if the current buffer
129 cannot be |abandon|ed.
130 ++hidden Open the terminal in a hidden buffer,
131 no window will be used.
Bram Moolenaarb2412082017-08-20 18:09:14 +0200132 ++rows={height} Use {height} for the terminal window
133 height.
134 ++cols={width} Use {width} for the terminal window
135 width.
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200136
137 If you want to use more options use the |term_start()|
138 function.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200139
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200140When the buffer associated with the terminal is unloaded or wiped out the job
141is killed, similar to calling `job_stop(job, "kill")`
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200142
Bram Moolenaare561a7e2017-08-29 22:44:59 +0200143So long as the job is running the window behaves like it contains a modified
144buffer. Trying to close the window with `CTRL-W :close` or `CTRL-W :hide`
145fails, unless "!" is added, in which case the job is ended. The text in the
146window is lost. The buffer still exists, but getting it in a window with
147`:buffer` will show an
148empty buffer.
149
150You can use `CTRL-W :hide` to close the terminal window and make the buffer
151hidden, the job keeps running. The `:buffer` command can be used to turn the
152current window into a terminal window. If there are unsaved changes this
153fails, use ! to force, as usual.
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200154
155To have a background job run without a window, and open the window when it's
156done, use options like this: >
157 :term ++hidden ++open make
158Note that the window will open at an unexpected moment, this will interrupt
159what you are doing.
160
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200161 *E947* *E948*
Bram Moolenaar78712a72017-08-05 14:50:12 +0200162So long as the job is running, the buffer is considered modified and Vim
163cannot be quit easily, see |abandon|.
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200164
165When the job has finished and no changes were made to the buffer: closing the
166window will wipe out the buffer.
167
168Before changes can be made to a terminal buffer, the 'modifiable' option must
169be set. This is only possible when the job has finished. At the first change
170the buffer will become a normal buffer and the highlighting is removed.
171You may want to change the buffer name with |:file| to be able to write, since
172the buffer name will still be set to the command.
173
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200174
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200175Resizing ~
176
177The size of the terminal can be in one of three modes:
178
1791. The 'termsize' option is empty: The terminal size follows the window size.
180 The minimal size is 2 screen lines with 10 cells.
181
1822. The 'termsize' option is "rows*cols", where "rows" is the minimal number of
Bram Moolenaar8a773062017-07-24 22:29:21 +0200183 screen rows and "cols" is the minimal number of cells.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200184
1853. The 'termsize' option is "rowsXcols" (where the x is upper or lower case).
186 The terminal size is fixed to the specified number of screen lines and
187 cells. If the window is bigger there will be unused empty space.
188
189If the window is smaller than the terminal size, only part of the terminal can
190be seen (the lower-left part).
191
192The |term_getsize()| function can be used to get the current size of the
193terminal. |term_setsize()| can be used only when in the first or second mode,
194not when 'termsize' is "rowsXcols".
195
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200196
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200197Terminal-Job and Terminal-Normal mode ~
Bram Moolenaar423802d2017-07-30 16:52:24 +0200198 *Terminal-mode*
199When the job is running the contents of the terminal is under control of the
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200200job. That includes the cursor position. Typed keys are sent to the job.
201The terminal contents can change at any time. This is called Terminal-Job
202mode.
Bram Moolenaar423802d2017-07-30 16:52:24 +0200203
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200204Use CTRL-W N (or 'termkey' N) to switch to Terminal-Normal mode. Now the
205contents of the terminal window is under control of Vim, the job output is
206suspended. CTRL-\ CTRL-N does the same.
Bram Moolenaar423802d2017-07-30 16:52:24 +0200207 *E946*
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200208In Terminal-Normal mode you can move the cursor around with the usual Vim
209commands, Visually mark text, yank text, etc. But you cannot change the
210contents of the buffer. The commands that would start insert mode, such as
211'i' and 'a', return to Terminal-Job mode. The window will be updated to show
212the contents of the terminal.
Bram Moolenaar423802d2017-07-30 16:52:24 +0200213
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200214In Terminal-Normal mode the statusline and window title show "(Terminal)". If
215the job ends while in Terminal-Normal mode this changes to
216"(Terminal-finished)".
Bram Moolenaar423802d2017-07-30 16:52:24 +0200217
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200218It is not possible to enter Insert mode from Terminal-Job mode.
219
Bram Moolenaar423802d2017-07-30 16:52:24 +0200220
Bram Moolenaarc572da52017-08-27 16:52:01 +0200221Cursor style ~
222
223By default the cursor in the terminal window uses a not blinking block. The
224normal xterm escape sequences can be used to change the blinking state and the
225shape. Once focus leaves the terminal window Vim will restore the original
226cursor.
227
228An exception is when xterm is started with the "-bc" argument, or another way
229that causes the cursor to blink. This actually means that the blinking flag
230is inverted. Since Vim cannot detect this, the terminal window cursor
231blinking will also be inverted.
232
233
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200234Unix ~
235
236On Unix a pty is used to make it possible to run all kinds of commands. You
237can even run Vim in the terminal! That's used for debugging, see below.
238
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200239Environment variables are used to pass information to the running job:
240 TERM name of the terminal, 'term'
241 ROWS number of rows in the terminal initially
242 LINES same as ROWS
243 COLUMNS number of columns in the terminal initially
244 COLORS number of colors, 't_Co' (256*256*256 in the GUI)
245 VIM_SERVERNAME v:servername
246
247The |client-server| feature can be used to communicate with the Vim instance
248where the job was started. This only works when v:servername is not empty.
249If needed you can set it with: >
250 call remote_startserver('vim-server')
251
252In the job you can then do something like: >
253 vim --servername $VIM_SERVERNAME --remote +123 some_file.c
254This will open the file "some_file.c" and put the cursor on line 123.
255
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200256
257MS-Windows ~
258
Bram Moolenaar8a773062017-07-24 22:29:21 +0200259On MS-Windows winpty is used to make it possible to run all kind of commands.
260Obviously, they must be commands that run in a terminal, not open their own
261window.
262
263You need the following two files from winpty:
264
265 winpty.dll
266 winpty-agent.exe
267
268You can download them from the following page:
269
270 https://github.com/rprichard/winpty
271
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200272Just put the files somewhere in your PATH. You can set the 'winptydll' option
273to point to the right file, if needed. If you have both the 32-bit and 64-bit
274version, rename to winpty32.dll and winpty64.dll to match the way Vim was
275build.
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200276
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200277==============================================================================
2782. Remote testing *terminal-testing*
279
280Most Vim tests execute a script inside Vim. For some tests this does not
281work, running the test interferes with the code being tested. To avoid this
282Vim is executed in a terminal window. The test sends keystrokes to it and
283inspects the resulting screen state.
284
285Functions ~
286
287term_sendkeys() send keystrokes to a terminal
288term_wait() wait for screen to be updated
289term_scrape() inspect terminal screen
290
291
292==============================================================================
2933. Debugging *terminal-debug*
294
295The Terminal debugging plugin can be used to debug a program with gdb and view
Bram Moolenaarc572da52017-08-27 16:52:01 +0200296the source code in a Vim window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200297
Bram Moolenaarc572da52017-08-27 16:52:01 +0200298Load the plugin with this command: >
299 packadd termdebug
300
301To start debugging use `:TermDebug` folowed by the command name, for example: >
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200302 :TermDebug vim
303
Bram Moolenaarc572da52017-08-27 16:52:01 +0200304This opens two windows:
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200305- A terminal window in which "gdb vim" is executed. Here you can directly
306 interact with gdb.
307- A terminal window for the executed program. When "run" is used in gdb the
308 program I/O will happen in this window, so that it does not interfere with
309 controlling gdb.
Bram Moolenaarc572da52017-08-27 16:52:01 +0200310The current window is used to show the source code. When gdb jumps to a
311source file location this window will display the code, if possible. Values
312of variables can be inspected, breakpoints set and cleared, etc.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200313
Bram Moolenaarc572da52017-08-27 16:52:01 +0200314When the debugger ends the two opened windows are closed.
315
316
317Customizing ~
318
319g:debugger The debugger command. Default "gdb".
320
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200321
322TODO
323
324
325 vim:tw=78:ts=8:ft=help:norl: