blob: 948ed8d8d0f9912500f4c2043182199fabd3fab2 [file] [log] [blame]
Bram Moolenaarf55e4c82017-08-01 20:44:53 +02001*terminal.txt* For Vim version 8.0. Last change: 2017 Aug 01
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}
22
23==============================================================================
241. Basic use *terminal-use*
25
26This feature is for running a terminal emulator in a Vim window. A job can be
27started connected to the terminal emulator. For example, to run a shell: >
28 :term bash
29
30Or to run a debugger: >
31 :term gdb vim
32
33The job runs asynchronously from Vim, the window will be updated to show
34output from the job, also while editing in any other window.
35
Bram Moolenaar423802d2017-07-30 16:52:24 +020036
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020037Typing ~
38
Bram Moolenaare4f25e42017-07-07 11:54:15 +020039When the keyboard focus is in the terminal window, typed keys will be send to
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020040the job. This uses a pty when possible. You can click outside of the
41terminal window to move keyboard focus elsewhere.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020042
Bram Moolenaar423802d2017-07-30 16:52:24 +020043CTRL-W can be used to navigate between windows and other CTRL-W commands, e.g.:
44 CTRL-W CTRL-W move focus to the next window
45 CTRL-W : enter an Ex command
46See |CTRL-W| for more commands.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020047
Bram Moolenaar423802d2017-07-30 16:52:24 +020048Special in the terminal window: *CTRL-W_.* *CTRL-W_N*
49 CTRL-W . send a CTRL-W to the job in the terminal
50 CTRL-W N go to Terminal Normal mode, see |Terminal-mode|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +020051 CTRL-W " {reg} paste register {reg} *CTRL-W_quote*
52 Also works with the = register to insert the result of
53 evaluating an expression.
Bram Moolenaar423802d2017-07-30 16:52:24 +020054
55See option 'termkey' for specifying another key instead of CTRL-W that
56will work like CTRL-W. However, typing 'termkey' twice sends 'termkey' to
57the job. For example:
58 'termkey' CTRL-W move focus to the next window
59 'termkey' : enter an Ex command
60 'termkey' 'termkey' send 'termkey' to the job in the terminal
61 'termkey' . send a CTRL-W to the job in the terminal
62 'termkey' N go to terminal Normal mode, see below
63 'termkey' CTRL-N same as CTRL-W N
64
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020065
66Size ~
Bram Moolenaare4f25e42017-07-07 11:54:15 +020067
Bram Moolenaar74675a62017-07-15 13:53:23 +020068See option 'termsize' for controlling the size of the terminal window.
69(TODO: scrolling when the terminal is larger than the window)
Bram Moolenaare4f25e42017-07-07 11:54:15 +020070
Bram Moolenaar423802d2017-07-30 16:52:24 +020071
Bram Moolenaare4f25e42017-07-07 11:54:15 +020072Syntax ~
Bram Moolenaar8a773062017-07-24 22:29:21 +020073
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020074:ter[minal] [command] *:ter* *:terminal*
Bram Moolenaar8a773062017-07-24 22:29:21 +020075 Open a new terminal window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020076
77 If [command] is provided run it as a job and connect
78 the input and output to the terminal.
79 If [command] is not given the 'shell' option is used.
80
81 A new buffer will be created, using [command] or
Bram Moolenaarf55e4c82017-08-01 20:44:53 +020082 'shell' as the name, prefixed with a "!". If a buffer
83 by this name already exists a number is added in
84 parenthesis. E.g. if "gdb" exists the second terminal
85 buffer will use "!gdb (1)".
Bram Moolenaare4f25e42017-07-07 11:54:15 +020086
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +020087When the buffer associated with the terminal is wiped out the job is killed,
88similar to calling `job_stop(job, "kill")`
89
Bram Moolenaarf55e4c82017-08-01 20:44:53 +020090So long as the job is running: If the window is closed the buffer becomes
91hidden. The command will not be stopped. The `:buffer` command can be used
92to turn the current window into a terminal window. If there are unsaved
93changes this fails, use ! to force, as usual.
94
95When the job has finished and no changes were made to the buffer: closing the
96window will wipe out the buffer.
97
98Before changes can be made to a terminal buffer, the 'modifiable' option must
99be set. This is only possible when the job has finished. At the first change
100the buffer will become a normal buffer and the highlighting is removed.
101You may want to change the buffer name with |:file| to be able to write, since
102the buffer name will still be set to the command.
103
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200104
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200105Resizing ~
106
107The size of the terminal can be in one of three modes:
108
1091. The 'termsize' option is empty: The terminal size follows the window size.
110 The minimal size is 2 screen lines with 10 cells.
111
1122. The 'termsize' option is "rows*cols", where "rows" is the minimal number of
Bram Moolenaar8a773062017-07-24 22:29:21 +0200113 screen rows and "cols" is the minimal number of cells.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200114
1153. The 'termsize' option is "rowsXcols" (where the x is upper or lower case).
116 The terminal size is fixed to the specified number of screen lines and
117 cells. If the window is bigger there will be unused empty space.
118
119If the window is smaller than the terminal size, only part of the terminal can
120be seen (the lower-left part).
121
122The |term_getsize()| function can be used to get the current size of the
123terminal. |term_setsize()| can be used only when in the first or second mode,
124not when 'termsize' is "rowsXcols".
125
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200126
Bram Moolenaar423802d2017-07-30 16:52:24 +0200127Terminal Normal mode ~
128 *Terminal-mode*
129When the job is running the contents of the terminal is under control of the
130job. That includes the cursor position. The terminal contents can change at
131any time.
132
133Use CTRL-W N (or 'termkey' N) to go to Terminal Normal mode. Now the contents
134of the terminal window is under control of Vim, the job output is suspended.
135 *E946*
136In this mode you can move the cursor around with the usual Vim commands,
137Visually mark text, yank text, etc. But you cannot change the contents of the
138buffer. The commands that would start insert mode, such as 'i' and 'a',
139return control of the window to the job. Any pending output will now be
140displayed.
141
142In Terminal mode the statusline and window title show "(Terminal)". If the
143job ends while in Terminal mode this changes to "(Terminal-finished)".
144
145
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200146Unix ~
147
148On Unix a pty is used to make it possible to run all kinds of commands. You
149can even run Vim in the terminal! That's used for debugging, see below.
150
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200151Environment variables are used to pass information to the running job:
152 TERM name of the terminal, 'term'
153 ROWS number of rows in the terminal initially
154 LINES same as ROWS
155 COLUMNS number of columns in the terminal initially
156 COLORS number of colors, 't_Co' (256*256*256 in the GUI)
157 VIM_SERVERNAME v:servername
158
159The |client-server| feature can be used to communicate with the Vim instance
160where the job was started. This only works when v:servername is not empty.
161If needed you can set it with: >
162 call remote_startserver('vim-server')
163
164In the job you can then do something like: >
165 vim --servername $VIM_SERVERNAME --remote +123 some_file.c
166This will open the file "some_file.c" and put the cursor on line 123.
167
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200168
169MS-Windows ~
170
Bram Moolenaar8a773062017-07-24 22:29:21 +0200171On MS-Windows winpty is used to make it possible to run all kind of commands.
172Obviously, they must be commands that run in a terminal, not open their own
173window.
174
175You need the following two files from winpty:
176
177 winpty.dll
178 winpty-agent.exe
179
180You can download them from the following page:
181
182 https://github.com/rprichard/winpty
183
184Just put the files somewhere in your PATH.
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200185
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200186==============================================================================
1872. Remote testing *terminal-testing*
188
189Most Vim tests execute a script inside Vim. For some tests this does not
190work, running the test interferes with the code being tested. To avoid this
191Vim is executed in a terminal window. The test sends keystrokes to it and
192inspects the resulting screen state.
193
194Functions ~
195
196term_sendkeys() send keystrokes to a terminal
197term_wait() wait for screen to be updated
198term_scrape() inspect terminal screen
199
200
201==============================================================================
2023. Debugging *terminal-debug*
203
204The Terminal debugging plugin can be used to debug a program with gdb and view
205the source code in a Vim window. For example: >
206
207 :TermDebug vim
208
209This opens three windows:
210- A terminal window in which "gdb vim" is executed. Here you can directly
211 interact with gdb.
212- A terminal window for the executed program. When "run" is used in gdb the
213 program I/O will happen in this window, so that it does not interfere with
214 controlling gdb.
215- A normal Vim window used to show the source code. When gdb jumps to a
216 source file location this window will display the code, if possible. Values
217 of variables can be inspected, breakpoints set and cleared, etc.
218
219This uses two terminal windows. To open the gdb window: >
220 :term gdb [arguments]
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200221To open the terminal to run the tested program |term_start()| is used.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200222
223TODO
224
225
226 vim:tw=78:ts=8:ft=help:norl: