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:
@@ -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
|
||||||
|
@@ -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];
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user