blob: da5b1481e1d7c5389816c28e7594b62bad310d02 [file] [log] [blame]
h-eastb534e802024-12-03 20:37:52 +01001*terminal.txt* For Vim version 9.1. Last change: 2024 Dec 03
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 Moolenaar6bf2c622019-07-04 17:12:09 +0200151. Basic use |terminal-use|
16 Typing |terminal-typing|
17 Size and color |terminal-size-color|
18 Command syntax |:terminal|
19 Resizing |terminal-resizing|
20 Terminal Modes |Terminal-mode|
21 Cursor style |terminal-cursor-style|
22 Session |terminal-session|
23 Special keys |terminal-special-keys|
24 Unix |terminal-unix|
25 MS-Windows |terminal-ms-windows|
262. Terminal functions |terminal-function-details|
273. Terminal communication |terminal-communication|
28 Vim to job: term_sendkeys() |terminal-to-job|
29 Job to Vim: JSON API |terminal-api|
30 Using the client-server feature |terminal-client-server|
314. Remote testing |terminal-testing|
325. Diffing screen dumps |terminal-diff|
Bram Moolenaar938ae282023-02-20 20:44:55 +000033 Writing a screen dump test for Vim |terminal-dumptest|
34 Creating a screen dump |terminal-screendump|
35 Comparing screen dumps |terminal-diffscreendump|
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200366. Debugging |terminal-debug|
37 Starting |termdebug-starting|
38 Example session |termdebug-example|
39 Stepping through code |termdebug-stepping|
40 Inspecting variables |termdebug-variables|
Sean Dewar3d3a9152023-08-23 17:14:49 +010041 Navigating stack frames |termdebug-frames|
Bram Moolenaar6bf2c622019-07-04 17:12:09 +020042 Other commands |termdebug-commands|
Bram Moolenaar2f0936c2022-01-08 21:51:59 +000043 Events |termdebug-events|
Bram Moolenaar6bf2c622019-07-04 17:12:09 +020044 Prompt mode |termdebug-prompt|
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +010045 Mappings |termdebug-mappings|
Bram Moolenaar6bf2c622019-07-04 17:12:09 +020046 Communication |termdebug-communication|
47 Customizing |termdebug-customizing|
Bram Moolenaare4f25e42017-07-07 11:54:15 +020048
Bram Moolenaarc572da52017-08-27 16:52:01 +020049{only available when compiled with the |+terminal| feature}
Bram Moolenaar4c92e752019-02-17 21:18:32 +010050The terminal feature requires the |+job| and |+channel| features.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020051
52==============================================================================
531. Basic use *terminal-use*
54
55This feature is for running a terminal emulator in a Vim window. A job can be
56started connected to the terminal emulator. For example, to run a shell: >
57 :term bash
58
Bram Moolenaare09ba7b2017-09-09 22:19:47 +020059Or to run build command: >
60 :term make myprogram
Bram Moolenaare4f25e42017-07-07 11:54:15 +020061
62The job runs asynchronously from Vim, the window will be updated to show
Bram Moolenaare09ba7b2017-09-09 22:19:47 +020063output from the job, also while editing in another window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020064
Bram Moolenaar423802d2017-07-30 16:52:24 +020065
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020066Typing ~
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +020067 *terminal-typing*
Bram Moolenaardd693ce2017-08-10 23:15:19 +020068When the keyboard focus is in the terminal window, typed keys will be sent to
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +020069the job. This uses a pty when possible. You can click outside of the
70terminal window to move keyboard focus elsewhere.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020071
Bram Moolenaar26967612019-03-17 17:13:16 +010072 *t_CTRL-W_CTRL-W* *t_CTRL-W_:*
Bram Moolenaar423802d2017-07-30 16:52:24 +020073CTRL-W can be used to navigate between windows and other CTRL-W commands, e.g.:
Bram Moolenaar60e73f22017-11-12 18:02:06 +010074 CTRL-W CTRL-W move focus to the next window
Bram Moolenaar423802d2017-07-30 16:52:24 +020075 CTRL-W : enter an Ex command
76See |CTRL-W| for more commands.
Bram Moolenaare4f25e42017-07-07 11:54:15 +020077
Bram Moolenaar664f3cf2019-12-07 16:03:51 +010078Special in the terminal window: *t_CTRL-W_.* *t_CTRL-W_N*
Bram Moolenaar423802d2017-07-30 16:52:24 +020079 CTRL-W . send a CTRL-W to the job in the terminal
Bram Moolenaarb59118d2018-04-13 22:11:56 +020080 CTRL-W CTRL-\ send a CTRL-\ to the job in the terminal
Bram Moolenaardd693ce2017-08-10 23:15:19 +020081 CTRL-W N go to Terminal-Normal mode, see |Terminal-mode|
82 CTRL-\ CTRL-N go to Terminal-Normal mode, see |Terminal-mode|
Bram Moolenaar26967612019-03-17 17:13:16 +010083 CTRL-W " {reg} paste register {reg} *t_CTRL-W_quote*
Bram Moolenaarf55e4c82017-08-01 20:44:53 +020084 Also works with the = register to insert the result of
85 evaluating an expression.
Bram Moolenaar8e539c52017-08-18 22:57:06 +020086 CTRL-W CTRL-C ends the job, see below |t_CTRL-W_CTRL-C|
Bram Moolenaar26967612019-03-17 17:13:16 +010087 CTRL-W gt go to next tabpage, same as `gt` *t_CTRL-W_gt*
88 CTRL-W gT go to previous tabpage, same as `gT` *t_CTRL-W_gT*
Bram Moolenaar423802d2017-07-30 16:52:24 +020089
Bram Moolenaar7dda86f2018-04-20 22:36:41 +020090See option 'termwinkey' for specifying another key instead of CTRL-W that
91will work like CTRL-W. However, typing 'termwinkey' twice sends 'termwinkey'
92to the job. For example:
93 'termwinkey' CTRL-W move focus to the next window
94 'termwinkey' : enter an Ex command
95 'termwinkey' 'termwinkey' send 'termwinkey' to the job in the terminal
Bram Moolenaardcdeaaf2018-06-17 22:19:12 +020096 'termwinkey' . send 'termwinkey' to the job in the terminal
97 'termwinkey' CTRL-\ send a CTRL-\ to the job in the terminal
Bram Moolenaar7dda86f2018-04-20 22:36:41 +020098 'termwinkey' N go to terminal Normal mode, see below
Bram Moolenaar26967612019-03-17 17:13:16 +010099 'termwinkey' CTRL-N same as CTRL-W N |t_CTRL-W_N|
100 'termwinkey' CTRL-C same as CTRL-W CTRL-C |t_CTRL-W_CTRL-C|
Bram Moolenaar69198192017-08-05 14:10:48 +0200101 *t_CTRL-\_CTRL-N*
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200102The special key combination CTRL-\ CTRL-N can be used to switch to Normal
103mode, just like this works in any other mode.
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200104 *t_CTRL-W_CTRL-C*
105CTRL-W CTRL-C can be typed to forcefully end the job. On MS-Windows a
Bram Moolenaar63f32602022-06-09 20:45:54 +0100106CTRL-Break will also kill the job.
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200107
108If you type CTRL-C the effect depends on what the pty has been configured to
109do. For simple commands this causes a SIGINT to be sent to the job, which
110would end it. Other commands may ignore the SIGINT or handle the CTRL-C
111themselves (like Vim does).
Bram Moolenaar423802d2017-07-30 16:52:24 +0200112
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200113To change the keys you type use terminal mode mappings, see |:tmap|.
114These are defined like any mapping, but apply only when typing keys that are
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100115sent to the job running in the terminal. For example, to make F1 switch
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200116to Terminal-Normal mode: >
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100117 tnoremap <F1> <C-W>N
118You can use Esc, but you need to make sure it won't cause other keys to
Bram Moolenaaracc22402020-06-07 21:07:18 +0200119break (cursor keys start with an Esc, so they may break), this probably only
120works in the GUI: >
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200121 tnoremap <Esc> <C-W>N
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100122 set notimeout ttimeout timeoutlen=100
123
Bram Moolenaar4c5d8152018-10-19 22:36:53 +0200124You can also create menus similar to terminal mode mappings, but you have to
125use |:tlmenu| instead of |:tmenu|.
126
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200127 *options-in-terminal*
Bram Moolenaar24a98a02017-09-27 22:23:55 +0200128After opening the terminal window and setting 'buftype' to "terminal" the
Bram Moolenaar23515b42020-11-29 14:36:24 +0100129|TerminalWinOpen| autocommand event is triggered. This makes it possible to set
130options specifically for the terminal window and buffer. Example: >
131 au TerminalWinOpen * setlocal bufhidden=hide
Bram Moolenaar942db232021-02-13 18:14:48 +0100132This only works properly if the terminal is not hidden.
Bram Moolenaar23515b42020-11-29 14:36:24 +0100133
Bram Moolenaar942db232021-02-13 18:14:48 +0100134For both hidden and non-hidden terminals this works, both for buffer-local and
135window-local options: >
136 au TerminalWinOpen,BufWinEnter * if &buftype == 'terminal'
137 \ | setlocal bufhidden=hide colorcolumn=123
138 \ | endif
139Note that for a hidden terminal the options are not set until the terminal is
140no longer hidden.
141
142There is also the |TerminalOpen| event. Keep in mind this may be triggered
143for a hidden terminal, then the current window and buffer are not that of the
144new terminal.
Bram Moolenaar23515b42020-11-29 14:36:24 +0100145You need to use <abuf>, which is set to the terminal buffer. Example: >
Bram Moolenaar942db232021-02-13 18:14:48 +0100146 au TerminalOpen * call setbufvar(expand('<abuf>')->str2nr(),
147 \ '&termwinscroll', 1000)
148For a window-local option, you need to delay setting the option until the
149terminal window has been created (this only works for a hidden terminal): >
150 au TerminalOpen * exe printf(
151 \ 'au BufWinEnter <buffer=%d> ++once setlocal colorcolumn=%d',
152 \ expand('<abuf>')->str2nr(), 123)
153For a non-hidden terminal use |TerminalWinOpen|.
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200154
Bram Moolenaar52dbb5e2017-11-21 18:11:27 +0100155Mouse events (click and drag) are passed to the terminal. Mouse move events
156are only passed when Vim itself is receiving them. For a terminal that is
157when 'balloonevalterm' is enabled.
158
Bram Moolenaar1f28b4c2017-07-28 13:48:34 +0200159
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200160Size and color ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100161 *terminal-size-color*
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200162See option 'termwinsize' for controlling the size of the terminal window.
Bram Moolenaar74675a62017-07-15 13:53:23 +0200163(TODO: scrolling when the terminal is larger than the window)
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200164
Bram Moolenaar38baa3e2017-09-14 16:10:38 +0200165The job running in the terminal can change the colors. The default foreground
166and background colors are taken from Vim, the Normal highlight group.
167
168For a color terminal the 'background' option is used to decide whether the
169terminal window will start with a white or black background.
170
Bram Moolenaardf980db2017-12-24 13:22:00 +0100171To use a different color the Terminal highlight group can be used, for
172example: >
Bram Moolenaar38baa3e2017-09-14 16:10:38 +0200173 hi Terminal ctermbg=lightgrey ctermfg=blue guibg=lightgrey guifg=blue
Bram Moolenaar83d47902020-03-26 20:34:00 +0100174Instead of Terminal another group can be specified with the "term_highlight"
175option for `term_start()`.
176
Bram Moolenaarf59c6e82018-04-10 15:59:11 +0200177 *g:terminal_ansi_colors*
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200178In GUI mode or with 'termguicolors', the 16 ANSI colors used by default in new
Bram Moolenaarf59c6e82018-04-10 15:59:11 +0200179terminal windows may be configured using the variable
180`g:terminal_ansi_colors`, which should be a list of 16 color names or
181hexadecimal color codes, similar to those accepted by |highlight-guifg|. When
182not using GUI colors, the terminal window always uses the 16 ANSI colors of
183the underlying terminal.
Bram Moolenaar388a5d42020-05-26 21:20:45 +0200184When using `term_start()` the colors can be set with the "ansi_colors" option.
Bram Moolenaarf59c6e82018-04-10 15:59:11 +0200185The |term_setansicolors()| function can be used to change the colors, and
186|term_getansicolors()| to get the currently used colors.
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200187
Bram Moolenaar423802d2017-07-30 16:52:24 +0200188
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200189Command syntax ~
Bram Moolenaar8a773062017-07-24 22:29:21 +0200190
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200191:[range]ter[minal] [options] [command] *:ter* *:terminal*
Bram Moolenaar8a773062017-07-24 22:29:21 +0200192 Open a new terminal window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200193
194 If [command] is provided run it as a job and connect
195 the input and output to the terminal.
196 If [command] is not given the 'shell' option is used.
Bram Moolenaarc572da52017-08-27 16:52:01 +0200197 if [command] is NONE no job is started, the pty of the
198 terminal can be used by a command like gdb.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200199
matveyta01148d2024-11-23 14:19:58 +0100200 *terminal-nospecial*
201 Vim itself only recognizes |cmdline-special|
202 characters inside [command]. Everything else will be
203 passed untouched. When needed to expand wildcards,
204 environment variables or other shell specials consider
205 |term++shell| option.
206
Bram Moolenaar1dd98332018-03-16 22:54:53 +0100207 If [command] is missing the default behavior is to
208 close the terminal when the shell exits. This can be
209 changed with the ++noclose argument.
210 If [command] is present the default behavior is to
211 keep the terminal open in Terminal-Normal mode. This
212 can be changed with the ++close argument.
213
Bram Moolenaar7ceefb32020-05-01 16:07:38 +0200214 No Vim command can follow, any | is included in
215 [command]. Use `:execute` if you must have a Vim
216 command following in the same line.
217
Christian Brabandtec9c3262024-02-21 20:40:05 +0100218 *terminal-bufname*
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200219 A new buffer will be created, using [command] or
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200220 'shell' as the name, prefixed with a "!". If a buffer
221 by this name already exists a number is added in
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200222 parentheses. E.g. if "gdb" exists the second terminal
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200223 buffer will use "!gdb (1)".
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200224
Bram Moolenaarb2412082017-08-20 18:09:14 +0200225 If [range] is given the specified lines are used as
226 input for the job. It will not be possible to type
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200227 keys in the terminal window. For MS-Windows see the
228 ++eof argument below.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200229
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200230 *term++close* *term++open*
231 Supported [options] are:
232 ++close The terminal window will close
233 automatically when the job terminates.
Bram Moolenaar4d14bac2019-10-20 21:15:15 +0200234 |terminal-close|
Bram Moolenaar1dd98332018-03-16 22:54:53 +0100235 ++noclose The terminal window will NOT close
236 automatically when the job terminates.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200237 ++open When the job terminates and no window
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200238 shows it, a window will be opened.
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200239 Note that this can be interruptive.
Bram Moolenaar1dd98332018-03-16 22:54:53 +0100240 The last of ++close, ++noclose and ++open
241 matters and rules out earlier arguments.
242
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200243 ++curwin Open the terminal in the current
244 window, do not split the current
245 window. Fails if the current buffer
246 cannot be |abandon|ed.
247 ++hidden Open the terminal in a hidden buffer,
248 no window will be used.
Bram Moolenaarb5b75622018-03-09 22:22:21 +0100249 ++norestore Do not include this terminal window
250 in a session file.
matveyta01148d2024-11-23 14:19:58 +0100251
252 *term++shell*
Bram Moolenaar197c6b72019-11-03 23:37:12 +0100253 ++shell Instead of executing {command}
254 directly, use a shell, like with
Bram Moolenaar938ae282023-02-20 20:44:55 +0000255 `:!command` *E279*
Bram Moolenaar519cc552021-11-16 19:18:26 +0000256 {only works on Unix and MS-Windows}
matveyta01148d2024-11-23 14:19:58 +0100257 The resulting command will look like
258 'shell' 'shellcmdflag' [command]
259 Other options related to `:!command`
260 have no effect.
Bram Moolenaar25cdd9c2018-03-10 20:28:12 +0100261 ++kill={how} When trying to close the terminal
262 window kill the job with {how}. See
263 |term_setkill()| for the values.
Bram Moolenaarb2412082017-08-20 18:09:14 +0200264 ++rows={height} Use {height} for the terminal window
Bram Moolenaar40962ec2018-01-28 22:47:25 +0100265 height. If the terminal uses the full
266 Vim height (no window above or below
Bram Moolenaar0b0f0992018-05-22 21:41:30 +0200267 the terminal window) the command line
Bram Moolenaar40962ec2018-01-28 22:47:25 +0100268 height will be reduced as needed.
Bram Moolenaarb2412082017-08-20 18:09:14 +0200269 ++cols={width} Use {width} for the terminal window
Bram Moolenaar40962ec2018-01-28 22:47:25 +0100270 width. If the terminal uses the full
271 Vim width (no window left or right of
272 the terminal window) this value is
273 ignored.
Bram Moolenaard2842ea2019-09-26 23:08:54 +0200274 ++eof={text} When using [range]: text to send after
Bram Moolenaare09ba7b2017-09-09 22:19:47 +0200275 the last line was written. Cannot
276 contain white space. A CR is
277 appended. For MS-Windows the default
278 is to send CTRL-D.
Bram Moolenaaref68e4f2017-09-02 16:28:36 +0200279 E.g. for a shell use "++eof=exit" and
280 for Python "++eof=exit()". Special
281 codes can be used like with `:map`,
282 e.g. "<C-Z>" for CTRL-Z.
Bram Moolenaarc6ddce32019-02-08 12:47:03 +0100283 ++type={pty} (MS-Windows only): Use {pty} as the
284 virtual console. See 'termwintype'
285 for the values.
Bram Moolenaard2842ea2019-09-26 23:08:54 +0200286 ++api={expr} Permit the function name starting with
287 {expr} to be called as |terminal-api|
288 function. If {expr} is empty then no
289 function can be called.
Bram Moolenaarc6ddce32019-02-08 12:47:03 +0100290
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200291 If you want to use more options use the |term_start()|
292 function.
Bram Moolenaarfc65cab2018-08-28 22:58:02 +0200293 If you want to split the window vertically, use: >
294 :vertical terminal
295< Or short: >
296 :vert ter
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200297
Bram Moolenaar25cdd9c2018-03-10 20:28:12 +0100298When the buffer associated with the terminal is forcibly unloaded or wiped out
299the job is killed, similar to calling `job_stop(job, "kill")` .
300Closing the window normally results in |E947|. When a kill method was set
301with "++kill={how}" or |term_setkill()| then closing the window will use that
302way to kill or interrupt the job. For example: >
303 :term ++kill=term tail -f /tmp/log
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200304
Bram Moolenaare561a7e2017-08-29 22:44:59 +0200305So long as the job is running the window behaves like it contains a modified
Bram Moolenaaref68e4f2017-09-02 16:28:36 +0200306buffer. Trying to close the window with `CTRL-W :quit` fails. When using
Yee Cheng Chin42826332022-10-10 11:46:16 +0100307`CTRL-W :quit!` the job is ended. The text in the window is lost, the buffer
308is deleted. With `CTRL-W :bunload!` the buffer remains but will be empty.
Bram Moolenaaref68e4f2017-09-02 16:28:36 +0200309
310Trying to close the window with `CTRL-W :close` also fails. Using
311`CTRL-W :close!` will close the window and make the buffer hidden.
Bram Moolenaare561a7e2017-08-29 22:44:59 +0200312
313You can use `CTRL-W :hide` to close the terminal window and make the buffer
314hidden, the job keeps running. The `:buffer` command can be used to turn the
315current window into a terminal window. If there are unsaved changes this
Bram Moolenaar0b0f0992018-05-22 21:41:30 +0200316fails, use ! to force, as usual.
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200317
Bram Moolenaar4d14bac2019-10-20 21:15:15 +0200318 *terminal-close*
Christian Brabandt0e17f7e2024-03-17 20:14:25 +0100319When the terminal job finishes and no [command] was given (e.g. the 'shell'
320command was executed), the terminal window will be closed by default (unless
321the buffer in next window receiving the space has the 'nobuflisted' option set,
322in which case the terminal window would not be closed automatically, but a new
323empty buffer would be opened in that window).
324
Bram Moolenaar4d14bac2019-10-20 21:15:15 +0200325When the terminal window is closed, e.g. when the shell exits and "++close"
326argument was used, and this is the last normal Vim window, then Vim will exit.
327This is like using |:quit| in a normal window. Help and preview windows are
328not counted.
329
Bram Moolenaar8cad9302017-08-12 14:32:32 +0200330To have a background job run without a window, and open the window when it's
331done, use options like this: >
332 :term ++hidden ++open make
333Note that the window will open at an unexpected moment, this will interrupt
334what you are doing.
335
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200336 *E947* *E948*
Bram Moolenaar78712a72017-08-05 14:50:12 +0200337So long as the job is running, the buffer is considered modified and Vim
338cannot be quit easily, see |abandon|.
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200339
340When the job has finished and no changes were made to the buffer: closing the
341window will wipe out the buffer.
342
343Before changes can be made to a terminal buffer, the 'modifiable' option must
344be set. This is only possible when the job has finished. At the first change
345the buffer will become a normal buffer and the highlighting is removed.
346You may want to change the buffer name with |:file| to be able to write, since
347the buffer name will still be set to the command.
348
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200349
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200350Resizing ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100351 *terminal-resizing*
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200352The size of the terminal can be in one of three modes:
353
Bram Moolenaar7dda86f2018-04-20 22:36:41 +02003541. The 'termwinsize' option is empty: The terminal size follows the window
355 size. The minimal size is 2 screen lines with 10 cells.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200356
Bram Moolenaar7dda86f2018-04-20 22:36:41 +02003572. The 'termwinsize' option is "rows*cols", where "rows" is the minimal number
358 of screen rows and "cols" is the minimal number of cells.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200359
Bram Moolenaar7dda86f2018-04-20 22:36:41 +02003603. The 'termwinsize' option is "rowsXcols" (where the x is upper or lower
361 case). The terminal size is fixed to the specified number of screen lines
362 and cells. If the window is bigger there will be unused empty space.
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200363
364If the window is smaller than the terminal size, only part of the terminal can
365be seen (the lower-left part).
366
367The |term_getsize()| function can be used to get the current size of the
368terminal. |term_setsize()| can be used only when in the first or second mode,
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200369not when 'termwinsize' is "rowsXcols".
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200370
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200371
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200372Terminal-Job and Terminal-Normal mode ~
Bram Moolenaar8c041b62018-04-14 18:14:06 +0200373 *Terminal-mode* *Terminal-Job*
Bram Moolenaar423802d2017-07-30 16:52:24 +0200374When the job is running the contents of the terminal is under control of the
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200375job. That includes the cursor position. Typed keys are sent to the job.
376The terminal contents can change at any time. This is called Terminal-Job
377mode.
Bram Moolenaar423802d2017-07-30 16:52:24 +0200378
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200379Use CTRL-W N (or 'termwinkey' N) to switch to Terminal-Normal mode. Now the
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200380contents of the terminal window is under control of Vim, the job output is
381suspended. CTRL-\ CTRL-N does the same.
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200382
Bram Moolenaar1b9645d2017-09-17 23:03:31 +0200383Terminal-Job mode is where |:tmap| mappings are applied. Keys sent by
Bram Moolenaar69fbc9e2017-09-14 20:37:57 +0200384|term_sendkeys()| are not subject to tmap, but keys from |feedkeys()| are.
385
Bram Moolenaar8c041b62018-04-14 18:14:06 +0200386It is not possible to enter Insert mode from Terminal-Job mode.
387
388 *Terminal-Normal* *E946*
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200389In Terminal-Normal mode you can move the cursor around with the usual Vim
390commands, Visually mark text, yank text, etc. But you cannot change the
391contents of the buffer. The commands that would start insert mode, such as
392'i' and 'a', return to Terminal-Job mode. The window will be updated to show
Bram Moolenaar1b9645d2017-09-17 23:03:31 +0200393the contents of the terminal. |:startinsert| is ineffective.
Bram Moolenaar423802d2017-07-30 16:52:24 +0200394
Bram Moolenaardd693ce2017-08-10 23:15:19 +0200395In Terminal-Normal mode the statusline and window title show "(Terminal)". If
396the job ends while in Terminal-Normal mode this changes to
397"(Terminal-finished)".
Bram Moolenaar423802d2017-07-30 16:52:24 +0200398
Bram Moolenaar8c041b62018-04-14 18:14:06 +0200399When the job outputs lines in the terminal, such that the contents scrolls off
400the top, those lines are remembered and can be seen in Terminal-Normal mode.
Bram Moolenaar7dda86f2018-04-20 22:36:41 +0200401The number of lines is limited by the 'termwinscroll' option. When going over
Bram Moolenaar7db25fe2018-05-13 00:02:36 +0200402this limit, the first 10% of the scrolled lines are deleted and are lost.
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200403
Bram Moolenaar423802d2017-07-30 16:52:24 +0200404
Bram Moolenaarc572da52017-08-27 16:52:01 +0200405Cursor style ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100406 *terminal-cursor-style*
Bram Moolenaarc572da52017-08-27 16:52:01 +0200407By default the cursor in the terminal window uses a not blinking block. The
408normal xterm escape sequences can be used to change the blinking state and the
409shape. Once focus leaves the terminal window Vim will restore the original
410cursor.
411
412An exception is when xterm is started with the "-bc" argument, or another way
413that causes the cursor to blink. This actually means that the blinking flag
414is inverted. Since Vim cannot detect this, the terminal window cursor
415blinking will also be inverted.
416
417
Bram Moolenaarb5b75622018-03-09 22:22:21 +0100418Session ~
419 *terminal-session*
420A terminal window will be restored when using a session file, if possible and
421wanted.
422
423If "terminal" was removed from 'sessionoptions' then no terminal windows will
424be restored.
425
426If the job in the terminal was finished the window will not be restored.
427
428If the terminal can be restored, the command that was used to open it will be
429used again. To change this use the |term_setrestore()| function. This can
430also be used to not restore a specific terminal by setting the command to
431"NONE".
432
433
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100434Special keys ~
435 *terminal-special-keys*
436Since the terminal emulator simulates an xterm, only escape sequences that
437both Vim and xterm recognize will be available in the terminal window. If you
438want to pass on other escape sequences to the job running in the terminal you
439need to set up forwarding. Example: >
440 tmap <expr> <Esc>]b SendToTerm("\<Esc>]b")
Bram Moolenaar60e73f22017-11-12 18:02:06 +0100441 func SendToTerm(what)
442 call term_sendkeys('', a:what)
443 return ''
444 endfunc
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200445
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100446
447Unix ~
448 *terminal-unix*
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200449On Unix a pty is used to make it possible to run all kinds of commands. You
450can even run Vim in the terminal! That's used for debugging, see below.
451
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200452Environment variables are used to pass information to the running job:
Bram Moolenaar9a993e32018-04-05 22:15:22 +0200453 TERM the name of the terminal, from the 'term' option or
454 $TERM in the GUI; falls back to "xterm" if it does not
455 start with "xterm"
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200456 ROWS number of rows in the terminal initially
457 LINES same as ROWS
458 COLUMNS number of columns in the terminal initially
459 COLORS number of colors, 't_Co' (256*256*256 in the GUI)
460 VIM_SERVERNAME v:servername
Bram Moolenaard7a137f2018-06-12 18:05:24 +0200461 VIM_TERMINAL v:version
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200462
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200463
464MS-Windows ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +0100465 *terminal-ms-windows*
Bram Moolenaar8a773062017-07-24 22:29:21 +0200466On MS-Windows winpty is used to make it possible to run all kind of commands.
467Obviously, they must be commands that run in a terminal, not open their own
468window.
469
470You need the following two files from winpty:
471
472 winpty.dll
473 winpty-agent.exe
474
475You can download them from the following page:
476
477 https://github.com/rprichard/winpty
478
Bram Moolenaar8e539c52017-08-18 22:57:06 +0200479Just put the files somewhere in your PATH. You can set the 'winptydll' option
480to point to the right file, if needed. If you have both the 32-bit and 64-bit
481version, rename to winpty32.dll and winpty64.dll to match the way Vim was
482build.
Bram Moolenaar5acd9872019-02-16 13:35:13 +0100483 *ConPTY* *E982*
Bram Moolenaaraa5df7e2019-02-03 14:53:10 +0100484On more recent versions of MS-Windows 10 (beginning with the "October 2018
485Update"), winpty is no longer required. On those versions, |:terminal| will use
486Windows' built-in support for hosting terminal applications, "ConPTY". When
487ConPTY is in use, there may be rendering artifacts regarding ambiguous-width
Bram Moolenaar5acd9872019-02-16 13:35:13 +0100488characters. If you encounter any such issues, install "winpty". Until the
489ConPTY problems have been fixed "winpty" will be preferred.
Bram Moolenaarb6e0ec62017-07-23 22:12:20 +0200490
Bram Moolenaar52dbb5e2017-11-21 18:11:27 +0100491Environment variables are used to pass information to the running job:
492 VIM_SERVERNAME v:servername
493
Bram Moolenaare4f25e42017-07-07 11:54:15 +0200494==============================================================================
Bram Moolenaar6bf2c622019-07-04 17:12:09 +02004952. Terminal functions *terminal-function-details*
496
497 *term_dumpdiff()*
498term_dumpdiff({filename}, {filename} [, {options}])
499 Open a new window displaying the difference between the two
500 files. The files must have been created with
501 |term_dumpwrite()|.
502 Returns the buffer number or zero when the diff fails.
503 Also see |terminal-diff|.
504 NOTE: this does not work with double-width characters yet.
505
506 The top part of the buffer contains the contents of the first
507 file, the bottom part of the buffer contains the contents of
508 the second file. The middle part shows the differences.
509 The parts are separated by a line of equals.
510
511 If the {options} argument is present, it must be a Dict with
512 these possible members:
513 "term_name" name to use for the buffer name, instead
514 of the first file name.
515 "term_rows" vertical size to use for the terminal,
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200516 instead of using 'termwinsize', but
517 respecting the minimal size
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200518 "term_cols" horizontal size to use for the terminal,
Bram Moolenaar1c6737b2020-09-07 22:18:52 +0200519 instead of using 'termwinsize', but
520 respecting the minimal size
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200521 "vertical" split the window vertically
522 "curwin" use the current window, do not split the
523 window; fails if the current buffer
524 cannot be |abandon|ed
525 "bufnr" do not create a new buffer, use the
526 existing buffer "bufnr". This buffer
527 must have been previously created with
528 term_dumpdiff() or term_dumpload() and
529 visible in a window.
530 "norestore" do not add the terminal window to a
531 session file
532
533 Each character in the middle part indicates a difference. If
534 there are multiple differences only the first in this list is
535 used:
536 X different character
537 w different width
538 f different foreground color
539 b different background color
540 a different attribute
541 + missing position in first file
542 - missing position in second file
Bram Moolenaar4466ad62020-11-21 13:16:30 +0100543 > cursor position in first file, not in second
Bram Moolenaar23515b42020-11-29 14:36:24 +0100544 < cursor position in second file, not in first
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200545
546 Using the "s" key the top and bottom parts are swapped. This
547 makes it easy to spot a difference.
548
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200549 Can also be used as a |method|: >
550 GetFilename()->term_dumpdiff(otherfile)
551<
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200552 Return type: |Number|
553
554
555term_dumpload({filename} [, {options}]) *term_dumpload()*
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200556 Open a new window displaying the contents of {filename}
557 The file must have been created with |term_dumpwrite()|.
558 Returns the buffer number or zero when it fails.
559 Also see |terminal-diff|.
560
561 For {options} see |term_dumpdiff()|.
562
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200563 Can also be used as a |method|: >
Bram Moolenaar2e693a82019-10-16 22:35:02 +0200564 GetFilename()->term_dumpload()
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200565<
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200566 Return type: |Number|
567
568
569term_dumpwrite({buf}, {filename} [, {options}]) *term_dumpwrite()*
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200570 Dump the contents of the terminal screen of {buf} in the file
571 {filename}. This uses a format that can be used with
572 |term_dumpload()| and |term_dumpdiff()|.
573 If the job in the terminal already finished an error is given:
574 *E958*
575 If {filename} already exists an error is given: *E953*
576 Also see |terminal-diff|.
577
578 {options} is a dictionary with these optional entries:
579 "rows" maximum number of rows to dump
580 "columns" maximum number of columns to dump
581
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200582 Can also be used as a |method|, the base is used for the file
583 name: >
Bram Moolenaar2e693a82019-10-16 22:35:02 +0200584 GetFilename()->term_dumpwrite(bufnr)
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200585<
586 Return type: |Number|
587
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200588
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200589term_getaltscreen({buf}) *term_getaltscreen()*
590 Returns 1 if the terminal of {buf} is using the alternate
591 screen.
592 {buf} is used as with |term_getsize()|.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200593
594 Can also be used as a |method|: >
595 GetBufnr()->term_getaltscreen()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200596<
597 Return type: |Number|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200598
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200599
600term_getansicolors({buf}) *term_getansicolors()*
601 Get the ANSI color palette in use by terminal {buf}.
602 Returns a List of length 16 where each element is a String
603 representing a color in hexadecimal "#rrggbb" format.
604 Also see |term_setansicolors()| and |g:terminal_ansi_colors|.
605 If neither was used returns the default colors.
606
607 {buf} is used as with |term_getsize()|. If the buffer does not
608 exist or is not a terminal window, an empty list is returned.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200609
610 Can also be used as a |method|: >
611 GetBufnr()->term_getansicolors()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200612<
613 Return type: list<string> or list<any>
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200614
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200615 {only available when compiled with GUI enabled and/or the
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200616 |+termguicolors| feature}
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200617
618term_getattr({attr}, {what}) *term_getattr()*
619 Given {attr}, a value returned by term_scrape() in the "attr"
620 item, return whether {what} is on. {what} can be one of:
621 bold
622 italic
623 underline
624 strike
625 reverse
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200626
627 Can also be used as a |method|: >
628 GetAttr()->term_getattr()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200629<
630 Return type: |Number|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200631
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200632
633term_getcursor({buf}) *term_getcursor()*
634 Get the cursor position of terminal {buf}. Returns a list with
635 two numbers and a dictionary: [row, col, dict].
636
637 "row" and "col" are one based, the first screen cell is row
638 1, column 1. This is the cursor position of the terminal
639 itself, not of the Vim window.
640
641 "dict" can have these members:
642 "visible" one when the cursor is visible, zero when it
643 is hidden.
644 "blink" one when the cursor is blinking, zero when it
645 is not blinking.
646 "shape" 1 for a block cursor, 2 for underline and 3
647 for a vertical bar.
648 "color" color of the cursor, e.g. "green"
649
650 {buf} must be the buffer number of a terminal window. If the
651 buffer does not exist or is not a terminal window, an empty
652 list is returned.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200653
654 Can also be used as a |method|: >
655 GetBufnr()->term_getcursor()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200656<
657 Return type: list<any>
658
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200659
660term_getjob({buf}) *term_getjob()*
661 Get the Job associated with terminal window {buf}.
662 {buf} is used as with |term_getsize()|.
Ernie Raela78eb252024-06-13 17:24:54 +0200663 Returns |v:null| when there is no job. In Vim9 script, return
h-east84ac2122024-06-17 18:12:30 +0200664 |null_job| when there is no job.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200665
666 Can also be used as a |method|: >
667 GetBufnr()->term_getjob()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200668<
669 Return type: |job|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200670
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200671
672term_getline({buf}, {row}) *term_getline()*
673 Get a line of text from the terminal window of {buf}.
674 {buf} is used as with |term_getsize()|.
675
676 The first line has {row} one. When {row} is "." the cursor
677 line is used. When {row} is invalid an empty string is
678 returned.
679
680 To get attributes of each character use |term_scrape()|.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200681
682 Can also be used as a |method|: >
683 GetBufnr()->term_getline(row)
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200684<
685 Return type: |String|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200686
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200687
688term_getscrolled({buf}) *term_getscrolled()*
689 Return the number of lines that scrolled to above the top of
690 terminal {buf}. This is the offset between the row number
691 used for |term_getline()| and |getline()|, so that: >
692 term_getline(buf, N)
693< is equal to: >
694 getline(N + term_getscrolled(buf))
695< (if that line exists).
696
697 {buf} is used as with |term_getsize()|.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200698
699 Can also be used as a |method|: >
700 GetBufnr()->term_getscrolled()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200701<
702 Return type: |Number|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200703
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200704
705term_getsize({buf}) *term_getsize()*
706 Get the size of terminal {buf}. Returns a list with two
707 numbers: [rows, cols]. This is the size of the terminal, not
708 the window containing the terminal.
709
710 {buf} must be the buffer number of a terminal window. Use an
711 empty string for the current buffer. If the buffer does not
712 exist or is not a terminal window, an empty list is returned.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200713
714 Can also be used as a |method|: >
715 GetBufnr()->term_getsize()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200716<
717 Return type: list<number> or list<any>
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200718
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200719
720term_getstatus({buf}) *term_getstatus()*
Bram Moolenaar29634562020-01-09 21:46:04 +0100721 Get the status of terminal {buf}. This returns a String with
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +0100722 a comma-separated list of these items:
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200723 running job is running
724 finished job has finished
725 normal in Terminal-Normal mode
726 One of "running" or "finished" is always present.
727
728 {buf} must be the buffer number of a terminal window. If the
729 buffer does not exist or is not a terminal window, an empty
730 string is returned.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200731
732 Can also be used as a |method|: >
733 GetBufnr()->term_getstatus()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200734<
735 Return type: |String|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200736
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200737
738term_gettitle({buf}) *term_gettitle()*
739 Get the title of terminal {buf}. This is the title that the
740 job in the terminal has set.
741
742 {buf} must be the buffer number of a terminal window. If the
743 buffer does not exist or is not a terminal window, an empty
744 string is returned.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200745
746 Can also be used as a |method|: >
747 GetBufnr()->term_gettitle()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200748<
749 Return type: |String|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200750
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200751
752term_gettty({buf} [, {input}]) *term_gettty()*
753 Get the name of the controlling terminal associated with
754 terminal window {buf}. {buf} is used as with |term_getsize()|.
755
756 When {input} is omitted or 0, return the name for writing
757 (stdout). When {input} is 1 return the name for reading
758 (stdin). On UNIX, both return same name.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200759
760 Can also be used as a |method|: >
761 GetBufnr()->term_gettty()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200762<
763 Return type: |String|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200764
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200765
766term_list() *term_list()*
767 Return a list with the buffer numbers of all buffers for
768 terminal windows.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200769
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200770 Return type: list<number> or list<any>
771
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200772
773term_scrape({buf}, {row}) *term_scrape()*
774 Get the contents of {row} of terminal screen of {buf}.
775 For {buf} see |term_getsize()|.
776
777 The first line has {row} one. When {row} is "." the cursor
778 line is used. When {row} is invalid an empty string is
779 returned.
780
781 Return a List containing a Dict for each screen cell:
782 "chars" character(s) at the cell
783 "fg" foreground color as #rrggbb
784 "bg" background color as #rrggbb
785 "attr" attributes of the cell, use |term_getattr()|
786 to get the individual flags
787 "width" cell width: 1 or 2
Bram Moolenaar942db232021-02-13 18:14:48 +0100788 For a double-width cell there is one item, thus the list can
789 be shorter than the width of the terminal.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200790
791 Can also be used as a |method|: >
792 GetBufnr()->term_scrape(row)
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200793<
794 Return type: list<dict<any>> or list<any>
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200795
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200796
797term_sendkeys({buf}, {keys}) *term_sendkeys()*
798 Send keystrokes {keys} to terminal {buf}.
799 {buf} is used as with |term_getsize()|.
800
801 {keys} are translated as key sequences. For example, "\<c-x>"
802 means the character CTRL-X.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200803
804 Can also be used as a |method|: >
805 GetBufnr()->term_sendkeys(keys)
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200806<
807 Return type: |Number|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200808
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200809
810term_setansicolors({buf}, {colors}) *term_setansicolors()*
811 Set the ANSI color palette used by terminal {buf}.
812 {colors} must be a List of 16 valid color names or hexadecimal
813 color codes, like those accepted by |highlight-guifg|.
814 Also see |term_getansicolors()| and |g:terminal_ansi_colors|.
815
816 The colors normally are:
817 0 black
818 1 dark red
819 2 dark green
820 3 brown
821 4 dark blue
822 5 dark magenta
823 6 dark cyan
824 7 light grey
825 8 dark grey
826 9 red
827 10 green
828 11 yellow
829 12 blue
830 13 magenta
831 14 cyan
832 15 white
833
834 These colors are used in the GUI and in the terminal when
835 'termguicolors' is set. When not using GUI colors (GUI mode
836 or 'termguicolors'), the terminal window always uses the 16
837 ANSI colors of the underlying terminal.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200838
839 Can also be used as a |method|: >
840 GetBufnr()->term_setansicolors(colors)
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200841<
842 Return type: |Number|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200843
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200844 {only available with GUI enabled and/or the |+termguicolors|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200845 feature}
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200846
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200847
848term_setapi({buf}, {expr}) *term_setapi()*
849 Set the function name prefix to be used for the |terminal-api|
850 function in terminal {buf}. For example: >
851 :call term_setapi(buf, "Myapi_")
852 :call term_setapi(buf, "")
853<
854 The default is "Tapi_". When {expr} is an empty string then
855 no |terminal-api| function can be used for {buf}.
856
857 When used as a method the base is used for {buf}: >
858 GetBufnr()->term_setapi({expr})
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200859<
860 Return type: |Number|
Bram Moolenaar89a9c152021-08-29 21:55:35 +0200861
862
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200863term_setkill({buf}, {how}) *term_setkill()*
864 When exiting Vim or trying to close the terminal window in
865 another way, {how} defines whether the job in the terminal can
866 be stopped.
867 When {how} is empty (the default), the job will not be
868 stopped, trying to exit will result in |E947|.
869 Otherwise, {how} specifies what signal to send to the job.
870 See |job_stop()| for the values.
871
872 After sending the signal Vim will wait for up to a second to
873 check that the job actually stopped.
874
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200875 Can also be used as a |method|: >
876 GetBufnr()->term_setkill(how)
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200877<
878 Return type: |Number|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200879
880
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200881term_setrestore({buf}, {command}) *term_setrestore()*
882 Set the command to write in a session file to restore the job
883 in this terminal. The line written in the session file is: >
884 terminal ++curwin ++cols=%d ++rows=%d {command}
885< Make sure to escape the command properly.
886
887 Use an empty {command} to run 'shell'.
888 Use "NONE" to not restore this window.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200889
890 Can also be used as a |method|: >
891 GetBufnr()->term_setrestore(command)
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200892<
893 Return type: |Number|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200894
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200895
896term_setsize({buf}, {rows}, {cols}) *term_setsize()* *E955*
897 Set the size of terminal {buf}. The size of the window
898 containing the terminal will also be adjusted, if possible.
899 If {rows} or {cols} is zero or negative, that dimension is not
900 changed.
901
902 {buf} must be the buffer number of a terminal window. Use an
903 empty string for the current buffer. If the buffer does not
904 exist or is not a terminal window, an error is given.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200905
906 Can also be used as a |method|: >
907 GetBufnr()->term_setsize(rows, cols)
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200908<
909 Return type: |Number|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200910
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200911
912term_start({cmd} [, {options}]) *term_start()*
913 Open a terminal window and run {cmd} in it.
914
915 {cmd} can be a string or a List, like with |job_start()|. The
916 string "NONE" can be used to open a terminal window without
917 starting a job, the pty of the terminal can be used by a
918 command like gdb.
919
920 Returns the buffer number of the terminal window. If {cmd}
921 cannot be executed the window does open and shows an error
922 message.
923 If opening the window fails zero is returned.
924
925 {options} are similar to what is used for |job_start()|, see
926 |job-options|. However, not all options can be used. These
927 are supported:
928 all timeout options
929 "stoponexit", "cwd", "env"
930 "callback", "out_cb", "err_cb", "exit_cb", "close_cb"
931 "in_io", "in_top", "in_bot", "in_name", "in_buf"
932 "out_io", "out_name", "out_buf", "out_modifiable", "out_msg"
933 "err_io", "err_name", "err_buf", "err_modifiable", "err_msg"
934 However, at least one of stdin, stdout or stderr must be
935 connected to the terminal. When I/O is connected to the
936 terminal then the callback function for that part is not used.
937
938 There are extra options:
939 "term_name" name to use for the buffer name, instead
940 of the command name.
941 "term_rows" vertical size to use for the terminal,
Bram Moolenaar5300be62021-11-13 10:27:40 +0000942 instead of using 'termwinsize'; valid
943 range is from zero to 1000
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200944 "term_cols" horizontal size to use for the terminal,
945 instead of using 'termwinsize'
946 "vertical" split the window vertically; note that
947 other window position can be defined with
948 command modifiers, such as |:belowright|.
949 "curwin" use the current window, do not split the
950 window; fails if the current buffer
951 cannot be |abandon|ed
952 "hidden" do not open a window
953 "norestore" do not add the terminal window to a
954 session file
955 "term_kill" what to do when trying to close the
956 terminal window, see |term_setkill()|
957 "term_finish" What to do when the job is finished:
958 "close": close any windows
959 "open": open window if needed
960 Note that "open" can be interruptive.
961 See |term++close| and |term++open|.
962 "term_opencmd" command to use for opening the window when
963 "open" is used for "term_finish"; must
964 have "%d" where the buffer number goes,
965 e.g. "10split|buffer %d"; when not
966 specified "botright sbuf %d" is used
Bram Moolenaar83d47902020-03-26 20:34:00 +0100967 "term_highlight" highlight group to use instead of
968 "Terminal"
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200969 "eof_chars" Text to send after all buffer lines were
970 written to the terminal. When not set
971 CTRL-D is used on MS-Windows. For Python
972 use CTRL-Z or "exit()". For a shell use
973 "exit". A CR is always added.
974 "ansi_colors" A list of 16 color names or hex codes
975 defining the ANSI palette used in GUI
976 color modes. See |g:terminal_ansi_colors|.
977 "tty_type" (MS-Windows only): Specify which pty to
978 use. See 'termwintype' for the values.
Bram Moolenaard2842ea2019-09-26 23:08:54 +0200979 "term_api" function name prefix for the
980 |terminal-api| function. See
981 |term_setapi()|.
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200982
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200983 Can also be used as a |method|: >
984 GetCommand()->term_start()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200985<
986 Return type: |Number|
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200987
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200988
989term_wait({buf} [, {time}]) *term_wait()*
990 Wait for pending updates of {buf} to be handled.
991 {buf} is used as with |term_getsize()|.
992 {time} is how long to wait for updates to arrive in msec. If
993 not set then 10 msec will be used.
Bram Moolenaar7ee80f72019-09-08 20:55:06 +0200994
995 Can also be used as a |method|: >
996 GetBufnr()->term_wait()
Christian Brabandt5674c9a2024-06-09 00:13:43 +0200997<
998 Return type: |Number|
Bram Moolenaar6bf2c622019-07-04 17:12:09 +0200999
1000==============================================================================
10013. Terminal communication *terminal-communication*
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02001002
1003There are several ways to communicate with the job running in a terminal:
1004- Use |term_sendkeys()| to send text and escape sequences from Vim to the job.
1005- Use the JSON API to send encoded commands from the job to Vim.
1006- Use the |client-server| mechanism. This works on machines with an X server
1007 and on MS-Windows.
1008
1009
1010Vim to job: term_sendkeys() ~
1011 *terminal-to-job*
1012This allows for remote controlling the job running in the terminal. It is a
1013one-way mechanism. The job can update the display to signal back to Vim.
1014For example, if a shell is running in a terminal, you can do: >
1015 call term_sendkeys(buf, "ls *.java\<CR>")
1016
1017This requires for the job to be in the right state where it will do the right
1018thing when receiving the keys. For the above example, the shell must be
1019waiting for a command to be typed.
1020
1021For a job that was written for the purpose, you can use the JSON API escape
1022sequence in the other direction. E.g.: >
1023 call term_sendkeys(buf, "\<Esc>]51;["response"]\x07")
1024
1025
1026Job to Vim: JSON API ~
1027 *terminal-api*
1028The job can send JSON to Vim, using a special escape sequence. The JSON
1029encodes a command that Vim understands. Example of such a message: >
1030 <Esc>]51;["drop", "README.md"]<07>
1031
1032The body is always a list, making it easy to find the end: ]<07>.
1033The <Esc>]51;msg<07> sequence is reserved by xterm for "Emacs shell", which is
1034similar to what we are doing here.
1035
1036Currently supported commands:
1037
1038 call {funcname} {argument}
1039
Bram Moolenaar2a77d212018-03-26 21:38:52 +02001040 Call a user defined function with {argument}.
1041 The function is called with two arguments: the buffer number
Bram Moolenaar664f3cf2019-12-07 16:03:51 +01001042 of the terminal and {argument}, the decoded JSON argument.
Bram Moolenaard2842ea2019-09-26 23:08:54 +02001043 By default, the function name must start with "Tapi_" to avoid
Bram Moolenaar2a77d212018-03-26 21:38:52 +02001044 accidentally calling a function not meant to be used for the
Bram Moolenaard2842ea2019-09-26 23:08:54 +02001045 terminal API. This can be changed with |term_setapi()|.
Bram Moolenaar2a77d212018-03-26 21:38:52 +02001046 The user function should sanity check the argument.
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02001047 The function can use |term_sendkeys()| to send back a reply.
1048 Example in JSON: >
Bram Moolenaar2a77d212018-03-26 21:38:52 +02001049 ["call", "Tapi_Impression", ["play", 14]]
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02001050< Calls a function defined like this: >
Bram Moolenaar2a77d212018-03-26 21:38:52 +02001051 function Tapi_Impression(bufnum, arglist)
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02001052 if len(a:arglist) == 2
Bram Moolenaarc51cf032022-02-26 12:25:45 +00001053 echomsg "impression " .. a:arglist[0]
1054 echomsg "count " .. a:arglist[1]
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02001055 endif
1056 endfunc
Bram Moolenaar2a77d212018-03-26 21:38:52 +02001057< Output from `:echo` may be erased by a redraw, use `:echomsg`
1058 to be able to see it with `:messages`.
1059
Bram Moolenaar333b80a2018-04-04 22:57:29 +02001060 drop {filename} [options]
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02001061
1062 Let Vim open a file, like the `:drop` command. If {filename}
1063 is already open in a window, switch to that window. Otherwise
1064 open a new window to edit {filename}.
Bram Moolenaar85eee132018-05-06 17:57:30 +02001065 Note that both the job and Vim may change the current
1066 directory, thus it's best to use the full path.
Bram Moolenaar333b80a2018-04-04 22:57:29 +02001067
1068 [options] is only used when opening a new window. If present,
Bram Moolenaard1caa942020-04-10 22:10:56 +02001069 it must be a Dict. Similarly to |++opt|, these entries are
Bram Moolenaar68e65602019-05-26 21:33:31 +02001070 recognized:
Bram Moolenaar333b80a2018-04-04 22:57:29 +02001071 "ff" file format: "dos", "mac" or "unix"
1072 "fileformat" idem
1073 "enc" overrides 'fileencoding'
1074 "encoding" idem
1075 "bin" sets 'binary'
1076 "binary" idem
1077 "nobin" resets 'binary'
1078 "nobinary" idem
1079 "bad" specifies behavior for bad characters, see
1080 |++bad|
1081
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02001082 Example in JSON: >
1083 ["drop", "path/file.txt", {"ff": "dos"}]
1084
1085A trick to have Vim send this escape sequence: >
1086 exe "set t_ts=\<Esc>]51; t_fs=\x07"
Bram Moolenaar2a77d212018-03-26 21:38:52 +02001087 let &titlestring = '["call","Tapi_TryThis",["hello",123]]'
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02001088 redraw
1089 set t_ts& t_fs&
1090
1091Rationale: Why not allow for any command or expression? Because that might
1092create a security problem.
Bram Moolenaar48c3f4e2022-08-08 15:42:38 +01001093 *terminal-autoshelldir*
1094This can be used to pass the current directory from a shell to Vim.
1095Put this in your .vimrc: >
Bram Moolenaarfd999452022-08-24 18:30:14 +01001096 def g:Tapi_lcd(_, path: string)
1097 if isdirectory(path)
zeertzjqd086b8f2024-02-25 15:42:52 +08001098 execute 'silent lcd ' .. fnameescape(path)
1099 endif
Bram Moolenaar48c3f4e2022-08-08 15:42:38 +01001100 enddef
1101<
1102And, in a bash init file: >
zeertzjqd086b8f2024-02-25 15:42:52 +08001103 if [[ -n "$VIM_TERMINAL" ]]; then
1104 PROMPT_COMMAND='_vim_sync_PWD'
1105 function _vim_sync_PWD() {
1106 printf '\033]51;["call", "Tapi_lcd", "%q"]\007' "$PWD"
1107 }
1108 fi
Bram Moolenaar48c3f4e2022-08-08 15:42:38 +01001109<
1110Or, for zsh: >
1111 if [[ -n "$VIM_TERMINAL" ]]; then
1112 autoload -Uz add-zsh-hook
1113 add-zsh-hook -Uz chpwd _vim_sync_PWD
1114 function _vim_sync_PWD() {
1115 printf '\033]51;["call", "Tapi_lcd", "%q"]\007' "$PWD"
1116 }
1117 fi
1118<
1119Or, for fish: >
1120 if test -n "$VIM_TERMINAL"
1121 function _vim_sync_PWD --on-variable=PWD
1122 printf '\033]51;["call", "Tapi_lcd", "%s"]\007' "$PWD"
1123 end
1124 end
Bram Moolenaar8fbaeb12018-03-25 18:20:17 +02001125
1126
1127Using the client-server feature ~
1128 *terminal-client-server*
1129This only works when v:servername is not empty. If needed you can set it,
1130before opening the terminal, with: >
1131 call remote_startserver('vim-server')
1132
1133$VIM_SERVERNAME is set in the terminal to pass on the server name.
1134
1135In the job you can then do something like: >
1136 vim --servername $VIM_SERVERNAME --remote +123 some_file.c
1137This will open the file "some_file.c" and put the cursor on line 123.
1138
1139==============================================================================
Bram Moolenaar6bf2c622019-07-04 17:12:09 +020011404. Remote testing *terminal-testing*
Bram Moolenaare4f25e42017-07-07 11:54:15 +02001141
1142Most Vim tests execute a script inside Vim. For some tests this does not
1143work, running the test interferes with the code being tested. To avoid this
1144Vim is executed in a terminal window. The test sends keystrokes to it and
1145inspects the resulting screen state.
1146
1147Functions ~
1148
Bram Moolenaar6dc819b2018-07-03 16:42:19 +02001149|term_sendkeys()| send keystrokes to a terminal (not subject to tmap)
1150|term_wait()| wait for screen to be updated
1151|term_scrape()| inspect terminal screen
Bram Moolenaare4f25e42017-07-07 11:54:15 +02001152
1153
1154==============================================================================
Bram Moolenaar6bf2c622019-07-04 17:12:09 +020011555. Diffing screen dumps *terminal-diff*
Bram Moolenaarda650582018-02-20 15:51:40 +01001156
1157In some cases it can be bothersome to test that Vim displays the right
1158characters on the screen. E.g. with syntax highlighting. To make this
1159simpler it is possible to take a screen dump of a terminal and compare it to
1160an expected screen dump.
1161
1162Vim uses the window size, text, color and other attributes as displayed. The
1163Vim screen size, font and other properties do not matter. Therefore this
Bram Moolenaar98ef2332018-03-18 14:44:37 +01001164mechanism is portable across systems. A conventional screenshot would reflect
Bram Moolenaarda650582018-02-20 15:51:40 +01001165all differences, including font size and family.
1166
1167
1168Writing a screen dump test for Vim ~
1169 *terminal-dumptest*
1170For an example see the Test_syntax_c() function in
1171src/testdir/test_syntax.vim. The main parts are:
1172- Write a file you want to test with. This is useful for testing syntax
Bram Moolenaar560979e2020-02-04 22:53:05 +01001173 highlighting. You can also start Vim with an empty buffer.
Bram Moolenaarda650582018-02-20 15:51:40 +01001174- Run Vim in a terminal with a specific size. The default is 20 lines of 75
1175 characters. This makes sure the dump is always this size. The function
1176 RunVimInTerminal() takes care of this. Pass it the arguments for the Vim
1177 command.
Bram Moolenaar6dc819b2018-07-03 16:42:19 +02001178- Send any commands to Vim using |term_sendkeys()|. For example: >
Bram Moolenaarda650582018-02-20 15:51:40 +01001179 call term_sendkeys(buf, ":echo &lines &columns\<CR>")
1180- Check that the screen is now in the expected state, using
1181 VerifyScreenDump(). This expects the reference screen dump to be in the
1182 src/testdir/dumps/ directory. Pass the name without ".dump". It is
1183 recommended to use the name of the test function and a sequence number, so
1184 that we know what test is using the file.
1185- Repeat sending commands and checking the state.
1186- Finally stop Vim by calling StopVimInTerminal().
1187
1188The first time you do this you won't have a screen dump yet. Create an empty
1189file for now, e.g.: >
1190 touch src/testdir/dumps/Test_function_name_01.dump
1191
1192The test will then fail, giving you the command to compare the reference dump
1193and the failed dump, e.g.: >
Bram Moolenaar0c0734d2019-11-26 21:44:46 +01001194 call term_dumpdiff("failed/Test_func.dump", "dumps/Test_func.dump")
Bram Moolenaarda650582018-02-20 15:51:40 +01001195
1196Use this command in Vim, with the current directory set to src/testdir.
1197Once you are satisfied with the test, move the failed dump in place of the
1198reference: >
Bram Moolenaar0c0734d2019-11-26 21:44:46 +01001199 :!mv failed/Test_func.dump dumps/Test_func.dump
Bram Moolenaarda650582018-02-20 15:51:40 +01001200
1201
1202Creating a screen dump ~
1203 *terminal-screendump*
Bram Moolenaarda650582018-02-20 15:51:40 +01001204To create the screen dump, run Vim (or any other program) in a terminal and
Bram Moolenaar6dc819b2018-07-03 16:42:19 +02001205make it show the desired state. Then use the |term_dumpwrite()| function to
Bram Moolenaarda650582018-02-20 15:51:40 +01001206create a screen dump file. For example: >
1207 :call term_dumpwrite(77, "mysyntax.dump")
1208
1209Here "77" is the buffer number of the terminal. Use `:ls!` to see it.
1210
Bram Moolenaar6dc819b2018-07-03 16:42:19 +02001211You can view the screen dump with |term_dumpload()|: >
Bram Moolenaarda650582018-02-20 15:51:40 +01001212 :call term_dumpload("mysyntax.dump")
1213
1214To verify that Vim still shows exactly the same screen, run Vim again with
1215exactly the same way to show the desired state. Then create a screen dump
1216again, using a different file name: >
1217 :call term_dumpwrite(88, "test.dump")
1218
Bram Moolenaar6dc819b2018-07-03 16:42:19 +02001219To assert that the files are exactly the same use |assert_equalfile()|: >
Bram Moolenaarda650582018-02-20 15:51:40 +01001220 call assert_equalfile("mysyntax.dump", "test.dump")
1221
1222If there are differences then v:errors will contain the error message.
1223
1224
1225Comparing screen dumps ~
1226 *terminal-diffscreendump*
Bram Moolenaar6dc819b2018-07-03 16:42:19 +02001227|assert_equalfile()| does not make it easy to see what is different.
1228To spot the problem use |term_dumpdiff()|: >
Bram Moolenaarda650582018-02-20 15:51:40 +01001229 call term_dumpdiff("mysyntax.dump", "test.dump")
1230
1231This will open a window consisting of three parts:
12321. The contents of the first dump
12332. The difference between the first and second dump
12343. The contents of the second dump
1235
1236You can usually see what differs in the second part. Use the 'ruler' to
Bram Moolenaar93a1df22018-09-10 11:51:50 +02001237relate it to the position in the first or second dump. Letters indicate the
1238kind of difference:
1239 X different character
1240 > cursor in first but not in second
1241 < cursor in second but not in first
1242 w character width differs (single vs double width)
1243 f foreground color differs
1244 b background color differs
1245 a attribute differs (bold, underline, reverse, etc.)
1246 ? character missing in both
1247 + character missing in first
1248 - character missing in second
Bram Moolenaarda650582018-02-20 15:51:40 +01001249
Bram Moolenaar98ef2332018-03-18 14:44:37 +01001250Alternatively, press "s" to swap the first and second dump. Do this several
Bram Moolenaarda650582018-02-20 15:51:40 +01001251times so that you can spot the difference in the context of the text.
1252
1253==============================================================================
Bram Moolenaar6bf2c622019-07-04 17:12:09 +020012546. Debugging *terminal-debug* *terminal-debugger*
Bram Moolenaare4f25e42017-07-07 11:54:15 +02001255
1256The Terminal debugging plugin can be used to debug a program with gdb and view
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001257the source code in a Vim window. Since this is completely contained inside
1258Vim this also works remotely over an ssh connection.
1259
Bram Moolenaarb3307b52018-06-17 21:34:11 +02001260When the |+terminal| feature is missing, the plugin will use the "prompt"
1261buffer type, if possible. The running program will then use a newly opened
1262terminal window. See |termdebug-prompt| below for details.
1263
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001264
1265Starting ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +01001266 *termdebug-starting*
Bram Moolenaarc572da52017-08-27 16:52:01 +02001267Load the plugin with this command: >
1268 packadd termdebug
h-east52e7cc22024-07-28 17:03:29 +02001269When loading the plugin from the |.vimrc| file, add the "!" attribute: >
Christian Brabandt27c55982024-07-14 10:41:08 +02001270 packadd! termdebug
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001271< *:Termdebug*
Bram Moolenaard473c8c2018-08-11 18:00:22 +02001272To start debugging use `:Termdebug` or `:TermdebugCommand` followed by the
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001273command name, for example: >
Bram Moolenaar24a98a02017-09-27 22:23:55 +02001274 :Termdebug vim
Bram Moolenaare4f25e42017-07-07 11:54:15 +02001275
Bram Moolenaarc572da52017-08-27 16:52:01 +02001276This opens two windows:
Bram Moolenaarf0b03c42017-12-17 17:17:07 +01001277
Bram Moolenaar45d5f262017-09-10 19:14:31 +02001278gdb window A terminal window in which "gdb vim" is executed. Here you
1279 can directly interact with gdb. The buffer name is "!gdb".
Bram Moolenaarf0b03c42017-12-17 17:17:07 +01001280
Bram Moolenaar45d5f262017-09-10 19:14:31 +02001281program window A terminal window for the executed program. When "run" is
1282 used in gdb the program I/O will happen in this window, so
1283 that it does not interfere with controlling gdb. The buffer
Bram Moolenaar6f4754b2022-01-23 12:07:04 +00001284 name is "debugged program".
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001285
1286The current window is used to show the source code. When gdb pauses the
1287source file location will be displayed, if possible. A sign is used to
Bram Moolenaar664f3cf2019-12-07 16:03:51 +01001288highlight the current position, using highlight group debugPC.
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001289
1290If the buffer in the current window is modified, another window will be opened
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001291to display the current gdb position. You can use `:Winbar` to add a window
1292toolbar there.
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001293
1294Focus the terminal of the executed program to interact with it. This works
1295the same as any command running in a terminal window.
Bram Moolenaare4f25e42017-07-07 11:54:15 +02001296
Bram Moolenaar45d5f262017-09-10 19:14:31 +02001297When the debugger ends, typically by typing "quit" in the gdb window, the two
1298opened windows are closed.
Bram Moolenaarc572da52017-08-27 16:52:01 +02001299
Bram Moolenaarb3623a32018-04-14 18:59:50 +02001300Only one debugger can be active at a time.
Ubaldo Tiberif7f8f0b2024-06-20 22:17:34 +02001301
1302 *termdebug-timeout*
1303Depending on how gdb is launched, termdebug startup time may vary.
1304To avoid termdebug to get stuck if the startup process of gdb takes too long,
1305a configurable timeout is included. Such time out is configurable in terms of
1306multiple of 10ms: >
1307 let g:termdebug_config['timeout'] = 500 # 500 * 10ms = 5 seconds.
1308
1309The default timeout is 3000 ms.
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001310 *:TermdebugCommand*
1311If you want to give specific commands to the command being debugged, you can
1312use the `:TermdebugCommand` command followed by the command name and
1313additional parameters. >
1314 :TermdebugCommand vim --clean -c ':set nu'
Bram Moolenaarb3623a32018-04-14 18:59:50 +02001315
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001316Both the `:Termdebug` and `:TermdebugCommand` support an optional "!" bang
1317argument to start the command right away, without pausing at the gdb window
1318(and cursor will be in the debugged window). For example: >
1319 :TermdebugCommand! vim --clean
1320
1321To attach gdb to an already running executable or use a core file, pass extra
Bram Moolenaarb3623a32018-04-14 18:59:50 +02001322arguments. E.g.: >
1323 :Termdebug vim core
1324 :Termdebug vim 98343
1325
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001326If no argument is given, you'll end up in a gdb window, in which you need to
1327specify which command to run using e.g. the gdb `file` command.
1328
Bram Moolenaarc572da52017-08-27 16:52:01 +02001329
Bram Moolenaar24a98a02017-09-27 22:23:55 +02001330Example session ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +01001331 *termdebug-example*
Bram Moolenaar24a98a02017-09-27 22:23:55 +02001332Start in the Vim "src" directory and build Vim: >
1333 % make
Bram Moolenaar1ff14ba2019-11-02 14:09:23 +01001334Make sure that debug symbols are present, usually that means that $CFLAGS
1335includes "-g".
1336
Bram Moolenaar24a98a02017-09-27 22:23:55 +02001337Start Vim: >
1338 % ./vim
Bram Moolenaar1ff14ba2019-11-02 14:09:23 +01001339
Bram Moolenaar24a98a02017-09-27 22:23:55 +02001340Load the termdebug plugin and start debugging Vim: >
1341 :packadd termdebug
1342 :Termdebug vim
1343You should now have three windows:
1344 source - where you started, has a window toolbar with buttons
1345 gdb - you can type gdb commands here
1346 program - the executed program will use this window
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001347
Bram Moolenaar24a98a02017-09-27 22:23:55 +02001348You can use CTRL-W CTRL-W or the mouse to move focus between windows.
1349Put focus on the gdb window and type: >
1350 break ex_help
1351 run
1352Vim will start running in the program window. Put focus there and type: >
1353 :help gui
Bram Moolenaar664f3cf2019-12-07 16:03:51 +01001354Gdb will run into the ex_help breakpoint. The source window now shows the
Bram Moolenaarde1a8312018-06-19 16:59:54 +02001355ex_cmds.c file. A red "1 " marker will appear in the signcolumn where the
1356breakpoint was set. The line where the debugger stopped is highlighted. You
1357can now step through the program. Let's use the mouse: click on the "Next"
1358button in the window toolbar. You will see the highlighting move as the
1359debugger executes a line of source code.
Bram Moolenaar24a98a02017-09-27 22:23:55 +02001360
1361Click "Next" a few times until the for loop is highlighted. Put the cursor on
1362the end of "eap->arg", then click "Eval" in the toolbar. You will see this
1363displayed:
1364 "eap->arg": 0x555555e68855 "gui" ~
1365This way you can inspect the value of local variables. You can also focus the
1366gdb window and use a "print" command, e.g.: >
1367 print *eap
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001368If mouse pointer movements are working, Vim will also show a balloon when the
1369mouse rests on text that can be evaluated by gdb.
Bram Moolenaar24a98a02017-09-27 22:23:55 +02001370
1371Now go back to the source window and put the cursor on the first line after
1372the for loop, then type: >
1373 :Break
1374You will see a ">>" marker appear, this indicates the new breakpoint. Now
1375click "Cont" in the toolbar and the code until the breakpoint will be
1376executed.
1377
1378You can type more advanced commands in the gdb window. For example, type: >
1379 watch curbuf
1380Now click "Cont" in the toolbar (or type "cont" in the gdb window). Execution
1381will now continue until the value of "curbuf" changes, which is in do_ecmd().
1382To remove this watchpoint again type in the gdb window: >
1383 delete 3
1384
1385You can see the stack by typing in the gdb window: >
1386 where
1387Move through the stack frames, e.g. with: >
1388 frame 3
1389The source window will show the code, at the point where the call was made to
1390a deeper level.
1391
1392
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001393Stepping through code ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +01001394 *termdebug-stepping*
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001395Put focus on the gdb window to type commands there. Some common ones are:
Bram Moolenaar60e73f22017-11-12 18:02:06 +01001396- CTRL-C interrupt the program
1397- next execute the current line and stop at the next line
1398- step execute the current line and stop at the next statement,
1399 entering functions
Bram Moolenaar75ab5902022-04-18 15:36:40 +01001400- until execute until past the current cursor line or past a specified
1401 position or the current stack frame returns
Bram Moolenaar60e73f22017-11-12 18:02:06 +01001402- finish execute until leaving the current function
1403- where show the stack
1404- frame N go to the Nth stack frame
1405- continue continue execution
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001406
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001407 *:Run* *:Arguments*
1408In the window showing the source code these commands can be used to control
1409gdb:
Christian Brabandtc52a8562024-06-17 05:29:37 +02001410 `:Run` [args] run the program with [args] or the previous arguments
1411 `:Arguments` {args} set arguments for the next `:Run`
Bram Moolenaar60e73f22017-11-12 18:02:06 +01001412
Bram Moolenaar589edb32019-09-20 14:38:13 +02001413 *:Break* set a breakpoint at the cursor position
1414 :Break {position}
Bram Moolenaar2e693a82019-10-16 22:35:02 +02001415 set a breakpoint at the specified position
iam28th323dda12023-12-14 20:30:26 +01001416 *:Tbreak* set a temporary breakpoint at the cursor position
1417 :Tbreak {position}
1418 set a temporary breakpoint at the specified position
Bram Moolenaar589edb32019-09-20 14:38:13 +02001419 *:Clear* delete the breakpoint at the cursor position
Bram Moolenaar60e73f22017-11-12 18:02:06 +01001420
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001421 *:Step* execute the gdb "step" command
1422 *:Over* execute the gdb "next" command (`:Next` is a Vim command)
Bram Moolenaar75ab5902022-04-18 15:36:40 +01001423 *:Until* execute the gdb "until" command
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001424 *:Finish* execute the gdb "finish" command
1425 *:Continue* execute the gdb "continue" command
1426 *:Stop* interrupt the program
Bram Moolenaar45d5f262017-09-10 19:14:31 +02001427
Bram Moolenaarf0b03c42017-12-17 17:17:07 +01001428If 'mouse' is set the plugin adds a window toolbar with these entries:
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001429 Step `:Step`
1430 Next `:Over`
1431 Finish `:Finish`
1432 Cont `:Continue`
1433 Stop `:Stop`
1434 Eval `:Evaluate`
Bram Moolenaarf0b03c42017-12-17 17:17:07 +01001435This way you can use the mouse to perform the most common commands. You need
1436to have the 'mouse' option set to enable mouse clicks.
Bram Moolenaard13166e2022-11-18 21:49:57 +00001437See |termdebug_winbar| for configuring this toolbar.
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001438 *:Winbar*
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001439You can add the window toolbar in other windows you open with: >
1440 :Winbar
1441
Bram Moolenaarc4b533e2018-04-06 22:26:25 +02001442If gdb stops at a source line and there is no window currently showing the
1443source code, a new window will be created for the source code. This also
1444happens if the buffer in the source code window has been modified and can't be
1445abandoned.
1446
Bram Moolenaarde1a8312018-06-19 16:59:54 +02001447Gdb gives each breakpoint a number. In Vim the number shows up in the sign
1448column, with a red background. You can use these gdb commands:
1449- info break list breakpoints
1450- delete N delete breakpoint N
1451You can also use the `:Clear` command if the cursor is in the line with the
1452breakpoint, or use the "Clear breakpoint" right-click menu entry.
1453
Bram Moolenaar45d5f262017-09-10 19:14:31 +02001454
1455Inspecting variables ~
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001456 *termdebug-variables* *:Evaluate*
Christian Brabandtc52a8562024-06-17 05:29:37 +02001457 `:Evaluate` evaluate the expression under the cursor
1458 `K` same (see |termdebug_map_K| to disable)
1459 `:Evaluate` {expr} evaluate {expr}
1460 `:'<,'>Evaluate` evaluate the Visually selected text
Bram Moolenaar45d5f262017-09-10 19:14:31 +02001461
1462This is similar to using "print" in the gdb window.
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001463You can usually shorten `:Evaluate` to `:Ev`.
Bram Moolenaar45d5f262017-09-10 19:14:31 +02001464
1465
Sean Dewar3d3a9152023-08-23 17:14:49 +01001466Navigating stack frames ~
1467 *termdebug-frames* *:Frame* *:Up* *:Down*
Christian Brabandtc52a8562024-06-17 05:29:37 +02001468 `:Frame` [frame] select frame [frame], which is a frame number,
Sean Dewar3d3a9152023-08-23 17:14:49 +01001469 address, or function name (default: current frame)
Christian Brabandtc52a8562024-06-17 05:29:37 +02001470 `:Up` [count] go up [count] frames (default: 1; the frame that
Sean Dewar3d3a9152023-08-23 17:14:49 +01001471 called the current)
Christian Brabandtc52a8562024-06-17 05:29:37 +02001472 `+` same (see |termdebug_map_plus| to disable)
1473 `:Down` [count] go down [count] frames (default: 1; the frame called
Sean Dewar3d3a9152023-08-23 17:14:49 +01001474 by the current)
Christian Brabandtc52a8562024-06-17 05:29:37 +02001475 `-` same (see |termdebug_map_minus| to disable)
Simon Sobisch2ae7ffe2023-08-22 22:19:14 +02001476
1477
Bram Moolenaar45d5f262017-09-10 19:14:31 +02001478Other commands ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +01001479 *termdebug-commands*
Bram Moolenaar32c67ba2018-04-16 16:21:49 +02001480 *:Gdb* jump to the gdb window
1481 *:Program* jump to the window with the running program
1482 *:Source* jump to the window with the source code, create it if there
Bram Moolenaarc4b533e2018-04-06 22:26:25 +02001483 isn't one
Bram Moolenaar82be4842021-01-11 19:40:15 +01001484 *:Asm* jump to the window with the disassembly, create it if there
1485 isn't one
laburnumT9f296212023-05-13 16:29:15 +02001486 *:Var* jump to the window with the local and argument variables,
zeertzjqd086b8f2024-02-25 15:42:52 +08001487 create it if there isn't one. This window updates whenever the
1488 program is stopped
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001489
Bram Moolenaar6aa57292021-08-14 21:25:52 +02001490Events ~
1491 *termdebug-events*
1492Four autocommands can be used: >
1493 au User TermdebugStartPre echomsg 'debugging starting'
1494 au User TermdebugStartPost echomsg 'debugging started'
1495 au User TermdebugStopPre echomsg 'debugging stopping'
1496 au User TermdebugStopPost echomsg 'debugging stopped'
1497<
1498 *TermdebugStartPre*
1499TermdebugStartPre Before starting debugging.
1500 Not triggered if the debugger is already
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001501 running or the debugger command cannot be
Bram Moolenaar6aa57292021-08-14 21:25:52 +02001502 executed.
1503 *TermdebugStartPost*
1504TermdebugStartPost After debugging has initialized.
1505 If a "!" bang is passed to `:Termdebug` or
1506 `:TermdebugCommand` the event is triggered
1507 before running the provided command in gdb.
1508 *TermdebugStopPre*
1509TermdebugStopPre Before debugging ends, when gdb is terminated,
1510 most likely after issuing a "quit" command in
1511 the gdb window.
1512 *TermdebugStopPost*
1513TermdebugStopPost After debugging has ended, gdb-related windows
1514 are closed, debug buffers wiped out and
1515 the state before the debugging was restored.
1516
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001517
Bram Moolenaard13166e2022-11-18 21:49:57 +00001518Customizing ~
1519 *termdebug-customizing* *g:termdebug_config*
1520In the past several global variables were used for configuration. These are
1521deprecated and using the g:termdebug_config dictionary is preferred. When
1522g:termdebug_config exists the other global variables will NOT be used.
1523The recommended way is to start with an empty dictionary: >
1524 let g:termdebug_config = {}
1525
1526Then you can add entries to the dictionary as mentioned below. The
1527deprecated global variable names are mentioned for completeness. If you are
1528switching over to using g:termdebug_config you can find the old variable name
1529and take over the value, then delete the deprecated variable.
1530
1531
Bram Moolenaarb3307b52018-06-17 21:34:11 +02001532Prompt mode ~
1533 *termdebug-prompt*
1534When the |+terminal| feature is not supported and on MS-Windows, gdb will run
1535in a buffer with 'buftype' set to "prompt". This works slightly differently:
1536- The gdb window will be in Insert mode while typing commands. Go to Normal
1537 mode with <Esc>, then you can move around in the buffer, copy/paste, etc.
1538 Go back to editing the gdb command with any command that starts Insert mode,
1539 such as `a` or `i`.
1540- The program being debugged will run in a separate window. On MS-Windows
1541 this is a new console window. On Unix, if the |+terminal| feature is
1542 available a Terminal window will be opened to run the debugged program in.
1543
1544 *termdebug_use_prompt*
1545Prompt mode can be used even when the |+terminal| feature is present with: >
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +02001546 let g:termdebug_config['use_prompt'] = v:true
Bram Moolenaard13166e2022-11-18 21:49:57 +00001547If there is no g:termdebug_config you can use: >
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +02001548 let g:termdebug_use_prompt = v:true
Ubaldo Tiberie54fd3f2024-07-04 17:14:03 +02001549
Bram Moolenaar388a5d42020-05-26 21:20:45 +02001550<
Ubaldo Tiberie54fd3f2024-07-04 17:14:03 +02001551However, the latter form will be deprecated in future releases.
1552
Peter Wolf8f1d0982024-10-27 21:51:14 +01001553
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +01001554Mappings ~
Ubaldo Tiberia48637c2024-06-18 20:18:20 +02001555The termdebug plugin enables a few default mappings. All those mappings
1556are reset to their original values once the termdebug session concludes.
1557
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +01001558 *termdebug_map_K* *termdebug-mappings*
zeertzjq20a94f42023-11-09 15:21:58 +08001559The K key is normally mapped to |:Evaluate| unless a buffer local (|:map-local|)
1560mapping to K already exists. If you do not want this use: >
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +02001561 let g:termdebug_config['map_K'] = v:false
Bram Moolenaard13166e2022-11-18 21:49:57 +00001562If there is no g:termdebug_config you can use: >
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +02001563 let g:termdebug_map_K = v:false
Bram Moolenaar82be4842021-01-11 19:40:15 +01001564<
Ubaldo Tiberie54fd3f2024-07-04 17:14:03 +02001565However, the latter form will be deprecated in future releases.
1566
Simon Sobisch2ae7ffe2023-08-22 22:19:14 +02001567 *termdebug_map_minus*
zeertzjq20a94f42023-11-09 15:21:58 +08001568The - key is normally mapped to |:Down| unless a buffer local mapping to the -
1569key already exists. If you do not want this use: >
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +02001570 let g:termdebug_config['map_minus'] = v:false
Simon Sobisch2ae7ffe2023-08-22 22:19:14 +02001571<
1572 *termdebug_map_plus*
zeertzjq20a94f42023-11-09 15:21:58 +08001573The + key is normally mapped to |:Up| unless a buffer local mapping to the +
1574key already exists. If you do not want this use: >
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +02001575 let g:termdebug_config['map_plus'] = v:false
Simon Sobisch2ae7ffe2023-08-22 22:19:14 +02001576<
Bram Moolenaar82be4842021-01-11 19:40:15 +01001577 *termdebug_disasm_window*
Bram Moolenaar10e8ff92023-06-10 21:40:39 +01001578If you want the Asm window shown by default, set the "disasm_window" flag to
15791. The "disasm_window_height" entry can be used to set the window height: >
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +02001580 let g:termdebug_config['disasm_window'] = v:true
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001581 let g:termdebug_config['disasm_window_height'] = 15
Bram Moolenaard13166e2022-11-18 21:49:57 +00001582If there is no g:termdebug_config you can use: >
Bram Moolenaar82be4842021-01-11 19:40:15 +01001583 let g:termdebug_disasm_window = 15
Ubaldo Tiberie54fd3f2024-07-04 17:14:03 +02001584
1585However, the latter form will be deprecated in future releases.
1586
zeertzjq20a94f42023-11-09 15:21:58 +08001587Any value greater than 1 will set the Asm window height to that value.
shane.xb.qianca482022023-11-08 21:59:15 +01001588If the current window has enough horizontal space, it will be vertically split
1589and the Asm window will be shown side by side with the source code window (and
1590the height option won't be used).
Bram Moolenaarb3307b52018-06-17 21:34:11 +02001591
laburnumT9f296212023-05-13 16:29:15 +02001592 *termdebug_variables_window*
h_east59858792023-10-25 22:47:05 +09001593If you want the Var window shown by default, set the "variables_window" flag
1594to 1. The "variables_window_height" entry can be used to set the window
1595height: >
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +02001596 let g:termdebug_config['variables_window'] = v:true
laburnumT9f296212023-05-13 16:29:15 +02001597 let g:termdebug_config['variables_window_height'] = 15
1598If there is no g:termdebug_config you can use: >
1599 let g:termdebug_variables_window = 15
Ubaldo Tiberie54fd3f2024-07-04 17:14:03 +02001600
1601However, the latter form will be deprecated in future releases.
1602
laburnumT9f296212023-05-13 16:29:15 +02001603Any value greater than 1 will set the Var window height to that value.
shane.xb.qianca482022023-11-08 21:59:15 +01001604If the current window has enough horizontal space, it will be vertically split
1605and the Var window will be shown side by side with the source code window (and
1606the height options won't be used).
laburnumT9f296212023-05-13 16:29:15 +02001607
Peter Wolf8f1d0982024-10-27 21:51:14 +01001608
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001609Communication ~
Bram Moolenaar7f2e9d72017-11-11 20:58:53 +01001610 *termdebug-communication*
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001611There is another, hidden, buffer, which is used for Vim to communicate with
1612gdb. The buffer name is "gdb communication". Do not delete this buffer, it
1613will break the debugger.
1614
Bram Moolenaarde1a8312018-06-19 16:59:54 +02001615Gdb has some weird behavior, the plugin does its best to work around that.
1616For example, after typing "continue" in the gdb window a CTRL-C can be used to
1617interrupt the running program. But after using the MI command
1618"-exec-continue" pressing CTRL-C does not interrupt. Therefore you will see
1619"continue" being used for the `:Continue` command, instead of using the
1620communication channel.
1621
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001622
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001623GDB command ~
Bram Moolenaar6aa57292021-08-14 21:25:52 +02001624 *g:termdebugger*
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001625To change the name of the gdb command, set "debugger" entry in
1626g:termdebug_config or the "g:termdebugger" variable before invoking
1627`:Termdebug`: >
1628 let g:termdebug_config['command'] = "mygdb"
Bram Moolenaard13166e2022-11-18 21:49:57 +00001629If there is no g:termdebug_config you can use: >
Bram Moolenaar6aa57292021-08-14 21:25:52 +02001630 let g:termdebugger = "mygdb"
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001631
Ubaldo Tiberie54fd3f2024-07-04 17:14:03 +02001632However, the latter form will be deprecated in future releases.
1633
Bram Moolenaarfa3b7232021-12-24 13:18:38 +00001634If the command needs an argument use a List: >
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001635 let g:termdebug_config['command'] = ['rr', 'replay', '--']
Bram Moolenaard13166e2022-11-18 21:49:57 +00001636If there is no g:termdebug_config you can use: >
Bram Moolenaarfa3b7232021-12-24 13:18:38 +00001637 let g:termdebugger = ['rr', 'replay', '--']
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001638
1639Several arguments will be added to make gdb work well for the debugger.
1640If you want to modify them, add a function to filter the argument list: >
1641 let g:termdebug_config['command_filter'] = MyDebugFilter
1642
1643If you do not want the arguments to be added, but you do need to set the
1644"pty", use a function to add the necessary arguments: >
1645 let g:termdebug_config['command_add_args'] = MyAddArguments
1646The function will be called with the list of arguments so far, and a second
1647argument that is the name of the pty.
1648 *gdb-version*
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001649Only debuggers fully compatible with gdb will work. Vim uses the GDB/MI
Dominique Pellé960822a2023-09-24 23:07:39 +02001650interface. The "new-ui" command requires gdb version 7.12 or later. If you
Bram Moolenaar98ef2332018-03-18 14:44:37 +01001651get this error:
Bram Moolenaar01164a62017-11-02 22:58:42 +01001652 Undefined command: "new-ui". Try "help".~
1653Then your gdb is too old.
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001654
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001655
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01001656Colors ~
Bram Moolenaard13166e2022-11-18 21:49:57 +00001657 *hl-debugPC* *hl-debugBreakpoint*
Bram Moolenaare09ba7b2017-09-09 22:19:47 +02001658The color of the signs can be adjusted with these highlight groups:
1659- debugPC the current position
1660- debugBreakpoint a breakpoint
1661
1662The defaults are, when 'background' is "light":
1663 hi debugPC term=reverse ctermbg=lightblue guibg=lightblue
1664 hi debugBreakpoint term=reverse ctermbg=red guibg=red
1665
1666When 'background' is "dark":
1667 hi debugPC term=reverse ctermbg=darkblue guibg=darkblue
1668 hi debugBreakpoint term=reverse ctermbg=red guibg=red
Bram Moolenaarc572da52017-08-27 16:52:01 +02001669
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001670
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01001671Shortcuts ~
1672 *termdebug_shortcuts*
Bram Moolenaarb3307b52018-06-17 21:34:11 +02001673You can define your own shortcuts (mappings) to control gdb, that can work in
1674any window, using the TermDebugSendCommand() function. Example: >
1675 map ,w :call TermDebugSendCommand('where')<CR>
1676The argument is the gdb command.
1677
1678
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01001679Popup menu ~
1680 *termdebug_popup*
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001681By default the Termdebug plugin sets 'mousemodel' to "popup_setpos" and adds
1682these entries to the popup menu:
1683 Set breakpoint `:Break`
1684 Clear breakpoint `:Clear`
1685 Evaluate `:Evaluate`
1686If you don't want this then disable it with: >
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001687 let g:termdebug_config['popup'] = 0
Bram Moolenaard13166e2022-11-18 21:49:57 +00001688If there is no g:termdebug_config you can use: >
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001689 let g:termdebug_popup = 0
1690
Ubaldo Tiberie54fd3f2024-07-04 17:14:03 +02001691However, the latter form will be deprecated in future releases.
Bram Moolenaar71137fe2018-03-03 20:47:21 +01001692
Peter Wolf8f1d0982024-10-27 21:51:14 +01001693
skywind3000e7d9ca22023-06-28 23:27:28 +01001694Change default signs ~
1695 *termdebug_signs*
Shane-XB-Qian2dd613f2023-11-12 23:53:39 +08001696Termdebug uses the hex number of the breakpoint ID in the signcolumn to
Peter Wolf8f1d0982024-10-27 21:51:14 +01001697represent breakpoints. If it is greater than "0xFF", then it will be displayed
Shane-XB-Qian2dd613f2023-11-12 23:53:39 +08001698as "F+", due to we really only have two screen cells for the sign.
Ella Moss5e7f43b2024-11-09 11:32:15 +01001699You may also use decimal breakpoint signs instead, in which case IDs greater
1700than 99 will be displayed as "9+".
skywind3000e7d9ca22023-06-28 23:27:28 +01001701
Ella Moss5e7f43b2024-11-09 11:32:15 +01001702If you want to customize the breakpoint signs to show `>>` in the signcolumn: >
skywind3000e7d9ca22023-06-28 23:27:28 +01001703 let g:termdebug_config['sign'] = '>>'
Ella Moss5e7f43b2024-11-09 11:32:15 +01001704If you would like to use decimal (base 10) breakpoint signs: >
1705 let g:termdebug_config['sign_decimal'] = 1
zeertzjq060107c2024-11-10 14:08:56 +01001706If the variable g:termdebug_config does not yet exist, you can use: >
skywind3000e7d9ca22023-06-28 23:27:28 +01001707 let g:termdebug_config = {'sign': '>>'}
Ella Moss5e7f43b2024-11-09 11:32:15 +01001708Likewise, to enable decimal signs: >
1709 let g:termdebug_config = {'sign_decimal': 1}
skywind3000e7d9ca22023-06-28 23:27:28 +01001710
1711
Bram Moolenaard13166e2022-11-18 21:49:57 +00001712Window toolbar ~
1713 *termdebug_winbar*
1714By default the Termdebug plugin creates a window toolbar if the mouse is
1715enabled (see |:Winbar|). If you don't want this then disable it with: >
1716 let g:termdebug_config['winbar'] = 0
1717
1718
Bram Moolenaar8a3b8052022-06-26 12:21:15 +01001719Vim window width ~
1720 *termdebug_wide*
Bram Moolenaar4466ad62020-11-21 13:16:30 +01001721To change the width of the Vim window when debugging starts and use a vertical
1722split: >
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001723 let g:termdebug_config['wide'] = 163
Bram Moolenaard13166e2022-11-18 21:49:57 +00001724If there is no g:termdebug_config you can use: >
Bram Moolenaar4466ad62020-11-21 13:16:30 +01001725 let g:termdebug_wide = 163
Bram Moolenaar38baa3e2017-09-14 16:10:38 +02001726
Ubaldo Tiberie54fd3f2024-07-04 17:14:03 +02001727However, the latter form will be deprecated in future releases.
1728
Bram Moolenaar4466ad62020-11-21 13:16:30 +01001729This will set 'columns' to 163 when `:Termdebug` is used. The value is
1730restored when quitting the debugger.
1731
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001732If the wide value is set and 'columns' is already a greater value, then a
Bram Moolenaar4466ad62020-11-21 13:16:30 +01001733vertical split will be used without modifying 'columns'.
1734
Bram Moolenaarc9a431c2022-05-23 21:49:41 +01001735Set the wide value to 1 to use a vertical split without ever changing
Bram Moolenaar4466ad62020-11-21 13:16:30 +01001736'columns'. This is useful when the terminal can't be resized by Vim.
Bram Moolenaare4f25e42017-07-07 11:54:15 +02001737
Bram Moolenaare4f25e42017-07-07 11:54:15 +02001738
Peter Wolf8f1d0982024-10-27 21:51:14 +01001739Evaluate in Popup Window at Cursor ~
1740 *termdebug_evaluate_in_popup*
1741By default |:Evaluate| will simply echo its output. For larger entities this
1742might become difficult to read or even truncated.
1743Alternatively, the evaluation result may be output into a popup window at the
1744current cursor position: >
1745 let g:termdebug_config['evaluate_in_popup'] = v:true
1746This can also be used in a "one-shot" manner: >
1747 func OnCursorHold()
1748 let g:termdebug_config['evaluate_in_popup'] = v:true
1749 :Evaluate
1750 let g:termdebug_config['evaluate_in_popup'] = v:false
1751 endfunc
1752<
Ubaldo Tiberiae1c8b72024-11-19 22:32:30 +01001753
1754Contributing ~
1755 *termdebug_contributing*
1756Contributions for termdebug improvements are welcome.
1757However, it is fairly common that during the development process you need some
1758mechanisms like `echo` statements (or similar) to help you in your job.
1759For this reason, you can set: >
1760 let g:termdebug_config['debug'] = true
1761<
h-eastb534e802024-12-03 20:37:52 +01001762This sets the `DEBUG` variable to `true`, which can be referenced in the
1763source code. An example of its usage follows: >
Ubaldo Tiberiae1c8b72024-11-19 22:32:30 +01001764 if exists('g:termdebug_loaded')
1765 if DEBUG
1766 Echoerr('Termdebug already loaded.')
1767 endif
1768 finish
1769 endif
1770<
1771
Bram Moolenaar91f84f62018-07-29 15:07:52 +02001772 vim:tw=78:ts=8:noet:ft=help:norl: