Patch 8.1.0692
Problem: If a buffer was deleted a channel can't write to it.
Solution: When the buffer exists but was unloaded, prepare it for writing.
(closes #3764)
Files: src/channel.c, src/testdir/test_channel.vim
*** ../vim-8.1.0691/src/channel.c 2018-12-21 16:04:16.312437516 +0100
--- src/channel.c 2019-01-04 23:59:05.527410601 +0100
***************
*** 1099,1104 ****
--- 1099,1123 ----
}
/*
+ * Prepare buffer "buf" for writing channel output to.
+ */
+ static void
+ prepare_buffer(buf_T *buf)
+ {
+ buf_T *save_curbuf = curbuf;
+
+ buf_copy_options(buf, BCO_ENTER);
+ curbuf = buf;
+ #ifdef FEAT_QUICKFIX
+ set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
+ set_option_value((char_u *)"bh", 0L, (char_u *)"hide", OPT_LOCAL);
+ #endif
+ if (curbuf->b_ml.ml_mfp == NULL)
+ ml_open(curbuf);
+ curbuf = save_curbuf;
+ }
+
+ /*
* Find a buffer matching "name" or create a new one.
* Returns NULL if there is something very wrong (error already reported).
*/
***************
*** 1120,1133 ****
NULL, (linenr_T)0, BLN_LISTED | BLN_NEW);
if (buf == NULL)
return NULL;
! buf_copy_options(buf, BCO_ENTER);
curbuf = buf;
- #ifdef FEAT_QUICKFIX
- set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL);
- set_option_value((char_u *)"bh", 0L, (char_u *)"hide", OPT_LOCAL);
- #endif
- if (curbuf->b_ml.ml_mfp == NULL)
- ml_open(curbuf);
if (msg)
ml_replace(1, (char_u *)(err ? "Reading from channel error..."
: "Reading from channel output..."), TRUE);
--- 1139,1147 ----
NULL, (linenr_T)0, BLN_LISTED | BLN_NEW);
if (buf == NULL)
return NULL;
! prepare_buffer(buf);
!
curbuf = buf;
if (msg)
ml_replace(1, (char_u *)(err ? "Reading from channel error..."
: "Reading from channel output..."), TRUE);
***************
*** 1244,1249 ****
--- 1258,1266 ----
ch_log(channel, "writing out to buffer '%s'",
(char *)buf->b_ffname);
set_bufref(&channel->ch_part[PART_OUT].ch_bufref, buf);
+ // if the buffer was deleted or unloaded resurrect it
+ if (buf->b_ml.ml_mfp == NULL)
+ prepare_buffer(buf);
}
}
}
***************
*** 1287,1292 ****
--- 1304,1312 ----
ch_log(channel, "writing err to buffer '%s'",
(char *)buf->b_ffname);
set_bufref(&channel->ch_part[PART_ERR].ch_bufref, buf);
+ // if the buffer was deleted or unloaded resurrect it
+ if (buf->b_ml.ml_mfp == NULL)
+ prepare_buffer(buf);
}
}
}
*** ../vim-8.1.0691/src/testdir/test_channel.vim 2018-12-14
22:42:10.191670447 +0100
--- src/testdir/test_channel.vim 2019-01-04 23:58:11.943811833 +0100
***************
*** 1645,1650 ****
--- 1645,1672 ----
bwipe!
endfunc
+ func Test_write_to_deleted_buffer()
+ if !executable('echo') || !has('job')
+ return
+ endif
+ let job = job_start('echo hello', {'out_io': 'buffer', 'out_name':
'test_buffer', 'out_msg': 0})
+ call WaitForAssert({-> assert_equal("dead", job_status(job))})
+ let bufnr = bufnr('test_buffer')
+ call assert_equal(['hello'], getbufline(bufnr, 1, '$'))
+ call assert_equal('nofile', getbufvar(bufnr, '&buftype'))
+ call assert_equal('hide', getbufvar(bufnr, '&bufhidden'))
+ bdel test_buffer
+ call assert_equal([], getbufline(bufnr, 1, '$'))
+
+ let job = job_start('echo hello', {'out_io': 'buffer', 'out_name':
'test_buffer', 'out_msg': 0})
+ call WaitForAssert({-> assert_equal("dead", job_status(job))})
+ call assert_equal(['hello'], getbufline(bufnr, 1, '$'))
+ call assert_equal('nofile', getbufvar(bufnr, '&buftype'))
+ call assert_equal('hide', getbufvar(bufnr, '&bufhidden'))
+
+ bwipe! test_buffer
+ endfunc
+
func Test_cmd_parsing()
if !has('unix')
return
*** ../vim-8.1.0691/src/version.c 2019-01-04 23:09:45.249360567 +0100
--- src/version.c 2019-01-05 00:02:09.446027308 +0100
***************
*** 801,802 ****
--- 801,804 ----
{ /* Add new patch number below this line */
+ /**/
+ 692,
/**/
--
hundred-and-one symptoms of being an internet addict:
107. When using your phone you forget that you don't have to use your
keyboard.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.