blob: bce1d6fb00f165f2250fad11b074dd07c965294a [file] [log] [blame]
Bram Moolenaar1b9645d2017-09-17 23:03:31 +02001*terminal.txt* For Vim version 8.0. Last change: 2017 Sep 17
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
Bram Moolenaare09ba7b2017-09-09 22:19:47 +020033Or to run build command: >
34 :term make myprogram
Bram Moolenaare4f25e42017-07-07 11:54:15 +020035
36The job runs asynchronously from Vim, the window will be updated to show
Bram Moolenaare09ba7b2017-09-09 22:19:47 +020037output from the job, also while editing in another window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020038
Bram Moolenaar423802d2017-07-30 16:52:24 +020039
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020040Typing ~
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +020041 *terminal-typing*
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 Moolenaar69fbc9e2017-09-14 20:37:57 +020082To change the keys you type use terminal mode mappings, see |:tmap|.
83These are defined like any mapping, but apply only when typing keys that are
84sent to the job running in the terminal.
85
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020086
Bram Moolenaar8e539c52017-08-18 22:57:06 +020087Size and color ~
Bram Moolenaare4f25e42017-07-07 11:54:15 +020088
Bram Moolenaar74675a62017-07-15 13:53:23 +020089See option 'termsize' for controlling the size of the terminal window.
90(TODO: scrolling when the terminal is larger than the window)
Bram Moolenaare4f25e42017-07-07 11:54:15 +020091
Bram Moolenaar38baa3e2017-09-14 16:10:38 +020092The job running in the terminal can change the colors. The default foreground
93and background colors are taken from Vim, the Normal highlight group.
94
95For a color terminal the 'background' option is used to decide whether the
96terminal window will start with a white or black background.
97
98To use a different color the Terminal highlight group can be used: >
99 hi Terminal ctermbg=lightgrey ctermfg=blue guibg=lightgrey guifg=blue
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200100
Bram Moolenaar423802d2017-07-30 16:52:24 +0200101
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200102Syntax ~
Bram Moolenaar8a773062017-07-24 22:29:21 +0200103
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200104:[range]ter[minal] [options] [command] *:ter* *:terminal*
Bram Moolenaar8a773062017-07-24 22:29:21 +0200105 Open a new terminal window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200106
107 If [command] is provided run it as a job and connect
108 the input and output to the terminal.
109 If [command] is not given the 'shell' option is used.
Bram Moolenaarc572da52017-08-27 16:52:01 +0200110 if [command] is NONE no job is started, the pty of the
111 terminal can be used by a command like gdb.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200112
113 A new buffer will be created, using [command] or
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200114 'shell' as the name, prefixed with a "!". If a buffer
115 by this name already exists a number is added in
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200116 parentheses. E.g. if "gdb" exists the second terminal
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200117 buffer will use "!gdb (1)".
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200118
Bram Moolenaarb2412082017-08-20 18:09:14 +0200119 If [range] is given the specified lines are used as
120 input for the job. It will not be possible to type
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200121 keys in the terminal window. For MS-Windows see the
122 ++eof argument below.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200123
124 Two comma separated numbers are used as "rows,cols".
125 E.g. `:24,80gdb` opens a terminal with 24 rows and 80
126 columns. However, if the terminal window spans the
127 Vim window with, there is no vertical split, the Vim
128 window width is used.
129 *term++close* *term++open*
130 Supported [options] are:
131 ++close The terminal window will close
132 automatically when the job terminates.
133 ++open When the job terminates and no window
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200134 shows it, a window will be opened.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200135 Note that this can be interruptive.
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200136 ++curwin Open the terminal in the current
137 window, do not split the current
138 window. Fails if the current buffer
139 cannot be |abandon|ed.
140 ++hidden Open the terminal in a hidden buffer,
141 no window will be used.
Bram Moolenaarb2412082017-08-20 18:09:14 +0200142 ++rows={height} Use {height} for the terminal window
143 height.
144 ++cols={width} Use {width} for the terminal window
145 width.
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200146 ++eof={text} when using [range]: text to send after
147 the last line was written. Cannot
148 contain white space. A CR is
149 appended. For MS-Windows the default
150 is to send CTRL-D.
Bram Moolenaaref68e4f2017-09-02 16:28:36 +0200151 E.g. for a shell use "++eof=exit" and
152 for Python "++eof=exit()". Special
153 codes can be used like with `:map`,
154 e.g. "<C-Z>" for CTRL-Z.
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200155
156 If you want to use more options use the |term_start()|
157 function.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200158
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200159When the buffer associated with the terminal is unloaded or wiped out the job
160is killed, similar to calling `job_stop(job, "kill")`
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200161
Bram Moolenaare561a7e2017-08-29 22:44:59 +0200162So long as the job is running the window behaves like it contains a modified
Bram Moolenaaref68e4f2017-09-02 16:28:36 +0200163buffer. Trying to close the window with `CTRL-W :quit` fails. When using
164`CTRL-W :quit!` the job is ended. The text in the window is lost. The buffer
165still exists, but getting it in a window with `:buffer` will show an empty
166buffer.
167
168Trying to close the window with `CTRL-W :close` also fails. Using
169`CTRL-W :close!` will close the window and make the buffer hidden.
Bram Moolenaare561a7e2017-08-29 22:44:59 +0200170
171You can use `CTRL-W :hide` to close the terminal window and make the buffer
172hidden, the job keeps running. The `:buffer` command can be used to turn the
173current window into a terminal window. If there are unsaved changes this
174fails, use ! to force, as usual.
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200175
176To have a background job run without a window, and open the window when it's
177done, use options like this: >
178 :term ++hidden ++open make
179Note that the window will open at an unexpected moment, this will interrupt
180what you are doing.
181
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200182 *E947* *E948*
Bram Moolenaar78712a72017-08-05 14:50:12 +0200183So long as the job is running, the buffer is considered modified and Vim
184cannot be quit easily, see |abandon|.
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200185
186When the job has finished and no changes were made to the buffer: closing the
187window will wipe out the buffer.
188
189Before changes can be made to a terminal buffer, the 'modifiable' option must
190be set. This is only possible when the job has finished. At the first change
191the buffer will become a normal buffer and the highlighting is removed.
192You may want to change the buffer name with |:file| to be able to write, since
193the buffer name will still be set to the command.
194
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200195
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200196Resizing ~
197
198The size of the terminal can be in one of three modes:
199
2001. The 'termsize' option is empty: The terminal size follows the window size.
201 The minimal size is 2 screen lines with 10 cells.
202
2032. The 'termsize' option is "rows*cols", where "rows" is the minimal number of
Bram Moolenaar8a773062017-07-24 22:29:21 +0200204 screen rows and "cols" is the minimal number of cells.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200205
2063. The 'termsize' option is "rowsXcols" (where the x is upper or lower case).
207 The terminal size is fixed to the specified number of screen lines and
208 cells. If the window is bigger there will be unused empty space.
209
210If the window is smaller than the terminal size, only part of the terminal can
211be seen (the lower-left part).
212
213The |term_getsize()| function can be used to get the current size of the
214terminal. |term_setsize()| can be used only when in the first or second mode,
215not when 'termsize' is "rowsXcols".
216
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200217
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200218Terminal-Job and Terminal-Normal mode ~
Bram Moolenaar423802d2017-07-30 16:52:24 +0200219 *Terminal-mode*
220When the job is running the contents of the terminal is under control of the
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200221job. That includes the cursor position. Typed keys are sent to the job.
222The terminal contents can change at any time. This is called Terminal-Job
223mode.
Bram Moolenaar423802d2017-07-30 16:52:24 +0200224
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200225Use CTRL-W N (or 'termkey' N) to switch to Terminal-Normal mode. Now the
226contents of the terminal window is under control of Vim, the job output is
227suspended. CTRL-\ CTRL-N does the same.
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200228
Bram Moolenaar1b9645d2017-09-17 23:03:31 +0200229Terminal-Job mode is where |:tmap| mappings are applied. Keys sent by
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200230|term_sendkeys()| are not subject to tmap, but keys from |feedkeys()| are.
231
Bram Moolenaar423802d2017-07-30 16:52:24 +0200232 *E946*
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200233In Terminal-Normal mode you can move the cursor around with the usual Vim
234commands, Visually mark text, yank text, etc. But you cannot change the
235contents of the buffer. The commands that would start insert mode, such as
236'i' and 'a', return to Terminal-Job mode. The window will be updated to show
Bram Moolenaar1b9645d2017-09-17 23:03:31 +0200237the contents of the terminal. |:startinsert| is ineffective.
Bram Moolenaar423802d2017-07-30 16:52:24 +0200238
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200239In Terminal-Normal mode the statusline and window title show "(Terminal)". If
240the job ends while in Terminal-Normal mode this changes to
241"(Terminal-finished)".
Bram Moolenaar423802d2017-07-30 16:52:24 +0200242
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200243It is not possible to enter Insert mode from Terminal-Job mode.
244
Bram Moolenaar423802d2017-07-30 16:52:24 +0200245
Bram Moolenaarc572da52017-08-27 16:52:01 +0200246Cursor style ~
247
248By default the cursor in the terminal window uses a not blinking block. The
249normal xterm escape sequences can be used to change the blinking state and the
250shape. Once focus leaves the terminal window Vim will restore the original
251cursor.
252
253An exception is when xterm is started with the "-bc" argument, or another way
254that causes the cursor to blink. This actually means that the blinking flag
255is inverted. Since Vim cannot detect this, the terminal window cursor
256blinking will also be inverted.
257
258
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200259Unix ~
260
261On Unix a pty is used to make it possible to run all kinds of commands. You
262can even run Vim in the terminal! That's used for debugging, see below.
263
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200264Environment variables are used to pass information to the running job:
265 TERM name of the terminal, 'term'
266 ROWS number of rows in the terminal initially
267 LINES same as ROWS
268 COLUMNS number of columns in the terminal initially
269 COLORS number of colors, 't_Co' (256*256*256 in the GUI)
270 VIM_SERVERNAME v:servername
271
272The |client-server| feature can be used to communicate with the Vim instance
273where the job was started. This only works when v:servername is not empty.
274If needed you can set it with: >
275 call remote_startserver('vim-server')
276
277In the job you can then do something like: >
278 vim --servername $VIM_SERVERNAME --remote +123 some_file.c
279This will open the file "some_file.c" and put the cursor on line 123.
280
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200281
282MS-Windows ~
283
Bram Moolenaar8a773062017-07-24 22:29:21 +0200284On MS-Windows winpty is used to make it possible to run all kind of commands.
285Obviously, they must be commands that run in a terminal, not open their own
286window.
287
288You need the following two files from winpty:
289
290 winpty.dll
291 winpty-agent.exe
292
293You can download them from the following page:
294
295 https://github.com/rprichard/winpty
296
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200297Just put the files somewhere in your PATH. You can set the 'winptydll' option
298to point to the right file, if needed. If you have both the 32-bit and 64-bit
299version, rename to winpty32.dll and winpty64.dll to match the way Vim was
300build.
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200301
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200302==============================================================================
3032. Remote testing *terminal-testing*
304
305Most Vim tests execute a script inside Vim. For some tests this does not
306work, running the test interferes with the code being tested. To avoid this
307Vim is executed in a terminal window. The test sends keystrokes to it and
308inspects the resulting screen state.
309
310Functions ~
311
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200312term_sendkeys() send keystrokes to a terminal (not subject to tmap)
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200313term_wait() wait for screen to be updated
314term_scrape() inspect terminal screen
315
316
317==============================================================================
3183. Debugging *terminal-debug*
319
320The Terminal debugging plugin can be used to debug a program with gdb and view
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200321the source code in a Vim window. Since this is completely contained inside
322Vim this also works remotely over an ssh connection.
323
324
325Starting ~
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200326
Bram Moolenaarc572da52017-08-27 16:52:01 +0200327Load the plugin with this command: >
328 packadd termdebug
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200329< *:Termdebug*
Bram Moolenaarc572da52017-08-27 16:52:01 +0200330To start debugging use `:TermDebug` folowed by the command name, for example: >
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200331 :TermDebug vim
332
Bram Moolenaarc572da52017-08-27 16:52:01 +0200333This opens two windows:
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200334gdb window A terminal window in which "gdb vim" is executed. Here you
335 can directly interact with gdb. The buffer name is "!gdb".
336program window A terminal window for the executed program. When "run" is
337 used in gdb the program I/O will happen in this window, so
338 that it does not interfere with controlling gdb. The buffer
339 name is "gdb program".
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200340
341The current window is used to show the source code. When gdb pauses the
342source file location will be displayed, if possible. A sign is used to
343highlight the current position (using highlight group debugPC).
344
345If the buffer in the current window is modified, another window will be opened
346to display the current gdb position.
347
348Focus the terminal of the executed program to interact with it. This works
349the same as any command running in a terminal window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200350
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200351When the debugger ends, typically by typing "quit" in the gdb window, the two
352opened windows are closed.
Bram Moolenaarc572da52017-08-27 16:52:01 +0200353
354
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200355Stepping through code ~
356
357Put focus on the gdb window to type commands there. Some common ones are:
358- CTRL-C interrupt the program
359- next execute the current line and stop at the next line
360- step execute the current line and stop at the next statement, entering
361 functions
362- finish execute until leaving the current function
363- where show the stack
364- frame N go to the Nth stack frame
365- continue continue execution
366
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200367In the window showing the source code some commands can used to control gdb:
368 :Break set a breakpoint at the current line; a sign will be displayed
369 :Delete delete a breakpoint at the current line
370 :Step execute the gdb "step" command
371 :Over execute the gdb "next" command (:Next is a Vim command)
372 :Finish execute the gdb "finish" command
373 :Continue execute the gdb "continue" command
374
Bram Moolenaar1b9645d2017-09-17 23:03:31 +0200375The plugin adds a window toolbar with these entries:
376 Step :Step
377 Next :Over
378 Finish :Finish
379 Cont :Continue
380 Eval :Evaluate
381This way you can use the mouse to perform the most common commands.
382
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200383
384Inspecting variables ~
385
386 :Evaluate evaluate the expression under the cursor
387 K same
388 :Evaluate {expr} evaluate {expr}
389 :'<,'>Evaluate evaluate the Visually selected text
390
391This is similar to using "print" in the gdb window.
392
393
394Other commands ~
395
396 :Gdb jump to the gdb window
397 :Program jump to the window with the running program
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200398
399
400Communication ~
401
402There is another, hidden, buffer, which is used for Vim to communicate with
403gdb. The buffer name is "gdb communication". Do not delete this buffer, it
404will break the debugger.
405
406
Bram Moolenaarc572da52017-08-27 16:52:01 +0200407Customizing ~
408
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200409To change the name of the gdb command, set the "termdebugger" variable before
410invoking `:Termdebug`: >
411 let termdebugger = "mygdb"
412Only debuggers fully compatible with gdb will work. Vim uses the GDB/MI
413interface.
414
415The color of the signs can be adjusted with these highlight groups:
416- debugPC the current position
417- debugBreakpoint a breakpoint
418
419The defaults are, when 'background' is "light":
420 hi debugPC term=reverse ctermbg=lightblue guibg=lightblue
421 hi debugBreakpoint term=reverse ctermbg=red guibg=red
422
423When 'background' is "dark":
424 hi debugPC term=reverse ctermbg=darkblue guibg=darkblue
425 hi debugBreakpoint term=reverse ctermbg=red guibg=red
Bram Moolenaarc572da52017-08-27 16:52:01 +0200426
Bram Moolenaar38baa3e2017-09-14 16:10:38 +0200427To change the width of the Vim window when debugging starts, and use a
428vertical split: >
429 let g:termdebug_wide = 163
430This will set &columns to 163 when :Termdebug is used. The value is restored
431when quitting the debugger.
432
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200433
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200434
435 vim:tw=78:ts=8:ft=help:norl: