mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 8.0.0838: buffer hangs around whem terminal window is closed
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.
This commit is contained in:
25
src/buffer.c
25
src/buffer.c
@@ -468,6 +468,31 @@ close_buffer(
|
|||||||
int del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE);
|
int del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE);
|
||||||
int wipe_buf = (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.
|
* Force unloading or deleting when 'bufhidden' says so.
|
||||||
* The caller must take care of NOT deleting/freeing when 'bufhidden' is
|
* The caller must take care of NOT deleting/freeing when 'bufhidden' is
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
void ex_terminal(exarg_T *eap);
|
void ex_terminal(exarg_T *eap);
|
||||||
void free_terminal(buf_T *buf);
|
void free_terminal(buf_T *buf);
|
||||||
void write_to_term(buf_T *buffer, char_u *msg, channel_T *channel);
|
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);
|
int term_in_terminal_mode(void);
|
||||||
void term_leave_terminal_mode(void);
|
void term_leave_terminal_mode(void);
|
||||||
int term_use_loop(void);
|
int term_use_loop(void);
|
||||||
|
@@ -36,10 +36,7 @@
|
|||||||
* that buffer, attributes come from the scrollback buffer tl_scrollback.
|
* that buffer, attributes come from the scrollback buffer tl_scrollback.
|
||||||
*
|
*
|
||||||
* TODO:
|
* TODO:
|
||||||
* - When closing a window with a terminal buffer where the job has ended, wipe
|
* - don't allow exiting Vim when a terminal is still running a job
|
||||||
* 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.
|
* - in bash mouse clicks are inserting characters.
|
||||||
* - mouse scroll: when over other window, scroll that window.
|
* - mouse scroll: when over other window, scroll that window.
|
||||||
* - typing CTRL-C is not sent to the terminal. need to setup controlling tty?
|
* - typing CTRL-C is not sent to the terminal. need to setup controlling tty?
|
||||||
@@ -59,12 +56,8 @@
|
|||||||
* - do not store terminal window in viminfo. Or prefix term:// ?
|
* - do not store terminal window in viminfo. Or prefix term:// ?
|
||||||
* - add a character in :ls output
|
* - add a character in :ls output
|
||||||
* - add 't' to mode()
|
* - 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.
|
* - use win_del_lines() to make scroll-up efficient.
|
||||||
|
* - implement term_setsize()
|
||||||
* - add test for giving error for invalid 'termsize' value.
|
* - add test for giving error for invalid 'termsize' value.
|
||||||
* - support minimal size when 'termsize' is "rows*cols".
|
* - support minimal size when 'termsize' is "rows*cols".
|
||||||
* - support minimal size when 'termsize' is empty?
|
* - support minimal size when 'termsize' is empty?
|
||||||
@@ -573,7 +566,7 @@ term_convert_key(term_T *term, int c, char *buf)
|
|||||||
/*
|
/*
|
||||||
* Return TRUE if the job for "term" is still running.
|
* Return TRUE if the job for "term" is still running.
|
||||||
*/
|
*/
|
||||||
static int
|
int
|
||||||
term_job_running(term_T *term)
|
term_job_running(term_T *term)
|
||||||
{
|
{
|
||||||
/* Also consider the job finished when the channel is closed, to avoid a
|
/* Also consider the job finished when the channel is closed, to avoid a
|
||||||
|
@@ -6,6 +6,8 @@ endif
|
|||||||
|
|
||||||
source shared.vim
|
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()
|
func Run_shell_in_terminal()
|
||||||
let buf = term_start(&shell)
|
let buf = term_start(&shell)
|
||||||
|
|
||||||
@@ -16,22 +18,31 @@ func Run_shell_in_terminal()
|
|||||||
let g:job = term_getjob(buf)
|
let g:job = term_getjob(buf)
|
||||||
call assert_equal(v:t_job, type(g:job))
|
call assert_equal(v:t_job, type(g:job))
|
||||||
|
|
||||||
call term_sendkeys(buf, "exit\r")
|
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 WaitFor('job_status(g:job) == "dead"')
|
||||||
call assert_equal('dead', job_status(g:job))
|
call assert_equal('dead', job_status(g:job))
|
||||||
|
|
||||||
return buf
|
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_terminal_basic()
|
func Test_terminal_basic()
|
||||||
let buf = Run_shell_in_terminal()
|
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))
|
||||||
|
|
||||||
exe buf . 'bwipe'
|
|
||||||
unlet g:job
|
unlet g:job
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_terminal_make_change()
|
func Test_terminal_make_change()
|
||||||
let buf = Run_shell_in_terminal()
|
let buf = Run_shell_in_terminal()
|
||||||
|
call Stop_shell_in_terminal(buf)
|
||||||
call term_wait(buf)
|
call term_wait(buf)
|
||||||
|
|
||||||
setlocal modifiable
|
setlocal modifiable
|
||||||
@@ -43,6 +54,32 @@ func Test_terminal_make_change()
|
|||||||
unlet g:job
|
unlet g:job
|
||||||
endfunc
|
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)
|
func Check_123(buf)
|
||||||
let l = term_scrape(a:buf, 1)
|
let l = term_scrape(a:buf, 1)
|
||||||
call assert_true(len(l) > 0)
|
call assert_true(len(l) > 0)
|
||||||
|
@@ -769,6 +769,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 */
|
||||||
|
/**/
|
||||||
|
838,
|
||||||
/**/
|
/**/
|
||||||
837,
|
837,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user