0
0
mirror of https://github.com/vim/vim.git synced 2025-10-02 05:04:20 -04:00

patch 7.4.1529

Problem:    Specifying buffer number for channel not implemented yet.
Solution:   Implement passing a buffer number.
This commit is contained in:
Bram Moolenaar
2016-03-09 23:14:07 +01:00
parent af1a0e371e
commit 29fd03878c
5 changed files with 116 additions and 20 deletions

View File

@@ -987,6 +987,10 @@ channel_set_options(channel_T *channel, jobopt_T *opt)
/* writing output to a buffer. Default mode is NL. */ /* writing output to a buffer. Default mode is NL. */
if (!(opt->jo_set & JO_OUT_MODE)) if (!(opt->jo_set & JO_OUT_MODE))
channel->ch_part[PART_OUT].ch_mode = MODE_NL; channel->ch_part[PART_OUT].ch_mode = MODE_NL;
if (opt->jo_set & JO_OUT_BUF)
channel->ch_part[PART_OUT].ch_buffer =
buflist_findnr(opt->jo_io_buf[PART_OUT]);
else
channel->ch_part[PART_OUT].ch_buffer = channel->ch_part[PART_OUT].ch_buffer =
find_buffer(opt->jo_io_name[PART_OUT], FALSE); find_buffer(opt->jo_io_name[PART_OUT], FALSE);
ch_logs(channel, "writing out to buffer '%s'", ch_logs(channel, "writing out to buffer '%s'",
@@ -1003,6 +1007,9 @@ channel_set_options(channel_T *channel, jobopt_T *opt)
if (opt->jo_io[PART_ERR] == JIO_OUT) if (opt->jo_io[PART_ERR] == JIO_OUT)
channel->ch_part[PART_ERR].ch_buffer = channel->ch_part[PART_ERR].ch_buffer =
channel->ch_part[PART_OUT].ch_buffer; channel->ch_part[PART_OUT].ch_buffer;
else if (opt->jo_set & JO_ERR_BUF)
channel->ch_part[PART_ERR].ch_buffer =
buflist_findnr(opt->jo_io_buf[PART_ERR]);
else else
channel->ch_part[PART_ERR].ch_buffer = channel->ch_part[PART_ERR].ch_buffer =
find_buffer(opt->jo_io_name[PART_ERR], TRUE); find_buffer(opt->jo_io_name[PART_ERR], TRUE);

View File

@@ -10119,6 +10119,27 @@ get_job_options(typval_T *tv, jobopt_T *opt, int supported)
opt->jo_io_name[part] = opt->jo_io_name[part] =
get_tv_string_buf_chk(item, opt->jo_io_name_buf[part]); get_tv_string_buf_chk(item, opt->jo_io_name_buf[part]);
} }
else if (STRCMP(hi->hi_key, "in-buf") == 0
|| STRCMP(hi->hi_key, "out-buf") == 0
|| STRCMP(hi->hi_key, "err-buf") == 0)
{
part = part_from_char(*hi->hi_key);
if (!(supported & JO_OUT_IO))
break;
opt->jo_set |= JO_OUT_BUF << (part - PART_OUT);
opt->jo_io_buf[part] = get_tv_number(item);
if (opt->jo_io_buf[part] <= 0)
{
EMSG2(_(e_invarg2), get_tv_string(item));
return FAIL;
}
if (buflist_findnr(opt->jo_io_buf[part]) == NULL)
{
EMSGN(_(e_nobufnr), (long)opt->jo_io_buf[part]);
return FAIL;
}
}
else if (STRCMP(hi->hi_key, "in-top") == 0 else if (STRCMP(hi->hi_key, "in-top") == 0
|| STRCMP(hi->hi_key, "in-bot") == 0) || STRCMP(hi->hi_key, "in-bot") == 0)
{ {
@@ -15156,21 +15177,36 @@ f_job_start(typval_T *argvars, typval_T *rettv)
if ((opt.jo_set & JO_IN_IO) && opt.jo_io[PART_IN] == JIO_BUFFER) if ((opt.jo_set & JO_IN_IO) && opt.jo_io[PART_IN] == JIO_BUFFER)
{ {
buf_T *buf; buf_T *buf = NULL;
/* check that we can find the buffer before starting the job */ /* check that we can find the buffer before starting the job */
if (!(opt.jo_set & JO_IN_NAME)) if (opt.jo_set & JO_IN_BUF)
{ {
EMSG(_("E915: in-io buffer requires in-name to be set")); buf = buflist_findnr(opt.jo_io_buf[PART_IN]);
return; if (buf == NULL)
EMSGN(_(e_nobufnr), (long)opt.jo_io_buf[PART_IN]);
} }
else if (!(opt.jo_set & JO_IN_NAME))
{
EMSG(_("E915: in-io buffer requires in-buf or in-name to be set"));
}
else
buf = buflist_find_by_name(opt.jo_io_name[PART_IN], FALSE); buf = buflist_find_by_name(opt.jo_io_name[PART_IN], FALSE);
if (buf == NULL) if (buf == NULL)
return; return;
if (buf->b_ml.ml_mfp == NULL) if (buf->b_ml.ml_mfp == NULL)
{ {
EMSG2(_("E918: buffer must be loaded: %s"), char_u buf[NUMBUFLEN];
opt.jo_io_name[PART_IN]); char_u *s;
if (opt.jo_set & JO_IN_BUF)
{
sprintf((char *)buf, "%d", opt.jo_io_buf[PART_IN]);
s = buf;
}
else
s = opt.jo_io_name[PART_IN];
EMSG2(_("E918: buffer must be loaded: %s"), s);
return; return;
} }
job->jv_in_buf = buf; job->jv_in_buf = buf;

View File

@@ -1409,7 +1409,10 @@ struct channel_S {
#define JO_IN_NAME 0x200000 /* "in-name" (JO_OUT_NAME << 2) */ #define JO_IN_NAME 0x200000 /* "in-name" (JO_OUT_NAME << 2) */
#define JO_IN_TOP 0x400000 /* "in-top" */ #define JO_IN_TOP 0x400000 /* "in-top" */
#define JO_IN_BOT 0x800000 /* "in-bot" */ #define JO_IN_BOT 0x800000 /* "in-bot" */
#define JO_ALL 0xffffff #define JO_OUT_BUF 0x1000000 /* "out-buf" */
#define JO_ERR_BUF 0x2000000 /* "err-buf" (JO_OUT_BUF << 1) */
#define JO_IN_BUF 0x4000000 /* "in-buf" (JO_OUT_BUF << 2) */
#define JO_ALL 0xfffffff
#define JO_MODE_ALL (JO_MODE + JO_IN_MODE + JO_OUT_MODE + JO_ERR_MODE) #define JO_MODE_ALL (JO_MODE + JO_IN_MODE + JO_OUT_MODE + JO_ERR_MODE)
#define JO_CB_ALL \ #define JO_CB_ALL \
@@ -1439,6 +1442,7 @@ typedef struct
job_io_T jo_io[4]; /* PART_OUT, PART_ERR, PART_IN */ job_io_T jo_io[4]; /* PART_OUT, PART_ERR, PART_IN */
char_u jo_io_name_buf[4][NUMBUFLEN]; char_u jo_io_name_buf[4][NUMBUFLEN];
char_u *jo_io_name[4]; /* not allocated! */ char_u *jo_io_name[4]; /* not allocated! */
int jo_io_buf[4];
linenr_T jo_in_top; linenr_T jo_in_top;
linenr_T jo_in_bot; linenr_T jo_in_bot;

View File

@@ -610,13 +610,22 @@ func Test_nl_write_both_file()
endtry endtry
endfunc endfunc
func Test_pipe_to_buffer() func Run_test_pipe_to_buffer(use_name)
if !has('job') if !has('job')
return return
endif endif
call ch_log('Test_pipe_to_buffer()') call ch_log('Test_pipe_to_buffer()')
let job = job_start(s:python . " test_channel_pipe.py", let options = {'out-io': 'buffer'}
\ {'out-io': 'buffer', 'out-name': 'pipe-output'}) if a:use_name
let options['out-name'] = 'pipe-output'
let firstline = 'Reading from channel output...'
else
sp pipe-output
let options['out-buf'] = bufnr('%')
quit
let firstline = ''
endif
let job = job_start(s:python . " test_channel_pipe.py", options)
call assert_equal("run", job_status(job)) call assert_equal("run", job_status(job))
try try
let handle = job_getchannel(job) let handle = job_getchannel(job)
@@ -626,20 +635,37 @@ func Test_pipe_to_buffer()
call ch_sendraw(handle, "quit\n") call ch_sendraw(handle, "quit\n")
sp pipe-output sp pipe-output
call s:waitFor('line("$") >= 6') call s:waitFor('line("$") >= 6')
call assert_equal(['Reading from channel output...', 'line one', 'line two', 'this', 'AND this', 'Goodbye!'], getline(1, '$')) call assert_equal([firstline, 'line one', 'line two', 'this', 'AND this', 'Goodbye!'], getline(1, '$'))
bwipe! bwipe!
finally finally
call job_stop(job) call job_stop(job)
endtry endtry
endfunc endfunc
func Test_pipe_err_to_buffer() func Test_pipe_to_buffer_name()
call Run_test_pipe_to_buffer(1)
endfunc
func Test_pipe_to_buffer_nr()
call Run_test_pipe_to_buffer(0)
endfunc
func Run_test_pipe_err_to_buffer(use_name)
if !has('job') if !has('job')
return return
endif endif
call ch_log('Test_pipe_err_to_buffer()') call ch_log('Test_pipe_err_to_buffer()')
let job = job_start(s:python . " test_channel_pipe.py", let options = {'err-io': 'buffer'}
\ {'err-io': 'buffer', 'err-name': 'pipe-err'}) if a:use_name
let options['err-name'] = 'pipe-err'
let firstline = 'Reading from channel error...'
else
sp pipe-err
let options['err-buf'] = bufnr('%')
quit
let firstline = ''
endif
let job = job_start(s:python . " test_channel_pipe.py", options)
call assert_equal("run", job_status(job)) call assert_equal("run", job_status(job))
try try
let handle = job_getchannel(job) let handle = job_getchannel(job)
@@ -649,13 +675,21 @@ func Test_pipe_err_to_buffer()
call ch_sendraw(handle, "quit\n") call ch_sendraw(handle, "quit\n")
sp pipe-err sp pipe-err
call s:waitFor('line("$") >= 5') call s:waitFor('line("$") >= 5')
call assert_equal(['Reading from channel error...', 'line one', 'line two', 'this', 'AND this'], getline(1, '$')) call assert_equal([firstline, 'line one', 'line two', 'this', 'AND this'], getline(1, '$'))
bwipe! bwipe!
finally finally
call job_stop(job) call job_stop(job)
endtry endtry
endfunc endfunc
func Test_pipe_err_to_buffer_name()
call Run_test_pipe_err_to_buffer(1)
endfunc
func Test_pipe_err_to_buffer_nr()
call Run_test_pipe_err_to_buffer(0)
endfunc
func Test_pipe_both_to_buffer() func Test_pipe_both_to_buffer()
if !has('job') if !has('job')
return return
@@ -680,7 +714,7 @@ func Test_pipe_both_to_buffer()
endtry endtry
endfunc endfunc
func Test_pipe_from_buffer() func Run_test_pipe_from_buffer(use_name)
if !has('job') if !has('job')
return return
endif endif
@@ -688,9 +722,14 @@ func Test_pipe_from_buffer()
sp pipe-input sp pipe-input
call setline(1, ['echo one', 'echo two', 'echo three']) call setline(1, ['echo one', 'echo two', 'echo three'])
let options = {'in-io': 'buffer'}
if a:use_name
let options['in-name'] = 'pipe-input'
else
let options['in-buf'] = bufnr('%')
endif
let job = job_start(s:python . " test_channel_pipe.py", let job = job_start(s:python . " test_channel_pipe.py", options)
\ {'in-io': 'buffer', 'in-name': 'pipe-input'})
call assert_equal("run", job_status(job)) call assert_equal("run", job_status(job))
try try
let handle = job_getchannel(job) let handle = job_getchannel(job)
@@ -703,6 +742,14 @@ func Test_pipe_from_buffer()
endtry endtry
endfunc endfunc
func Test_pipe_from_buffer_name()
call Run_test_pipe_from_buffer(1)
endfunc
func Test_pipe_from_buffer_nr()
call Run_test_pipe_from_buffer(0)
endfunc
func Test_pipe_to_nameless_buffer() func Test_pipe_to_nameless_buffer()
if !has('job') if !has('job')
return return

View File

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