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.

Raspunde prin e-mail lui