blob: fe5ed89dc286c7fdc31edffac31c7fd1e0770b44 [file] [log] [blame]
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +02001" Test for the termdebug plugin
2
Yegappan Lakshmanan85c3a5b2023-08-27 21:59:54 +02003source shared.vim
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +02004source check.vim
5
6CheckUnix
7CheckFeature terminal
8CheckExecutable gdb
9CheckExecutable gcc
10
11let g:GDB = exepath('gdb')
12if g:GDB->empty()
Christian Brabandtf2534432023-08-27 19:59:28 +020013 throw 'Skipped: gdb is not found in $PATH'
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020014endif
15
16let g:GCC = exepath('gcc')
17if g:GCC->empty()
Christian Brabandtf2534432023-08-27 19:59:28 +020018 throw 'Skipped: gcc is not found in $PATH'
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020019endif
20
iam28th323dda12023-12-14 20:30:26 +010021function s:generate_files(bin_name)
22 let src_name = a:bin_name .. '.c'
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020023 let lines =<< trim END
24 #include <stdio.h>
25 #include <stdlib.h>
26
27 int isprime(int n)
28 {
29 if (n <= 1)
30 return 0;
31
32 for (int i = 2; i <= n / 2; i++)
33 if (n % i == 0)
34 return 0;
35
36 return 1;
37 }
38
39 int main(int argc, char *argv[])
40 {
41 int n = 7;
42
43 printf("%d is %s prime\n", n, isprime(n) ? "a" : "not a");
44
45 return 0;
46 }
47 END
iam28th323dda12023-12-14 20:30:26 +010048 call writefile(lines, src_name)
49 call system($'{g:GCC} -g -o {a:bin_name} {src_name}')
50endfunction
51
52function s:cleanup_files(bin_name)
53 call delete(a:bin_name)
54 call delete(a:bin_name .. '.c')
55endfunction
56
57packadd termdebug
58
59func Test_termdebug_basic()
60 let bin_name = 'XTD_basic'
61 let src_name = bin_name .. '.c'
62 call s:generate_files(bin_name)
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020063
64 edit XTD_basic.c
65 Termdebug ./XTD_basic
Yegappan Lakshmanan85c3a5b2023-08-27 21:59:54 +020066 call WaitForAssert({-> assert_equal(3, winnr('$'))})
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020067 let gdb_buf = winbufnr(1)
68 wincmd b
69 Break 9
70 call term_wait(gdb_buf)
71 redraw!
72 call assert_equal([
73 \ {'lnum': 9, 'id': 1014, 'name': 'debugBreakpoint1.0',
74 \ 'priority': 110, 'group': 'TermDebug'}],
75 \ sign_getplaced('', #{group: 'TermDebug'})[0].signs)
76 Run
Christian Brabandt6c93c942023-08-27 21:48:29 +020077 call term_wait(gdb_buf, 400)
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020078 redraw!
Yegappan Lakshmanan85c3a5b2023-08-27 21:59:54 +020079 call WaitForAssert({-> assert_equal([
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020080 \ {'lnum': 9, 'id': 12, 'name': 'debugPC', 'priority': 110,
81 \ 'group': 'TermDebug'},
82 \ {'lnum': 9, 'id': 1014, 'name': 'debugBreakpoint1.0',
83 \ 'priority': 110, 'group': 'TermDebug'}],
Yegappan Lakshmanan85c3a5b2023-08-27 21:59:54 +020084 \ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020085 Finish
86 call term_wait(gdb_buf)
87 redraw!
Yegappan Lakshmanan85c3a5b2023-08-27 21:59:54 +020088 call WaitForAssert({-> assert_equal([
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020089 \ {'lnum': 9, 'id': 1014, 'name': 'debugBreakpoint1.0',
90 \ 'priority': 110, 'group': 'TermDebug'},
91 \ {'lnum': 20, 'id': 12, 'name': 'debugPC',
92 \ 'priority': 110, 'group': 'TermDebug'}],
Yegappan Lakshmanan85c3a5b2023-08-27 21:59:54 +020093 \ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +020094 Continue
Shane-XB-Qian2dd613f2023-11-12 23:53:39 +080095 call term_wait(gdb_buf)
96
97 let i = 2
98 while i <= 258
99 Break
100 call term_wait(gdb_buf)
101 if i == 2
102 call WaitForAssert({-> assert_equal(sign_getdefined('debugBreakpoint2.0')[0].text, '02')})
103 endif
104 if i == 10
105 call WaitForAssert({-> assert_equal(sign_getdefined('debugBreakpoint10.0')[0].text, '0A')})
106 endif
107 if i == 168
108 call WaitForAssert({-> assert_equal(sign_getdefined('debugBreakpoint168.0')[0].text, 'A8')})
109 endif
110 if i == 255
111 call WaitForAssert({-> assert_equal(sign_getdefined('debugBreakpoint255.0')[0].text, 'FF')})
112 endif
113 if i == 256
114 call WaitForAssert({-> assert_equal(sign_getdefined('debugBreakpoint256.0')[0].text, 'F+')})
115 endif
116 if i == 258
117 call WaitForAssert({-> assert_equal(sign_getdefined('debugBreakpoint258.0')[0].text, 'F+')})
118 endif
119 let i += 1
120 endwhile
shane.xb.qianca482022023-11-08 21:59:15 +0100121
122 let cn = 0
123 " 60 is approx spaceBuffer * 3
124 if winwidth(0) <= 78 + 60
125 Var
zeertzjqaef61792024-07-18 20:35:42 +0200126 call assert_equal(winnr('$'), winnr())
127 call assert_equal(['col', [['leaf', 1002], ['leaf', 1001], ['leaf', 1000], ['leaf', 1003 + cn]]], winlayout())
shane.xb.qianca482022023-11-08 21:59:15 +0100128 let cn += 1
129 bw!
130 Asm
zeertzjqaef61792024-07-18 20:35:42 +0200131 call assert_equal(winnr('$'), winnr())
132 call assert_equal(['col', [['leaf', 1002], ['leaf', 1001], ['leaf', 1000], ['leaf', 1003 + cn]]], winlayout())
shane.xb.qianca482022023-11-08 21:59:15 +0100133 let cn += 1
134 bw!
135 endif
136 set columns=160
shane.xb.qianfdbadea2023-11-12 09:42:12 +0100137 call term_wait(gdb_buf)
Christian Brabandt305127f2023-11-11 18:59:33 +0100138 let winw = winwidth(0)
shane.xb.qianca482022023-11-08 21:59:15 +0100139 Var
Christian Brabandt305127f2023-11-11 18:59:33 +0100140 if winwidth(0) < winw
zeertzjqaef61792024-07-18 20:35:42 +0200141 call assert_equal(winnr('$') - 1, winnr())
142 call assert_equal(['col', [['leaf', 1002], ['leaf', 1001], ['row', [['leaf', 1003 + cn], ['leaf', 1000]]]]], winlayout())
Christian Brabandt305127f2023-11-11 18:59:33 +0100143 let cn += 1
144 bw!
145 endif
146 let winw = winwidth(0)
shane.xb.qianca482022023-11-08 21:59:15 +0100147 Asm
Christian Brabandt305127f2023-11-11 18:59:33 +0100148 if winwidth(0) < winw
zeertzjqaef61792024-07-18 20:35:42 +0200149 call assert_equal(winnr('$') - 1, winnr())
150 call assert_equal(['col', [['leaf', 1002], ['leaf', 1001], ['row', [['leaf', 1003 + cn], ['leaf', 1000]]]]], winlayout())
Christian Brabandt305127f2023-11-11 18:59:33 +0100151 let cn += 1
152 bw!
153 endif
shane.xb.qianca482022023-11-08 21:59:15 +0100154 set columns&
shane.xb.qianfdbadea2023-11-12 09:42:12 +0100155 call term_wait(gdb_buf)
shane.xb.qianca482022023-11-08 21:59:15 +0100156
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +0200157 wincmd t
158 quit!
159 redraw!
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100160 call WaitForAssert({-> assert_equal(1, winnr('$'))})
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +0200161 call assert_equal([], sign_getplaced('', #{group: 'TermDebug'})[0].signs)
162
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +0200163 for use_prompt in [v:true, v:false]
zeertzjqaef61792024-07-18 20:35:42 +0200164 let g:termdebug_config = {}
165 let g:termdebug_config['use_prompt'] = use_prompt
166 TermdebugCommand ./XTD_basic arg args
167 call WaitForAssert({-> assert_equal(3, winnr('$'))})
168 wincmd t
169 quit!
170 redraw!
171 call WaitForAssert({-> assert_equal(1, winnr('$'))})
172 unlet g:termdebug_config
173 endfor
174
iam28th323dda12023-12-14 20:30:26 +0100175 call s:cleanup_files(bin_name)
176 %bw!
177endfunc
178
179func Test_termdebug_tbreak()
180 let g:test_is_flaky = 1
181 let bin_name = 'XTD_tbreak'
182 let src_name = bin_name .. '.c'
183
184 eval s:generate_files(bin_name)
185
186 execute 'edit ' .. src_name
187 execute 'Termdebug ./' .. bin_name
188
189 call WaitForAssert({-> assert_equal(3, winnr('$'))})
190 let gdb_buf = winbufnr(1)
191 wincmd b
192
193 let bp_line = 22 " 'return' statement in main
194 let temp_bp_line = 10 " 'if' statement in 'for' loop body
195 execute "Tbreak " .. temp_bp_line
196 execute "Break " .. bp_line
197
198 call term_wait(gdb_buf)
199 redraw!
200 " both temporary and normal breakpoint signs were displayed...
201 call assert_equal([
202 \ {'lnum': temp_bp_line, 'id': 1014, 'name': 'debugBreakpoint1.0',
203 \ 'priority': 110, 'group': 'TermDebug'},
204 \ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0',
205 \ 'priority': 110, 'group': 'TermDebug'}],
206 \ sign_getplaced('', #{group: 'TermDebug'})[0].signs)
207
208 Run
209 call term_wait(gdb_buf, 400)
210 redraw!
211 " debugPC sign is on the line where the temp. bp was set;
212 " temp. bp sign was removed after hit;
213 " normal bp sign is still present
214 call WaitForAssert({-> assert_equal([
215 \ {'lnum': temp_bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110,
216 \ 'group': 'TermDebug'},
217 \ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0',
218 \ 'priority': 110, 'group': 'TermDebug'}],
219 \ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
220
221 Continue
222 call term_wait(gdb_buf)
223 redraw!
224 " debugPC is on the normal breakpoint,
225 " temp. bp on line 10 was only hit once
226 call WaitForAssert({-> assert_equal([
227 \ {'lnum': bp_line, 'id': 12, 'name': 'debugPC', 'priority': 110,
228 \ 'group': 'TermDebug'},
229 \ {'lnum': bp_line, 'id': 2014, 'name': 'debugBreakpoint2.0',
230 \ 'priority': 110, 'group': 'TermDebug'}],
231 \ sign_getplaced('', #{group: 'TermDebug'})[0].signs)})
232
233 wincmd t
234 quit!
235 redraw!
236 call WaitForAssert({-> assert_equal(1, winnr('$'))})
237 call assert_equal([], sign_getplaced('', #{group: 'TermDebug'})[0].signs)
238
239 eval s:cleanup_files(bin_name)
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +0200240 %bw!
241endfunc
242
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100243func Test_termdebug_mapping()
244 %bw!
Ken Takataffed1542024-05-21 17:14:56 +0200245 call assert_true(maparg('K', 'n', 0, 1)->empty())
246 call assert_true(maparg('-', 'n', 0, 1)->empty())
247 call assert_true(maparg('+', 'n', 0, 1)->empty())
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100248 Termdebug
249 call WaitForAssert({-> assert_equal(3, winnr('$'))})
250 wincmd b
Ken Takataffed1542024-05-21 17:14:56 +0200251 call assert_false(maparg('K', 'n', 0, 1)->empty())
252 call assert_false(maparg('-', 'n', 0, 1)->empty())
253 call assert_false(maparg('+', 'n', 0, 1)->empty())
254 call assert_false(maparg('K', 'n', 0, 1).buffer)
255 call assert_false(maparg('-', 'n', 0, 1).buffer)
256 call assert_false(maparg('+', 'n', 0, 1).buffer)
257 call assert_equal(':Evaluate<CR>', maparg('K', 'n', 0, 1).rhs)
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100258 wincmd t
259 quit!
260 redraw!
261 call WaitForAssert({-> assert_equal(1, winnr('$'))})
Ken Takataffed1542024-05-21 17:14:56 +0200262 call assert_true(maparg('K', 'n', 0, 1)->empty())
263 call assert_true(maparg('-', 'n', 0, 1)->empty())
264 call assert_true(maparg('+', 'n', 0, 1)->empty())
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100265
266 %bw!
267 nnoremap K :echom "K"<cr>
268 nnoremap - :echom "-"<cr>
269 nnoremap + :echom "+"<cr>
270 Termdebug
271 call WaitForAssert({-> assert_equal(3, winnr('$'))})
272 wincmd b
Ken Takataffed1542024-05-21 17:14:56 +0200273 call assert_false(maparg('K', 'n', 0, 1)->empty())
274 call assert_false(maparg('-', 'n', 0, 1)->empty())
275 call assert_false(maparg('+', 'n', 0, 1)->empty())
276 call assert_false(maparg('K', 'n', 0, 1).buffer)
277 call assert_false(maparg('-', 'n', 0, 1).buffer)
278 call assert_false(maparg('+', 'n', 0, 1).buffer)
279 call assert_equal(':Evaluate<CR>', maparg('K', 'n', 0, 1).rhs)
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100280 wincmd t
281 quit!
282 redraw!
283 call WaitForAssert({-> assert_equal(1, winnr('$'))})
Ken Takataffed1542024-05-21 17:14:56 +0200284 call assert_false(maparg('K', 'n', 0, 1)->empty())
285 call assert_false(maparg('-', 'n', 0, 1)->empty())
286 call assert_false(maparg('+', 'n', 0, 1)->empty())
287 call assert_false(maparg('K', 'n', 0, 1).buffer)
288 call assert_false(maparg('-', 'n', 0, 1).buffer)
289 call assert_false(maparg('+', 'n', 0, 1).buffer)
290 call assert_equal(':echom "K"<cr>', maparg('K', 'n', 0, 1).rhs)
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100291
292 %bw!
Ubaldo Tiberi46f28232024-06-19 19:50:32 +0200293
294 " -- Test that local-buffer mappings are restored in the correct buffers --
295 " local mappings for foo
296 file foo
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100297 nnoremap <buffer> K :echom "bK"<cr>
298 nnoremap <buffer> - :echom "b-"<cr>
299 nnoremap <buffer> + :echom "b+"<cr>
Ubaldo Tiberi46f28232024-06-19 19:50:32 +0200300
301 " no mappings for 'bar'
302 enew
303 file bar
304
305 " Start termdebug from foo
306 buffer foo
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100307 Termdebug
308 call WaitForAssert({-> assert_equal(3, winnr('$'))})
309 wincmd b
Ken Takataffed1542024-05-21 17:14:56 +0200310 call assert_true(maparg('K', 'n', 0, 1).buffer)
311 call assert_true(maparg('-', 'n', 0, 1).buffer)
312 call assert_true(maparg('+', 'n', 0, 1).buffer)
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100313 call assert_equal(maparg('K', 'n', 0, 1).rhs, ':echom "bK"<cr>')
Ubaldo Tiberi46f28232024-06-19 19:50:32 +0200314
315 Source
316 buffer bar
317 call assert_false(maparg('K', 'n', 0, 1)->empty())
318 call assert_false(maparg('-', 'n', 0, 1)->empty())
319 call assert_false(maparg('+', 'n', 0, 1)->empty())
320 call assert_true(maparg('K', 'n', 0, 1).buffer->empty())
321 call assert_true(maparg('-', 'n', 0, 1).buffer->empty())
322 call assert_true(maparg('+', 'n', 0, 1).buffer->empty())
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100323 wincmd t
324 quit!
325 redraw!
326 call WaitForAssert({-> assert_equal(1, winnr('$'))})
Ubaldo Tiberi46f28232024-06-19 19:50:32 +0200327
328 " Termdebug session ended. Buffer 'bar' shall have no mappings
329 call assert_true(bufname() ==# 'bar')
330 call assert_false(maparg('K', 'n', 0, 1)->empty())
331 call assert_false(maparg('-', 'n', 0, 1)->empty())
332 call assert_false(maparg('+', 'n', 0, 1)->empty())
333 call assert_true(maparg('K', 'n', 0, 1).buffer->empty())
334 call assert_true(maparg('-', 'n', 0, 1).buffer->empty())
335 call assert_true(maparg('+', 'n', 0, 1).buffer->empty())
336
337 " Buffer 'foo' shall have the same mapping as before running the termdebug
338 " session
339 buffer foo
340 call assert_true(bufname() ==# 'foo')
Ken Takataffed1542024-05-21 17:14:56 +0200341 call assert_true(maparg('K', 'n', 0, 1).buffer)
342 call assert_true(maparg('-', 'n', 0, 1).buffer)
343 call assert_true(maparg('+', 'n', 0, 1).buffer)
344 call assert_equal(':echom "bK"<cr>', maparg('K', 'n', 0, 1).rhs)
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100345
Ubaldo Tiberia48637c2024-06-18 20:18:20 +0200346 nunmap K
347 nunmap +
348 nunmap -
shane.xb.qian7fbbd7f2023-11-08 21:44:48 +0100349 %bw!
350endfunc
351
Ubaldo Tiberief8eab82024-06-13 19:23:07 +0200352function Test_termdebug_save_restore_variables()
Ubaldo Tiberia48637c2024-06-18 20:18:20 +0200353 " saved mousemodel
Ubaldo Tiberief8eab82024-06-13 19:23:07 +0200354 let &mousemodel=''
Ubaldo Tiberia48637c2024-06-18 20:18:20 +0200355
356 " saved keys
357 nnoremap K :echo "hello world!"<cr>
358 let expected_map_K = maparg('K', 'n', 0 , 1)
359 nnoremap + :echo "hello plus!"<cr>
360 let expected_map_plus = maparg('+', 'n', 0 , 1)
361 let expected_map_minus = {}
362
363 " saved &columns
364 let expected_columns = &columns
365
366 " We want termdebug to overwrite 'K' map but not '+' map.
367 let g:termdebug_config = {}
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +0200368 let g:termdebug_config['map_K'] = v:true
Ubaldo Tiberia48637c2024-06-18 20:18:20 +0200369
Ubaldo Tiberief8eab82024-06-13 19:23:07 +0200370 Termdebug
371 call WaitForAssert({-> assert_equal(3, winnr('$'))})
372 call WaitForAssert({-> assert_match(&mousemodel, 'popup_setpos')})
373 wincmd t
374 quit!
375 call WaitForAssert({-> assert_equal(1, winnr('$'))})
Ubaldo Tiberia48637c2024-06-18 20:18:20 +0200376
377 call assert_true(empty(&mousemodel))
378
379 call assert_true(empty(expected_map_minus))
380 call assert_equal(expected_map_K.rhs, maparg('K', 'n', 0, 1).rhs)
381 call assert_equal(expected_map_plus.rhs, maparg('+', 'n', 0, 1).rhs)
382
383 call assert_equal(expected_columns, &columns)
384
385 nunmap K
386 nunmap +
387 unlet g:termdebug_config
Ubaldo Tiberief8eab82024-06-13 19:23:07 +0200388endfunction
389
Ubaldo Tiberif7f8f0b2024-06-20 22:17:34 +0200390function Test_termdebug_sanity_check()
391 " Test if user has filename/folders with wrong names
392 let g:termdebug_config = {}
393 let s:dict = {'disasm_window': 'Termdebug-asm-listing', 'use_prompt': 'gdb', 'variables_window': 'Termdebug-variables-listing'}
394
395 for key in keys(s:dict)
396 let s:filename = s:dict[key]
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +0200397 let g:termdebug_config[key] = v:true
Ubaldo Tiberif7f8f0b2024-06-20 22:17:34 +0200398 let s:error_message = "You have a file/folder named '" .. s:filename .. "'"
399
400 " Write dummy file with bad name
401 call writefile(['This', 'is', 'a', 'test'], s:filename)
402 Termdebug
403 call WaitForAssert({-> assert_true(execute('messages') =~ s:error_message)})
404 call WaitForAssert({-> assert_equal(1, winnr('$'))})
405
406 call delete(s:filename)
407 call remove(g:termdebug_config, key)
408 endfor
409
410 unlet g:termdebug_config
411endfunction
412
413function Test_termdebug_double_termdebug_instances()
414 let s:error_message = 'Terminal debugger already running, cannot run two'
415 Termdebug
416 call WaitForAssert({-> assert_equal(3, winnr('$'))})
417 Termdebug
418 call WaitForAssert({-> assert_true(execute('messages') =~ s:error_message)})
419 wincmd t
420 quit!
421 call WaitForAssert({-> assert_equal(1, winnr('$'))})
422 :%bw!
423endfunction
Ubaldo Tiberi62ccaa62024-05-21 23:33:03 +0200424
Ubaldo Tiberia90b0b42024-07-20 12:00:44 +0200425function Test_termdebug_config_types()
426 " TODO Remove the deprecated features after 1 Jan 2025.
427 let g:termdebug_config = {}
428 let s:error_message = 'Deprecation Warning:'
429 call assert_true(maparg('K', 'n', 0, 1)->empty())
430
431 for key in ['disasm_window', 'variables_window', 'map_K']
432 for val in [0, 1, v:true, v:false]
433 let g:termdebug_config[key] = val
434 Termdebug
435
436 " Type check: warning is displayed
437 if typename(val) == 'number'
438 call WaitForAssert({-> assert_true(execute('messages') =~ s:error_message)})
439 endif
440
441 " Test on g:termdebug_config keys
442 if val && key != 'map_K'
443 call WaitForAssert({-> assert_equal(4, winnr('$'))})
444 call remove(g:termdebug_config, key)
445 else
446 call WaitForAssert({-> assert_equal(3, winnr('$'))})
447 endif
448
449 " Test on mapping
450 if key == 'map_K'
451 if val
452 call assert_equal(':Evaluate<CR>', maparg('K', 'n', 0, 1).rhs)
453 else
454 call assert_true(maparg('K', 'n', 0, 1)->empty())
455 endif
456 endif
457
458 " Shutoff termdebug
459 wincmd t
460 quit!
461 call WaitForAssert({-> assert_equal(1, winnr('$'))})
462 :%bw!
463
464 endfor
465 endfor
466
467 unlet g:termdebug_config
468endfunction
469
Yegappan Lakshmanan58f39d82023-08-27 11:14:44 +0200470" vim: shiftwidth=2 sts=2 expandtab