patch 7.4.1529
Problem:    Specifying buffer number for channel not implemented yet.
Solution:   Implement passing a buffer number.
diff --git a/src/eval.c b/src/eval.c
index 31c5ea2..825a606 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -10119,6 +10119,27 @@
 		opt->jo_io_name[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
 		    || STRCMP(hi->hi_key, "in-bot") == 0)
 	    {
@@ -15156,21 +15177,36 @@
 
     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 */
-	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"));
-	    return;
+	    buf = buflist_findnr(opt.jo_io_buf[PART_IN]);
+	    if (buf == NULL)
+		EMSGN(_(e_nobufnr), (long)opt.jo_io_buf[PART_IN]);
 	}
-	buf = buflist_find_by_name(opt.jo_io_name[PART_IN], FALSE);
+	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);
 	if (buf == NULL)
 	    return;
 	if (buf->b_ml.ml_mfp == NULL)
 	{
-	    EMSG2(_("E918: buffer must be loaded: %s"),
-						     opt.jo_io_name[PART_IN]);
+	    char_u	buf[NUMBUFLEN];
+	    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;
 	}
 	job->jv_in_buf = buf;