blob: 8f95fc227c3e0eee5cf47f450120fe9fcce8451c [file] [log] [blame]
Bram Moolenaarb1c91982018-05-17 17:04:55 +02001*terminal.txt* For Vim version 8.1. Last change: 2018 May 17
Bram Moolenaare4f25e42017-07-07 11:54:15 +02002
3
4 VIM REFERENCE MANUAL by Bram Moolenaar
5
6
Bram Moolenaarb1c91982018-05-17 17:04:55 +02007Terminal window support *terminal* *terminal-window*
Bram Moolenaare4f25e42017-07-07 11:54:15 +02008
9
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +020010The terminal feature is optional, use this to check if your Vim has it: >
11 echo has('terminal')
12If the result is "1" you have it.
13
Bram Moolenaare4f25e42017-07-07 11:54:15 +020014
Bram Moolenaarda650582018-02-20 15:51:40 +0100151. Basic use |terminal-use|
16 Typing |terminal-typing|
17 Size and color |terminal-size-color|
18 Syntax |:terminal|
19 Resizing |terminal-resizing|
20 Terminal Modes |Terminal-mode|
21 Cursor style |terminal-cursor-style|
22 Special keys |terminal-special-keys|
Bram Moolenaarb5b75622018-03-09 22:22:21 +010023 Session |terminal-session|
Bram Moolenaarda650582018-02-20 15:51:40 +010024 Unix |terminal-unix|
25 MS-Windows |terminal-ms-windows|
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +0200262. Terminal communication |terminal-communication|
27 Vim to job: term_sendkeys() |terminal-to-job|
Bram Moolenaar333b80a2018-04-04 22:57:29 +020028 Job to Vim: JSON API |terminal-api|
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +020029 Using the client-server feature |terminal-client-server|
303. Remote testing |terminal-testing|
314. Diffing screen dumps |terminal-diff|
Bram Moolenaarda650582018-02-20 15:51:40 +010032 Writing a screen dump test for Vim |terminal-dumptest|
33 Creating a screen dump |terminal-screendump|
34 Comparing screen dumps |terminal-diffscreendump|
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +0200355. Debugging |terminal-debug|
Bram Moolenaarda650582018-02-20 15:51:40 +010036 Starting |termdebug-starting|
37 Example session |termdebug-example|
38 Stepping through code |termdebug-stepping|
39 Inspecting variables |termdebug-variables|
40 Other commands |termdebug-commands|
Bram Moolenaarb3307b52018-06-17 21:34:11 +020041 Prompt mode |termdebug-prompt|
Bram Moolenaarda650582018-02-20 15:51:40 +010042 Communication |termdebug-communication|
43 Customizing |termdebug-customizing|
Bram Moolenaare4f25e42017-07-07 11:54:15 +020044
45{Vi does not have any of these commands}
Bram Moolenaarc572da52017-08-27 16:52:01 +020046{only available when compiled with the |+terminal| feature}
Bram Moolenaarc572da52017-08-27 16:52:01 +020047The terminal feature requires the |+multi_byte|, |+job| and |+channel| features.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020048
49==============================================================================
501. Basic use *terminal-use*
51
52This feature is for running a terminal emulator in a Vim window. A job can be
53started connected to the terminal emulator. For example, to run a shell: >
54 :term bash
55
Bram Moolenaare09ba7b2017-09-09 22:19:47 +020056Or to run build command: >
57 :term make myprogram
Bram Moolenaare4f25e42017-07-07 11:54:15 +020058
59The job runs asynchronously from Vim, the window will be updated to show
Bram Moolenaare09ba7b2017-09-09 22:19:47 +020060output from the job, also while editing in another window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020061
Bram Moolenaar423802d2017-07-30 16:52:24 +020062
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020063Typing ~
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +020064 *terminal-typing*
Bram Moolenaardd693ce2017-08-10 23:15:19 +020065When the keyboard focus is in the terminal window, typed keys will be sent to
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020066the job. This uses a pty when possible. You can click outside of the
67terminal window to move keyboard focus elsewhere.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020068
Bram Moolenaar423802d2017-07-30 16:52:24 +020069CTRL-W can be used to navigate between windows and other CTRL-W commands, e.g.:
Bram Moolenaar60e73f22017-11-12 18:02:06 +010070 CTRL-W CTRL-W move focus to the next window
Bram Moolenaar423802d2017-07-30 16:52:24 +020071 CTRL-W : enter an Ex command
72See |CTRL-W| for more commands.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020073
Bram Moolenaar423802d2017-07-30 16:52:24 +020074Special in the terminal window: *CTRL-W_.* *CTRL-W_N*
75 CTRL-W . send a CTRL-W to the job in the terminal
Bram Moolenaarb59118d2018-04-13 22:11:56 +020076 CTRL-W CTRL-\ send a CTRL-\ to the job in the terminal
Bram Moolenaardd693ce2017-08-10 23:15:19 +020077 CTRL-W N go to Terminal-Normal mode, see |Terminal-mode|
78 CTRL-\ CTRL-N go to Terminal-Normal mode, see |Terminal-mode|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +020079 CTRL-W " {reg} paste register {reg} *CTRL-W_quote*
80 Also works with the = register to insert the result of
81 evaluating an expression.
Bram Moolenaar8e539c52017-08-18 22:57:06 +020082 CTRL-W CTRL-C ends the job, see below |t_CTRL-W_CTRL-C|
Bram Moolenaar423802d2017-07-30 16:52:24 +020083
Bram Moolenaar7dda86f2018-04-20 22:36:41 +020084See option 'termwinkey' for specifying another key instead of CTRL-W that
85will work like CTRL-W. However, typing 'termwinkey' twice sends 'termwinkey'
86to the job. For example:
87 'termwinkey' CTRL-W move focus to the next window
88 'termwinkey' : enter an Ex command
89 'termwinkey' 'termwinkey' send 'termwinkey' to the job in the terminal
90 'termwinkey' . send a CTRL-W to the job in the terminal
91 'termwinkey' N go to terminal Normal mode, see below
92 'termwinkey' CTRL-N same as CTRL-W N
93 'termwinkey' CTRL-C same as |t_CTRL-W_CTRL-C|
Bram Moolenaar69198192017-08-05 14:10:48 +020094 *t_CTRL-\_CTRL-N*
Bram Moolenaardd693ce2017-08-10 23:15:19 +020095The special key combination CTRL-\ CTRL-N can be used to switch to Normal
96mode, just like this works in any other mode.
Bram Moolenaar8e539c52017-08-18 22:57:06 +020097 *t_CTRL-W_CTRL-C*
98CTRL-W CTRL-C can be typed to forcefully end the job. On MS-Windows a
99CTRL-BREAK will also kill the job.
100
101If you type CTRL-C the effect depends on what the pty has been configured to
102do. For simple commands this causes a SIGINT to be sent to the job, which
103would end it. Other commands may ignore the SIGINT or handle the CTRL-C
104themselves (like Vim does).
Bram Moolenaar423802d2017-07-30 16:52:24 +0200105
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200106To change the keys you type use terminal mode mappings, see |:tmap|.
107These are defined like any mapping, but apply only when typing keys that are
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100108sent to the job running in the terminal. For example, to make F1 switch
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200109to Terminal-Normal mode: >
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100110 tnoremap <F1> <C-W>N
111You can use Esc, but you need to make sure it won't cause other keys to
112break: >
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200113 tnoremap <Esc> <C-W>N
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100114 set notimeout ttimeout timeoutlen=100
115
Bram Moolenaar01164a62017-11-02 22:58:42 +0100116< *options-in-terminal*
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200117After opening the terminal window and setting 'buftype' to "terminal" the
118BufWinEnter autocommand event is triggered. This makes it possible to set
119options specifically for the window and buffer. Example: >
120 au BufWinEnter * if &buftype == 'terminal' | setlocal bufhidden=hide | endif
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200121
Bram Moolenaar52dbb5e2017-11-21 18:11:27 +0100122Mouse events (click and drag) are passed to the terminal. Mouse move events
123are only passed when Vim itself is receiving them. For a terminal that is
124when 'balloonevalterm' is enabled.
125
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +0200126
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200127Size and color ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100128 *terminal-size-color*
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200129See option 'termwinsize' for controlling the size of the terminal window.
Bram Moolenaar74675a62017-07-15 13:53:23 +0200130(TODO: scrolling when the terminal is larger than the window)
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200131
Bram Moolenaar38baa3e2017-09-14 16:10:38 +0200132The job running in the terminal can change the colors. The default foreground
133and background colors are taken from Vim, the Normal highlight group.
134
135For a color terminal the 'background' option is used to decide whether the
136terminal window will start with a white or black background.
137
Bram Moolenaardf980db2017-12-24 13:22:00 +0100138To use a different color the Terminal highlight group can be used, for
139example: >
Bram Moolenaar38baa3e2017-09-14 16:10:38 +0200140 hi Terminal ctermbg=lightgrey ctermfg=blue guibg=lightgrey guifg=blue
Bram Moolenaarf59c6e82018-04-10 15:59:11 +0200141<
142 *g:terminal_ansi_colors*
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200143In GUI mode or with 'termguicolors', the 16 ANSI colors used by default in new
Bram Moolenaarf59c6e82018-04-10 15:59:11 +0200144terminal windows may be configured using the variable
145`g:terminal_ansi_colors`, which should be a list of 16 color names or
146hexadecimal color codes, similar to those accepted by |highlight-guifg|. When
147not using GUI colors, the terminal window always uses the 16 ANSI colors of
148the underlying terminal.
149The |term_setansicolors()| function can be used to change the colors, and
150|term_getansicolors()| to get the currently used colors.
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200151
Bram Moolenaar423802d2017-07-30 16:52:24 +0200152
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200153Syntax ~
Bram Moolenaar8a773062017-07-24 22:29:21 +0200154
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200155:[range]ter[minal] [options] [command] *:ter* *:terminal*
Bram Moolenaar8a773062017-07-24 22:29:21 +0200156 Open a new terminal window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200157
158 If [command] is provided run it as a job and connect
159 the input and output to the terminal.
160 If [command] is not given the 'shell' option is used.
Bram Moolenaarc572da52017-08-27 16:52:01 +0200161 if [command] is NONE no job is started, the pty of the
162 terminal can be used by a command like gdb.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200163
Bram Moolenaar1dd98332018-03-16 22:54:53 +0100164 If [command] is missing the default behavior is to
165 close the terminal when the shell exits. This can be
166 changed with the ++noclose argument.
167 If [command] is present the default behavior is to
168 keep the terminal open in Terminal-Normal mode. This
169 can be changed with the ++close argument.
170
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200171 A new buffer will be created, using [command] or
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200172 'shell' as the name, prefixed with a "!". If a buffer
173 by this name already exists a number is added in
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200174 parentheses. E.g. if "gdb" exists the second terminal
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200175 buffer will use "!gdb (1)".
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200176
Bram Moolenaarb2412082017-08-20 18:09:14 +0200177 If [range] is given the specified lines are used as
178 input for the job. It will not be possible to type
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200179 keys in the terminal window. For MS-Windows see the
180 ++eof argument below.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200181
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200182 *term++close* *term++open*
183 Supported [options] are:
184 ++close The terminal window will close
185 automatically when the job terminates.
Bram Moolenaar1dd98332018-03-16 22:54:53 +0100186 ++noclose The terminal window will NOT close
187 automatically when the job terminates.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200188 ++open When the job terminates and no window
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200189 shows it, a window will be opened.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200190 Note that this can be interruptive.
Bram Moolenaar1dd98332018-03-16 22:54:53 +0100191 The last of ++close, ++noclose and ++open
192 matters and rules out earlier arguments.
193
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200194 ++curwin Open the terminal in the current
195 window, do not split the current
196 window. Fails if the current buffer
197 cannot be |abandon|ed.
198 ++hidden Open the terminal in a hidden buffer,
199 no window will be used.
Bram Moolenaarb5b75622018-03-09 22:22:21 +0100200 ++norestore Do not include this terminal window
201 in a session file.
Bram Moolenaar25cdd9c2018-03-10 20:28:12 +0100202 ++kill={how} When trying to close the terminal
203 window kill the job with {how}. See
204 |term_setkill()| for the values.
Bram Moolenaarb2412082017-08-20 18:09:14 +0200205 ++rows={height} Use {height} for the terminal window
Bram Moolenaar40962ec2018-01-28 22:47:25 +0100206 height. If the terminal uses the full
207 Vim height (no window above or below
Bram Moolenaar0b0f0992018-05-22 21:41:30 +0200208 the terminal window) the command line
Bram Moolenaar40962ec2018-01-28 22:47:25 +0100209 height will be reduced as needed.
Bram Moolenaarb2412082017-08-20 18:09:14 +0200210 ++cols={width} Use {width} for the terminal window
Bram Moolenaar40962ec2018-01-28 22:47:25 +0100211 width. If the terminal uses the full
212 Vim width (no window left or right of
213 the terminal window) this value is
214 ignored.
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200215 ++eof={text} when using [range]: text to send after
216 the last line was written. Cannot
217 contain white space. A CR is
218 appended. For MS-Windows the default
219 is to send CTRL-D.
Bram Moolenaaref68e4f2017-09-02 16:28:36 +0200220 E.g. for a shell use "++eof=exit" and
221 for Python "++eof=exit()". Special
222 codes can be used like with `:map`,
223 e.g. "<C-Z>" for CTRL-Z.
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200224
225 If you want to use more options use the |term_start()|
226 function.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200227
Bram Moolenaar25cdd9c2018-03-10 20:28:12 +0100228When the buffer associated with the terminal is forcibly unloaded or wiped out
229the job is killed, similar to calling `job_stop(job, "kill")` .
230Closing the window normally results in |E947|. When a kill method was set
231with "++kill={how}" or |term_setkill()| then closing the window will use that
232way to kill or interrupt the job. For example: >
233 :term ++kill=term tail -f /tmp/log
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200234
Bram Moolenaare561a7e2017-08-29 22:44:59 +0200235So long as the job is running the window behaves like it contains a modified
Bram Moolenaaref68e4f2017-09-02 16:28:36 +0200236buffer. Trying to close the window with `CTRL-W :quit` fails. When using
237`CTRL-W :quit!` the job is ended. The text in the window is lost. The buffer
238still exists, but getting it in a window with `:buffer` will show an empty
239buffer.
240
241Trying to close the window with `CTRL-W :close` also fails. Using
242`CTRL-W :close!` will close the window and make the buffer hidden.
Bram Moolenaare561a7e2017-08-29 22:44:59 +0200243
244You can use `CTRL-W :hide` to close the terminal window and make the buffer
245hidden, the job keeps running. The `:buffer` command can be used to turn the
246current window into a terminal window. If there are unsaved changes this
Bram Moolenaar0b0f0992018-05-22 21:41:30 +0200247fails, use ! to force, as usual.
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200248
249To have a background job run without a window, and open the window when it's
250done, use options like this: >
251 :term ++hidden ++open make
252Note that the window will open at an unexpected moment, this will interrupt
253what you are doing.
254
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200255 *E947* *E948*
Bram Moolenaar78712a72017-08-05 14:50:12 +0200256So long as the job is running, the buffer is considered modified and Vim
257cannot be quit easily, see |abandon|.
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200258
259When the job has finished and no changes were made to the buffer: closing the
260window will wipe out the buffer.
261
262Before changes can be made to a terminal buffer, the 'modifiable' option must
263be set. This is only possible when the job has finished. At the first change
264the buffer will become a normal buffer and the highlighting is removed.
265You may want to change the buffer name with |:file| to be able to write, since
266the buffer name will still be set to the command.
267
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200268
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200269Resizing ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100270 *terminal-resizing*
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200271The size of the terminal can be in one of three modes:
272
Bram Moolenaar7dda86f2018-04-20 22:36:41 +02002731. The 'termwinsize' option is empty: The terminal size follows the window
274 size. The minimal size is 2 screen lines with 10 cells.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200275
Bram Moolenaar7dda86f2018-04-20 22:36:41 +02002762. The 'termwinsize' option is "rows*cols", where "rows" is the minimal number
277 of screen rows and "cols" is the minimal number of cells.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200278
Bram Moolenaar7dda86f2018-04-20 22:36:41 +02002793. The 'termwinsize' option is "rowsXcols" (where the x is upper or lower
280 case). The terminal size is fixed to the specified number of screen lines
281 and cells. If the window is bigger there will be unused empty space.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200282
283If the window is smaller than the terminal size, only part of the terminal can
284be seen (the lower-left part).
285
286The |term_getsize()| function can be used to get the current size of the
287terminal. |term_setsize()| can be used only when in the first or second mode,
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200288not when 'termwinsize' is "rowsXcols".
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200289
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200290
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200291Terminal-Job and Terminal-Normal mode ~
Bram Moolenaar8c041b62018-04-14 18:14:06 +0200292 *Terminal-mode* *Terminal-Job*
Bram Moolenaar423802d2017-07-30 16:52:24 +0200293When the job is running the contents of the terminal is under control of the
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200294job. That includes the cursor position. Typed keys are sent to the job.
295The terminal contents can change at any time. This is called Terminal-Job
296mode.
Bram Moolenaar423802d2017-07-30 16:52:24 +0200297
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200298Use CTRL-W N (or 'termwinkey' N) to switch to Terminal-Normal mode. Now the
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200299contents of the terminal window is under control of Vim, the job output is
300suspended. CTRL-\ CTRL-N does the same.
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200301
Bram Moolenaar1b9645d2017-09-17 23:03:31 +0200302Terminal-Job mode is where |:tmap| mappings are applied. Keys sent by
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200303|term_sendkeys()| are not subject to tmap, but keys from |feedkeys()| are.
304
Bram Moolenaar8c041b62018-04-14 18:14:06 +0200305It is not possible to enter Insert mode from Terminal-Job mode.
306
307 *Terminal-Normal* *E946*
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200308In Terminal-Normal mode you can move the cursor around with the usual Vim
309commands, Visually mark text, yank text, etc. But you cannot change the
310contents of the buffer. The commands that would start insert mode, such as
311'i' and 'a', return to Terminal-Job mode. The window will be updated to show
Bram Moolenaar1b9645d2017-09-17 23:03:31 +0200312the contents of the terminal. |:startinsert| is ineffective.
Bram Moolenaar423802d2017-07-30 16:52:24 +0200313
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200314In Terminal-Normal mode the statusline and window title show "(Terminal)". If
315the job ends while in Terminal-Normal mode this changes to
316"(Terminal-finished)".
Bram Moolenaar423802d2017-07-30 16:52:24 +0200317
Bram Moolenaar8c041b62018-04-14 18:14:06 +0200318When the job outputs lines in the terminal, such that the contents scrolls off
319the top, those lines are remembered and can be seen in Terminal-Normal mode.
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200320The number of lines is limited by the 'termwinscroll' option. When going over
Bram Moolenaar7db25fe2018-05-13 00:02:36 +0200321this limit, the first 10% of the scrolled lines are deleted and are lost.
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200322
Bram Moolenaar423802d2017-07-30 16:52:24 +0200323
Bram Moolenaarc572da52017-08-27 16:52:01 +0200324Cursor style ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100325 *terminal-cursor-style*
Bram Moolenaarc572da52017-08-27 16:52:01 +0200326By default the cursor in the terminal window uses a not blinking block. The
327normal xterm escape sequences can be used to change the blinking state and the
328shape. Once focus leaves the terminal window Vim will restore the original
329cursor.
330
331An exception is when xterm is started with the "-bc" argument, or another way
332that causes the cursor to blink. This actually means that the blinking flag
333is inverted. Since Vim cannot detect this, the terminal window cursor
334blinking will also be inverted.
335
336
Bram Moolenaarb5b75622018-03-09 22:22:21 +0100337Session ~
338 *terminal-session*
339A terminal window will be restored when using a session file, if possible and
340wanted.
341
342If "terminal" was removed from 'sessionoptions' then no terminal windows will
343be restored.
344
345If the job in the terminal was finished the window will not be restored.
346
347If the terminal can be restored, the command that was used to open it will be
348used again. To change this use the |term_setrestore()| function. This can
349also be used to not restore a specific terminal by setting the command to
350"NONE".
351
352
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100353Special keys ~
354 *terminal-special-keys*
355Since the terminal emulator simulates an xterm, only escape sequences that
356both Vim and xterm recognize will be available in the terminal window. If you
357want to pass on other escape sequences to the job running in the terminal you
358need to set up forwarding. Example: >
359 tmap <expr> <Esc>]b SendToTerm("\<Esc>]b")
Bram Moolenaar60e73f22017-11-12 18:02:06 +0100360 func SendToTerm(what)
361 call term_sendkeys('', a:what)
362 return ''
363 endfunc
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200364
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100365
366Unix ~
367 *terminal-unix*
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200368On Unix a pty is used to make it possible to run all kinds of commands. You
369can even run Vim in the terminal! That's used for debugging, see below.
370
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200371Environment variables are used to pass information to the running job:
Bram Moolenaar9a993e32018-04-05 22:15:22 +0200372 TERM the name of the terminal, from the 'term' option or
373 $TERM in the GUI; falls back to "xterm" if it does not
374 start with "xterm"
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200375 ROWS number of rows in the terminal initially
376 LINES same as ROWS
377 COLUMNS number of columns in the terminal initially
378 COLORS number of colors, 't_Co' (256*256*256 in the GUI)
379 VIM_SERVERNAME v:servername
Bram Moolenaard7a137f2018-06-12 18:05:24 +0200380 VIM_TERMINAL v:version
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200381
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200382
383MS-Windows ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100384 *terminal-ms-windows*
Bram Moolenaar8a773062017-07-24 22:29:21 +0200385On MS-Windows winpty is used to make it possible to run all kind of commands.
386Obviously, they must be commands that run in a terminal, not open their own
387window.
388
389You need the following two files from winpty:
390
391 winpty.dll
392 winpty-agent.exe
393
394You can download them from the following page:
395
396 https://github.com/rprichard/winpty
397
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200398Just put the files somewhere in your PATH. You can set the 'winptydll' option
399to point to the right file, if needed. If you have both the 32-bit and 64-bit
400version, rename to winpty32.dll and winpty64.dll to match the way Vim was
401build.
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200402
Bram Moolenaar52dbb5e2017-11-21 18:11:27 +0100403Environment variables are used to pass information to the running job:
404 VIM_SERVERNAME v:servername
405
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200406==============================================================================
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02004072. Terminal communication *terminal-communication*
408
409There are several ways to communicate with the job running in a terminal:
410- Use |term_sendkeys()| to send text and escape sequences from Vim to the job.
411- Use the JSON API to send encoded commands from the job to Vim.
412- Use the |client-server| mechanism. This works on machines with an X server
413 and on MS-Windows.
414
415
416Vim to job: term_sendkeys() ~
417 *terminal-to-job*
418This allows for remote controlling the job running in the terminal. It is a
419one-way mechanism. The job can update the display to signal back to Vim.
420For example, if a shell is running in a terminal, you can do: >
421 call term_sendkeys(buf, "ls *.java\<CR>")
422
423This requires for the job to be in the right state where it will do the right
424thing when receiving the keys. For the above example, the shell must be
425waiting for a command to be typed.
426
427For a job that was written for the purpose, you can use the JSON API escape
428sequence in the other direction. E.g.: >
429 call term_sendkeys(buf, "\<Esc>]51;["response"]\x07")
430
431
432Job to Vim: JSON API ~
433 *terminal-api*
434The job can send JSON to Vim, using a special escape sequence. The JSON
435encodes a command that Vim understands. Example of such a message: >
436 <Esc>]51;["drop", "README.md"]<07>
437
438The body is always a list, making it easy to find the end: ]<07>.
439The <Esc>]51;msg<07> sequence is reserved by xterm for "Emacs shell", which is
440similar to what we are doing here.
441
442Currently supported commands:
443
444 call {funcname} {argument}
445
Bram Moolenaar2a77d212018-03-26 21:38:52 +0200446 Call a user defined function with {argument}.
447 The function is called with two arguments: the buffer number
448 of the terminal and {argument}, the decoded JSON argument.
449 The function name must start with "Tapi_" to avoid
450 accidentally calling a function not meant to be used for the
451 terminal API
452 The user function should sanity check the argument.
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +0200453 The function can use |term_sendkeys()| to send back a reply.
454 Example in JSON: >
Bram Moolenaar2a77d212018-03-26 21:38:52 +0200455 ["call", "Tapi_Impression", ["play", 14]]
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +0200456< Calls a function defined like this: >
Bram Moolenaar2a77d212018-03-26 21:38:52 +0200457 function Tapi_Impression(bufnum, arglist)
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +0200458 if len(a:arglist) == 2
Bram Moolenaar2a77d212018-03-26 21:38:52 +0200459 echomsg "impression " . a:arglist[0]
460 echomsg "count " . a:arglist[1]
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +0200461 endif
462 endfunc
Bram Moolenaar2a77d212018-03-26 21:38:52 +0200463< Output from `:echo` may be erased by a redraw, use `:echomsg`
464 to be able to see it with `:messages`.
465
Bram Moolenaar333b80a2018-04-04 22:57:29 +0200466 drop {filename} [options]
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +0200467
468 Let Vim open a file, like the `:drop` command. If {filename}
469 is already open in a window, switch to that window. Otherwise
470 open a new window to edit {filename}.
Bram Moolenaar85eee132018-05-06 17:57:30 +0200471 Note that both the job and Vim may change the current
472 directory, thus it's best to use the full path.
Bram Moolenaar333b80a2018-04-04 22:57:29 +0200473
474 [options] is only used when opening a new window. If present,
475 it must be a Dict. Similarly to |++opt|, These entries are recognized:
476 "ff" file format: "dos", "mac" or "unix"
477 "fileformat" idem
478 "enc" overrides 'fileencoding'
479 "encoding" idem
480 "bin" sets 'binary'
481 "binary" idem
482 "nobin" resets 'binary'
483 "nobinary" idem
484 "bad" specifies behavior for bad characters, see
485 |++bad|
486
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +0200487 Example in JSON: >
488 ["drop", "path/file.txt", {"ff": "dos"}]
489
490A trick to have Vim send this escape sequence: >
491 exe "set t_ts=\<Esc>]51; t_fs=\x07"
Bram Moolenaar2a77d212018-03-26 21:38:52 +0200492 let &titlestring = '["call","Tapi_TryThis",["hello",123]]'
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +0200493 redraw
494 set t_ts& t_fs&
495
496Rationale: Why not allow for any command or expression? Because that might
497create a security problem.
498
499
500Using the client-server feature ~
501 *terminal-client-server*
502This only works when v:servername is not empty. If needed you can set it,
503before opening the terminal, with: >
504 call remote_startserver('vim-server')
505
506$VIM_SERVERNAME is set in the terminal to pass on the server name.
507
508In the job you can then do something like: >
509 vim --servername $VIM_SERVERNAME --remote +123 some_file.c
510This will open the file "some_file.c" and put the cursor on line 123.
511
512==============================================================================
5133. Remote testing *terminal-testing*
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200514
515Most Vim tests execute a script inside Vim. For some tests this does not
516work, running the test interferes with the code being tested. To avoid this
517Vim is executed in a terminal window. The test sends keystrokes to it and
518inspects the resulting screen state.
519
520Functions ~
521
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200522term_sendkeys() send keystrokes to a terminal (not subject to tmap)
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200523term_wait() wait for screen to be updated
524term_scrape() inspect terminal screen
525
526
527==============================================================================
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02005284. Diffing screen dumps *terminal-diff*
Bram Moolenaarda650582018-02-20 15:51:40 +0100529
530In some cases it can be bothersome to test that Vim displays the right
531characters on the screen. E.g. with syntax highlighting. To make this
532simpler it is possible to take a screen dump of a terminal and compare it to
533an expected screen dump.
534
535Vim uses the window size, text, color and other attributes as displayed. The
536Vim screen size, font and other properties do not matter. Therefore this
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100537mechanism is portable across systems. A conventional screenshot would reflect
Bram Moolenaarda650582018-02-20 15:51:40 +0100538all differences, including font size and family.
539
540
541Writing a screen dump test for Vim ~
542 *terminal-dumptest*
543For an example see the Test_syntax_c() function in
544src/testdir/test_syntax.vim. The main parts are:
545- Write a file you want to test with. This is useful for testing syntax
546 highlighting. You can also start Vim with en empty buffer.
547- Run Vim in a terminal with a specific size. The default is 20 lines of 75
548 characters. This makes sure the dump is always this size. The function
549 RunVimInTerminal() takes care of this. Pass it the arguments for the Vim
550 command.
551- Send any commands to Vim using term_sendkeys(). For example: >
552 call term_sendkeys(buf, ":echo &lines &columns\<CR>")
553- Check that the screen is now in the expected state, using
554 VerifyScreenDump(). This expects the reference screen dump to be in the
555 src/testdir/dumps/ directory. Pass the name without ".dump". It is
556 recommended to use the name of the test function and a sequence number, so
557 that we know what test is using the file.
558- Repeat sending commands and checking the state.
559- Finally stop Vim by calling StopVimInTerminal().
560
561The first time you do this you won't have a screen dump yet. Create an empty
562file for now, e.g.: >
563 touch src/testdir/dumps/Test_function_name_01.dump
564
565The test will then fail, giving you the command to compare the reference dump
566and the failed dump, e.g.: >
567 call term_dumpdiff("Test_func.dump.failed", "dumps/Test_func.dump")
568
569Use this command in Vim, with the current directory set to src/testdir.
570Once you are satisfied with the test, move the failed dump in place of the
571reference: >
572 :!mv Test_func.dump.failed dumps/Test_func.dump
573
574
575Creating a screen dump ~
576 *terminal-screendump*
577
578To create the screen dump, run Vim (or any other program) in a terminal and
579make it show the desired state. Then use the term_dumpwrite() function to
580create a screen dump file. For example: >
581 :call term_dumpwrite(77, "mysyntax.dump")
582
583Here "77" is the buffer number of the terminal. Use `:ls!` to see it.
584
585You can view the screen dump with term_dumpload(): >
586 :call term_dumpload("mysyntax.dump")
587
588To verify that Vim still shows exactly the same screen, run Vim again with
589exactly the same way to show the desired state. Then create a screen dump
590again, using a different file name: >
591 :call term_dumpwrite(88, "test.dump")
592
593To assert that the files are exactly the same use assert_equalfile(): >
594 call assert_equalfile("mysyntax.dump", "test.dump")
595
596If there are differences then v:errors will contain the error message.
597
598
599Comparing screen dumps ~
600 *terminal-diffscreendump*
601
602assert_equalfile() does not make it easy to see what is different.
603To spot the problem use term_dumpdiff(): >
604 call term_dumpdiff("mysyntax.dump", "test.dump")
605
606This will open a window consisting of three parts:
6071. The contents of the first dump
6082. The difference between the first and second dump
6093. The contents of the second dump
610
611You can usually see what differs in the second part. Use the 'ruler' to
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100612relate it to the position in the first or second dump.
Bram Moolenaarda650582018-02-20 15:51:40 +0100613
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100614Alternatively, press "s" to swap the first and second dump. Do this several
Bram Moolenaarda650582018-02-20 15:51:40 +0100615times so that you can spot the difference in the context of the text.
616
617==============================================================================
Bram Moolenaarb1c91982018-05-17 17:04:55 +02006185. Debugging *terminal-debug* *terminal-debugger*
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200619
620The Terminal debugging plugin can be used to debug a program with gdb and view
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200621the source code in a Vim window. Since this is completely contained inside
622Vim this also works remotely over an ssh connection.
623
Bram Moolenaarb3307b52018-06-17 21:34:11 +0200624When the |+terminal| feature is missing, the plugin will use the "prompt"
625buffer type, if possible. The running program will then use a newly opened
626terminal window. See |termdebug-prompt| below for details.
627
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200628
629Starting ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100630 *termdebug-starting*
Bram Moolenaarc572da52017-08-27 16:52:01 +0200631Load the plugin with this command: >
632 packadd termdebug
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200633< *:Termdebug*
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200634To start debugging use `:Termdebug` or `:TermdebugCommand`` followed by the
635command name, for example: >
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200636 :Termdebug vim
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200637
Bram Moolenaarc572da52017-08-27 16:52:01 +0200638This opens two windows:
Bram Moolenaarf0b03c42017-12-17 17:17:07 +0100639
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200640gdb window A terminal window in which "gdb vim" is executed. Here you
641 can directly interact with gdb. The buffer name is "!gdb".
Bram Moolenaarf0b03c42017-12-17 17:17:07 +0100642
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200643program window A terminal window for the executed program. When "run" is
644 used in gdb the program I/O will happen in this window, so
645 that it does not interfere with controlling gdb. The buffer
646 name is "gdb program".
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200647
648The current window is used to show the source code. When gdb pauses the
649source file location will be displayed, if possible. A sign is used to
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100650highlight the current position, using highlight group debugPC.
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200651
652If the buffer in the current window is modified, another window will be opened
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200653to display the current gdb position. You can use `:Winbar` to add a window
654toolbar there.
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200655
656Focus the terminal of the executed program to interact with it. This works
657the same as any command running in a terminal window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200658
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200659When the debugger ends, typically by typing "quit" in the gdb window, the two
660opened windows are closed.
Bram Moolenaarc572da52017-08-27 16:52:01 +0200661
Bram Moolenaarb3623a32018-04-14 18:59:50 +0200662Only one debugger can be active at a time.
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200663 *:TermdebugCommand*
664If you want to give specific commands to the command being debugged, you can
665use the `:TermdebugCommand` command followed by the command name and
666additional parameters. >
667 :TermdebugCommand vim --clean -c ':set nu'
Bram Moolenaarb3623a32018-04-14 18:59:50 +0200668
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200669Both the `:Termdebug` and `:TermdebugCommand` support an optional "!" bang
670argument to start the command right away, without pausing at the gdb window
671(and cursor will be in the debugged window). For example: >
672 :TermdebugCommand! vim --clean
673
674To attach gdb to an already running executable or use a core file, pass extra
Bram Moolenaarb3623a32018-04-14 18:59:50 +0200675arguments. E.g.: >
676 :Termdebug vim core
677 :Termdebug vim 98343
678
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200679If no argument is given, you'll end up in a gdb window, in which you need to
680specify which command to run using e.g. the gdb `file` command.
681
Bram Moolenaarc572da52017-08-27 16:52:01 +0200682
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200683Example session ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100684 *termdebug-example*
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200685Start in the Vim "src" directory and build Vim: >
686 % make
687Start Vim: >
688 % ./vim
689Load the termdebug plugin and start debugging Vim: >
690 :packadd termdebug
691 :Termdebug vim
692You should now have three windows:
693 source - where you started, has a window toolbar with buttons
694 gdb - you can type gdb commands here
695 program - the executed program will use this window
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100696
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200697You can use CTRL-W CTRL-W or the mouse to move focus between windows.
698Put focus on the gdb window and type: >
699 break ex_help
700 run
701Vim will start running in the program window. Put focus there and type: >
702 :help gui
703Gdb will run into the ex_help breakpoint. The source window now shows the
704ex_cmds.c file. A ">>" marker will appear where the breakpoint was set. The
705line where the debugger stopped is highlighted. You can now step through the
706program. Let's use the mouse: click on the "Next" button in the window
707toolbar. You will see the highlighting move as the debugger executes a line
708of source code.
709
710Click "Next" a few times until the for loop is highlighted. Put the cursor on
711the end of "eap->arg", then click "Eval" in the toolbar. You will see this
712displayed:
713 "eap->arg": 0x555555e68855 "gui" ~
714This way you can inspect the value of local variables. You can also focus the
715gdb window and use a "print" command, e.g.: >
716 print *eap
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100717If mouse pointer movements are working, Vim will also show a balloon when the
718mouse rests on text that can be evaluated by gdb.
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200719
720Now go back to the source window and put the cursor on the first line after
721the for loop, then type: >
722 :Break
723You will see a ">>" marker appear, this indicates the new breakpoint. Now
724click "Cont" in the toolbar and the code until the breakpoint will be
725executed.
726
727You can type more advanced commands in the gdb window. For example, type: >
728 watch curbuf
729Now click "Cont" in the toolbar (or type "cont" in the gdb window). Execution
730will now continue until the value of "curbuf" changes, which is in do_ecmd().
731To remove this watchpoint again type in the gdb window: >
732 delete 3
733
734You can see the stack by typing in the gdb window: >
735 where
736Move through the stack frames, e.g. with: >
737 frame 3
738The source window will show the code, at the point where the call was made to
739a deeper level.
740
741
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200742Stepping through code ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100743 *termdebug-stepping*
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200744Put focus on the gdb window to type commands there. Some common ones are:
Bram Moolenaar60e73f22017-11-12 18:02:06 +0100745- CTRL-C interrupt the program
746- next execute the current line and stop at the next line
747- step execute the current line and stop at the next statement,
748 entering functions
749- finish execute until leaving the current function
750- where show the stack
751- frame N go to the Nth stack frame
752- continue continue execution
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200753
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200754 *:Run* *:Arguments*
755In the window showing the source code these commands can be used to control
756gdb:
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100757 `:Run` [args] run the program with [args] or the previous arguments
758 `:Arguments` {args} set arguments for the next `:Run`
Bram Moolenaar60e73f22017-11-12 18:02:06 +0100759
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200760 *:Break* set a breakpoint at the current line; a sign will be displayed
761 *:Clear* delete the breakpoint at the current line
Bram Moolenaar60e73f22017-11-12 18:02:06 +0100762
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200763 *:Step* execute the gdb "step" command
764 *:Over* execute the gdb "next" command (`:Next` is a Vim command)
765 *:Finish* execute the gdb "finish" command
766 *:Continue* execute the gdb "continue" command
767 *:Stop* interrupt the program
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200768
Bram Moolenaarf0b03c42017-12-17 17:17:07 +0100769If 'mouse' is set the plugin adds a window toolbar with these entries:
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100770 Step `:Step`
771 Next `:Over`
772 Finish `:Finish`
773 Cont `:Continue`
774 Stop `:Stop`
775 Eval `:Evaluate`
Bram Moolenaarf0b03c42017-12-17 17:17:07 +0100776This way you can use the mouse to perform the most common commands. You need
777to have the 'mouse' option set to enable mouse clicks.
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200778 *:Winbar*
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100779You can add the window toolbar in other windows you open with: >
780 :Winbar
781
Bram Moolenaarc4b533e2018-04-06 22:26:25 +0200782If gdb stops at a source line and there is no window currently showing the
783source code, a new window will be created for the source code. This also
784happens if the buffer in the source code window has been modified and can't be
785abandoned.
786
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200787
788Inspecting variables ~
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200789 *termdebug-variables* *:Evaluate*
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100790 `:Evaluate` evaluate the expression under the cursor
791 `K` same
792 `:Evaluate` {expr} evaluate {expr}
793 `:'<,'>Evaluate` evaluate the Visually selected text
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200794
795This is similar to using "print" in the gdb window.
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100796You can usually shorten `:Evaluate` to `:Ev`.
Bram Moolenaar45d5f262017-09-10 19:14:31 +0200797
798
799Other commands ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100800 *termdebug-commands*
Bram Moolenaar32c67ba2018-04-16 16:21:49 +0200801 *:Gdb* jump to the gdb window
802 *:Program* jump to the window with the running program
803 *:Source* jump to the window with the source code, create it if there
Bram Moolenaarc4b533e2018-04-06 22:26:25 +0200804 isn't one
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200805
806
Bram Moolenaarb3307b52018-06-17 21:34:11 +0200807Prompt mode ~
808 *termdebug-prompt*
809When the |+terminal| feature is not supported and on MS-Windows, gdb will run
810in a buffer with 'buftype' set to "prompt". This works slightly differently:
811- The gdb window will be in Insert mode while typing commands. Go to Normal
812 mode with <Esc>, then you can move around in the buffer, copy/paste, etc.
813 Go back to editing the gdb command with any command that starts Insert mode,
814 such as `a` or `i`.
815- The program being debugged will run in a separate window. On MS-Windows
816 this is a new console window. On Unix, if the |+terminal| feature is
817 available a Terminal window will be opened to run the debugged program in.
818
819 *termdebug_use_prompt*
820Prompt mode can be used even when the |+terminal| feature is present with: >
821 let g:termdebug_use_prompt = 1
822
823
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200824Communication ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100825 *termdebug-communication*
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200826There is another, hidden, buffer, which is used for Vim to communicate with
827gdb. The buffer name is "gdb communication". Do not delete this buffer, it
828will break the debugger.
829
830
Bram Moolenaarc572da52017-08-27 16:52:01 +0200831Customizing ~
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100832
833GDB command *termdebug-customizing*
834
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200835To change the name of the gdb command, set the "termdebugger" variable before
836invoking `:Termdebug`: >
837 let termdebugger = "mygdb"
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100838< *gdb-version*
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200839Only debuggers fully compatible with gdb will work. Vim uses the GDB/MI
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100840interface. The "new-ui" command requires gdb version 7.12 or later. if you
841get this error:
Bram Moolenaar01164a62017-11-02 22:58:42 +0100842 Undefined command: "new-ui". Try "help".~
843Then your gdb is too old.
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200844
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100845
846Colors *hl-debugPC* *hl-debugBreakpoint*
847
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200848The color of the signs can be adjusted with these highlight groups:
849- debugPC the current position
850- debugBreakpoint a breakpoint
851
852The defaults are, when 'background' is "light":
853 hi debugPC term=reverse ctermbg=lightblue guibg=lightblue
854 hi debugBreakpoint term=reverse ctermbg=red guibg=red
855
856When 'background' is "dark":
857 hi debugPC term=reverse ctermbg=darkblue guibg=darkblue
858 hi debugBreakpoint term=reverse ctermbg=red guibg=red
Bram Moolenaarc572da52017-08-27 16:52:01 +0200859
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100860
Bram Moolenaarb3307b52018-06-17 21:34:11 +0200861Shorcuts *termdebug_shortcuts*
862
863You can define your own shortcuts (mappings) to control gdb, that can work in
864any window, using the TermDebugSendCommand() function. Example: >
865 map ,w :call TermDebugSendCommand('where')<CR>
866The argument is the gdb command.
867
868
Bram Moolenaar71137fe2018-03-03 20:47:21 +0100869Popup menu *termdebug_popup*
870
871By default the Termdebug plugin sets 'mousemodel' to "popup_setpos" and adds
872these entries to the popup menu:
873 Set breakpoint `:Break`
874 Clear breakpoint `:Clear`
875 Evaluate `:Evaluate`
876If you don't want this then disable it with: >
877 let g:termdebug_popup = 0
878
879
880Vim window width *termdebug_wide*
881
Bram Moolenaar38baa3e2017-09-14 16:10:38 +0200882To change the width of the Vim window when debugging starts, and use a
883vertical split: >
884 let g:termdebug_wide = 163
885This will set &columns to 163 when :Termdebug is used. The value is restored
886when quitting the debugger.
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200887If g:termdebug_wide is set and &Columns is already larger than
888g:termdebug_wide then a vertical split will be used without changing &columns.
889Set it to 1 to get a vertical split without every changing &columns (useful
890for when the terminal can't be resized by Vim).
Bram Moolenaar38baa3e2017-09-14 16:10:38 +0200891
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200892
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200893
894 vim:tw=78:ts=8:ft=help:norl: