1
0
forked from aniani/vim

patch 8.0.1612: need to close terminal after shell stopped

Problem:    Need to close terminal after shell stopped.
Solution:   Make :terminal without argument close the window by default.
This commit is contained in:
Bram Moolenaar
2018-03-16 22:54:53 +01:00
parent af23bad0fd
commit 1dd98334d6
4 changed files with 51 additions and 6 deletions

View File

@@ -140,6 +140,13 @@ Syntax ~
if [command] is NONE no job is started, the pty of the if [command] is NONE no job is started, the pty of the
terminal can be used by a command like gdb. terminal can be used by a command like gdb.
If [command] is missing the default behavior is to
close the terminal when the shell exits. This can be
changed with the ++noclose argument.
If [command] is present the default behavior is to
keep the terminal open in Terminal-Normal mode. This
can be changed with the ++close argument.
A new buffer will be created, using [command] or A new buffer will be created, using [command] or
'shell' as the name, prefixed with a "!". If a buffer 'shell' as the name, prefixed with a "!". If a buffer
by this name already exists a number is added in by this name already exists a number is added in
@@ -155,9 +162,14 @@ Syntax ~
Supported [options] are: Supported [options] are:
++close The terminal window will close ++close The terminal window will close
automatically when the job terminates. automatically when the job terminates.
++noclose The terminal window will NOT close
automatically when the job terminates.
++open When the job terminates and no window ++open When the job terminates and no window
shows it, a window will be opened. shows it, a window will be opened.
Note that this can be interruptive. Note that this can be interruptive.
The last of ++close, ++noclose and ++open
matters and rules out earlier arguments.
++curwin Open the terminal in the current ++curwin Open the terminal in the current
window, do not split the current window, do not split the current
window. Fails if the current buffer window. Fails if the current buffer

View File

@@ -38,8 +38,6 @@
* in tl_scrollback are no longer used. * in tl_scrollback are no longer used.
* *
* TODO: * TODO:
* - Make terminal close by default when started without a command. Add
* ++noclose argument.
* - Win32: In the GUI use a terminal emulator for :!cmd. * - Win32: In the GUI use a terminal emulator for :!cmd.
* - Add a way to set the 16 ANSI colors, to be used for 'termguicolors' and in * - Add a way to set the 16 ANSI colors, to be used for 'termguicolors' and in
* the GUI. * the GUI.
@@ -123,7 +121,11 @@ struct terminal_S {
int tl_normal_mode; /* TRUE: Terminal-Normal mode */ int tl_normal_mode; /* TRUE: Terminal-Normal mode */
int tl_channel_closed; int tl_channel_closed;
int tl_finish; /* 'c' for ++close, 'o' for ++open */ int tl_finish;
#define TL_FINISH_UNSET NUL
#define TL_FINISH_CLOSE 'c' /* ++close or :terminal without argument */
#define TL_FINISH_NOCLOSE 'n' /* ++noclose */
#define TL_FINISH_OPEN 'o' /* ++open */
char_u *tl_opencmd; char_u *tl_opencmd;
char_u *tl_eof_chars; char_u *tl_eof_chars;
@@ -643,6 +645,8 @@ ex_terminal(exarg_T *eap)
if ((int)(p - cmd) == 5 && STRNICMP(cmd, "close", 5) == 0) if ((int)(p - cmd) == 5 && STRNICMP(cmd, "close", 5) == 0)
opt.jo_term_finish = 'c'; opt.jo_term_finish = 'c';
else if ((int)(p - cmd) == 7 && STRNICMP(cmd, "noclose", 7) == 0)
opt.jo_term_finish = 'n';
else if ((int)(p - cmd) == 4 && STRNICMP(cmd, "open", 4) == 0) else if ((int)(p - cmd) == 4 && STRNICMP(cmd, "open", 4) == 0)
opt.jo_term_finish = 'o'; opt.jo_term_finish = 'o';
else if ((int)(p - cmd) == 6 && STRNICMP(cmd, "curwin", 6) == 0) else if ((int)(p - cmd) == 6 && STRNICMP(cmd, "curwin", 6) == 0)
@@ -696,9 +700,15 @@ ex_terminal(exarg_T *eap)
cmd = skipwhite(p); cmd = skipwhite(p);
} }
if (*cmd == NUL) if (*cmd == NUL)
{
/* Make a copy of 'shell', an autocommand may change the option. */ /* Make a copy of 'shell', an autocommand may change the option. */
tofree = cmd = vim_strsave(p_sh); tofree = cmd = vim_strsave(p_sh);
/* default to close when the shell exits */
if (opt.jo_term_finish == NUL)
opt.jo_term_finish = 'c';
}
if (eap->addr_count > 0) if (eap->addr_count > 0)
{ {
/* Write lines from current buffer to the job. */ /* Write lines from current buffer to the job. */
@@ -1535,7 +1545,7 @@ set_terminal_mode(term_T *term, int normal_mode)
static void static void
cleanup_vterm(term_T *term) cleanup_vterm(term_T *term)
{ {
if (term->tl_finish != 'c') if (term->tl_finish != TL_FINISH_CLOSE)
move_terminal_to_buffer(term); move_terminal_to_buffer(term);
term_free_vterm(term); term_free_vterm(term);
set_terminal_mode(term, FALSE); set_terminal_mode(term, FALSE);
@@ -2603,7 +2613,7 @@ term_channel_closed(channel_T *ch)
cleanup_vterm(term); cleanup_vterm(term);
if (term->tl_finish == 'c') if (term->tl_finish == TL_FINISH_CLOSE)
{ {
aco_save_T aco; aco_save_T aco;
@@ -2614,7 +2624,8 @@ term_channel_closed(channel_T *ch)
aucmd_restbuf(&aco); aucmd_restbuf(&aco);
break; break;
} }
if (term->tl_finish == 'o' && term->tl_buffer->b_nwindows == 0) if (term->tl_finish == TL_FINISH_OPEN
&& term->tl_buffer->b_nwindows == 0)
{ {
char buf[50]; char buf[50];

View File

@@ -367,6 +367,26 @@ func Test_terminal_finish_open_close()
let [cmd, waittime] = s:get_sleep_cmd() let [cmd, waittime] = s:get_sleep_cmd()
" shell terminal closes automatically
terminal
let buf = bufnr('%')
call assert_equal(2, winnr('$'))
" Wait for the shell to display a prompt
call WaitFor({-> term_getline(buf, 1) != ""})
call Stop_shell_in_terminal(buf)
call WaitFor("winnr('$') == 1", waittime)
" shell terminal that does not close automatically
terminal ++noclose
let buf = bufnr('%')
call assert_equal(2, winnr('$'))
" Wait for the shell to display a prompt
call WaitFor({-> term_getline(buf, 1) != ""})
call Stop_shell_in_terminal(buf)
call assert_equal(2, winnr('$'))
quit
call assert_equal(1, winnr('$'))
exe 'terminal ++close ' . cmd exe 'terminal ++close ' . cmd
call assert_equal(2, winnr('$')) call assert_equal(2, winnr('$'))
wincmd p wincmd p

View File

@@ -766,6 +766,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 */
/**/
1612,
/**/ /**/
1611, 1611,
/**/ /**/