1
0
forked from aniani/vim

patch 9.1.0751: Error callback for term_start() not used

Problem:  Error callback for term_start() not used
          (darkseid-is)
Solution: attach pipe to stderr if an error callback exists

fixes: #15665
closes: #15729

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt 2024-09-30 21:29:43 +02:00
parent 563e8ec8c7
commit b50bc9ad55
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
3 changed files with 44 additions and 1 deletions

View File

@ -5763,8 +5763,11 @@ mch_job_start(char **argv, job_T *job, jobopt_T *options, int is_terminal)
goto failed;
}
}
// only create a pipe for the error fd, when either a callback has been setup
// or pty is not used (e.g. terminal uses pty by default)
else if (!use_out_for_err && !use_null_for_err
&& pty_master_fd < 0 && pipe(fd_err) < 0)
&& (pty_master_fd < 0 || (options->jo_set & JO_ERR_CALLBACK))
&& pipe(fd_err) < 0)
goto failed;
if (!use_null_for_in || !use_null_for_out || !use_null_for_err)

View File

@ -2765,4 +2765,42 @@ func Test_channel_lsp_mode()
call RunServer('test_channel_lsp.py', 'LspTests', [])
endfunc
func Test_error_callback_terminal()
CheckUnix
CheckFeature terminal
let g:out = ''
let g:error = ''
func! s:Out(channel, msg)
let g:out .= string(a:msg)
endfunc
func! s:Err(channel, msg)
let g:error .= string(a:msg)
endfunc
let buf = term_start(['sh'], #{term_finish: 'close', out_cb: 's:Out', err_cb: 's:Err', err_io: 'pipe'})
let job = term_getjob(buf)
let dict = job_info(job).channel->ch_info()
call assert_true(dict.id != 0)
call assert_equal('open', dict.status)
call assert_equal('open', dict.out_status)
call assert_equal('RAW', dict.out_mode)
call assert_equal('buffer', dict.out_io)
call assert_equal('open', dict.err_status)
call assert_equal('RAW', dict.err_mode)
call assert_equal('pipe', dict.err_io)
call term_sendkeys(buf, "XXXX\<cr>")
call term_wait(buf)
call term_sendkeys(buf, "exit\<cr>")
call term_wait(buf)
call assert_match('XXX.*exit', g:out)
call assert_match('sh:.*XXXX:.*not found', g:error)
delfunc s:Out
delfunc s:Err
unlet! g:out g:error
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
751,
/**/
750,
/**/