Patch 8.0.0838
Problem:    Buffer hangs around whem terminal window is closed.
Solution:   When the job has ended wipe out a terminal buffer when the window
            is closed.
Files:      src/buffer.c, src/terminal.c, src/proto/terminal.pro,
            src/testdir/test_terminal.vim


*** ../vim-8.0.0837/src/buffer.c        2017-07-28 21:51:53.007136551 +0200
--- src/buffer.c        2017-08-01 21:21:24.432513623 +0200
***************
*** 468,473 ****
--- 468,498 ----
      int               del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE);
      int               wipe_buf = (action == DOBUF_WIPE);
  
+ #ifdef FEAT_TERMINAL
+     if (bt_terminal(buf))
+     {
+       if (term_job_running(buf->b_term))
+       {
+           if (wipe_buf)
+               /* Wiping out a terminal buffer kills the job. */
+               free_terminal(buf);
+           else
+           {
+               /* The job keeps running, hide the buffer. */
+               del_buf = FALSE;
+               unload_buf = FALSE;
+           }
+       }
+       else
+       {
+           /* A terminal buffer is wiped out if the job has finished. */
+           del_buf = TRUE;
+           unload_buf = TRUE;
+           wipe_buf = TRUE;
+       }
+     }
+     else
+ #endif
      /*
       * Force unloading or deleting when 'bufhidden' says so.
       * The caller must take care of NOT deleting/freeing when 'bufhidden' is
*** ../vim-8.0.0837/src/terminal.c      2017-08-01 20:25:17.873279284 +0200
--- src/terminal.c      2017-08-01 21:37:26.129512271 +0200
***************
*** 36,45 ****
   * that buffer, attributes come from the scrollback buffer tl_scrollback.
   *
   * TODO:
!  * - When closing a window with a terminal buffer where the job has ended, 
wipe
!  *   out the buffer.  Like 'bufhidden' is "wipe".
!  * - When a buffer with a terminal is wiped out, kill the job and close the
!  *   channel.
   * - in bash mouse clicks are inserting characters.
   * - mouse scroll: when over other window, scroll that window.
   * - typing CTRL-C is not sent to the terminal.  need to setup controlling 
tty?
--- 36,42 ----
   * that buffer, attributes come from the scrollback buffer tl_scrollback.
   *
   * TODO:
!  * - don't allow exiting Vim when a terminal is still running a job
   * - in bash mouse clicks are inserting characters.
   * - mouse scroll: when over other window, scroll that window.
   * - typing CTRL-C is not sent to the terminal.  need to setup controlling 
tty?
***************
*** 59,70 ****
   * - do not store terminal window in viminfo.  Or prefix term:// ?
   * - add a character in :ls output
   * - add 't' to mode()
-  * - When making a change after the job has ended, make the buffer a normal
-  *   buffer; needs to be written.
-  * - when closing window and job has not ended, make terminal hidden?
-  * - when closing window and job has ended, make buffer hidden?
-  * - don't allow exiting Vim when a terminal is still running a job
   * - use win_del_lines() to make scroll-up efficient.
   * - add test for giving error for invalid 'termsize' value.
   * - support minimal size when 'termsize' is "rows*cols".
   * - support minimal size when 'termsize' is empty?
--- 56,63 ----
   * - do not store terminal window in viminfo.  Or prefix term:// ?
   * - add a character in :ls output
   * - add 't' to mode()
   * - use win_del_lines() to make scroll-up efficient.
+  * - implement term_setsize()
   * - add test for giving error for invalid 'termsize' value.
   * - support minimal size when 'termsize' is "rows*cols".
   * - support minimal size when 'termsize' is empty?
***************
*** 573,579 ****
  /*
   * Return TRUE if the job for "term" is still running.
   */
!     static int
  term_job_running(term_T *term)
  {
      /* Also consider the job finished when the channel is closed, to avoid a
--- 566,572 ----
  /*
   * Return TRUE if the job for "term" is still running.
   */
!     int
  term_job_running(term_T *term)
  {
      /* Also consider the job finished when the channel is closed, to avoid a
*** ../vim-8.0.0837/src/proto/terminal.pro      2017-07-30 19:38:16.962463378 
+0200
--- src/proto/terminal.pro      2017-08-01 21:21:36.076428906 +0200
***************
*** 2,7 ****
--- 2,8 ----
  void ex_terminal(exarg_T *eap);
  void free_terminal(buf_T *buf);
  void write_to_term(buf_T *buffer, char_u *msg, channel_T *channel);
+ int term_job_running(term_T *term);
  int term_in_terminal_mode(void);
  void term_leave_terminal_mode(void);
  int term_use_loop(void);
*** ../vim-8.0.0837/src/testdir/test_terminal.vim       2017-08-01 
20:25:17.873279284 +0200
--- src/testdir/test_terminal.vim       2017-08-01 21:35:37.882300745 +0200
***************
*** 6,11 ****
--- 6,13 ----
  
  source shared.vim
  
+ " Open a terminal with a shell, assign the job to g:job and return the buffer
+ " number.
  func Run_shell_in_terminal()
    let buf = term_start(&shell)
  
***************
*** 16,37 ****
    let g:job = term_getjob(buf)
    call assert_equal(v:t_job, type(g:job))
  
!   call term_sendkeys(buf, "exit\r")
    call WaitFor('job_status(g:job) == "dead"')
    call assert_equal('dead', job_status(g:job))
- 
-   return buf
  endfunc
  
  func Test_terminal_basic()
    let buf = Run_shell_in_terminal()
  
-   exe buf . 'bwipe'
    unlet g:job
  endfunc
  
  func Test_terminal_make_change()
    let buf = Run_shell_in_terminal()
    call term_wait(buf)
  
    setlocal modifiable
--- 18,48 ----
    let g:job = term_getjob(buf)
    call assert_equal(v:t_job, type(g:job))
  
!   return buf
! endfunc
! 
! " Stops the shell started by Run_shell_in_terminal().
! func Stop_shell_in_terminal(buf)
!   call term_sendkeys(a:buf, "exit\r")
    call WaitFor('job_status(g:job) == "dead"')
    call assert_equal('dead', job_status(g:job))
  endfunc
  
  func Test_terminal_basic()
    let buf = Run_shell_in_terminal()
+   call Stop_shell_in_terminal(buf)
+   call term_wait(buf)
+ 
+   " closing window wipes out the terminal buffer a with finished job
+   close
+   call assert_equal("", bufname(buf))
  
    unlet g:job
  endfunc
  
  func Test_terminal_make_change()
    let buf = Run_shell_in_terminal()
+   call Stop_shell_in_terminal(buf)
    call term_wait(buf)
  
    setlocal modifiable
***************
*** 43,48 ****
--- 54,85 ----
    unlet g:job
  endfunc
  
+ func Test_terminal_wipe_buffer()
+   let buf = Run_shell_in_terminal()
+   exe buf . 'bwipe'
+   call WaitFor('job_status(g:job) == "dead"')
+   call assert_equal('dead', job_status(g:job))
+   call assert_equal("", bufname(buf))
+ 
+   unlet g:job
+ endfunc
+ 
+ func Test_terminal_hide_buffer()
+   let buf = Run_shell_in_terminal()
+   quit
+   for nr in range(1, winnr('$'))
+     call assert_notequal(winbufnr(nr), buf)
+   endfor
+   call assert_true(bufloaded(buf))
+   call assert_true(buflisted(buf))
+ 
+   exe 'split ' . buf . 'buf'
+   call Stop_shell_in_terminal(buf)
+   exe buf . 'bwipe'
+ 
+   unlet g:job
+ endfunc
+ 
  func Check_123(buf)
    let l = term_scrape(a:buf, 1)
    call assert_true(len(l) > 0)
*** ../vim-8.0.0837/src/version.c       2017-08-01 20:53:25.928774497 +0200
--- src/version.c       2017-08-01 21:43:00.875073388 +0200
***************
*** 771,772 ****
--- 771,774 ----
  {   /* Add new patch number below this line */
+ /**/
+     838,
  /**/

-- 
DEAD PERSON:  I'm getting better!
CUSTOMER:     No, you're not -- you'll be stone dead in a moment.
MORTICIAN:    Oh, I can't take him like that -- it's against regulations.
                                  The Quest for the Holy Grail (Monty Python)

 /// 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