Skip to content

Commit

Permalink
patch 8.0.1612: need to close terminal after shell stopped
Browse files Browse the repository at this point in the history
Problem:    Need to close terminal after shell stopped.
Solution:   Make :terminal without argument close the window by default.
  • Loading branch information
brammool committed Mar 16, 2018
1 parent af23bad commit 1dd9833
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 6 deletions.
12 changes: 12 additions & 0 deletions runtime/doc/terminal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,13 @@ Syntax ~
if [command] is NONE no job is started, the pty of the
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
'shell' as the name, prefixed with a "!". If a buffer
by this name already exists a number is added in
Expand All @@ -155,9 +162,14 @@ Syntax ~
Supported [options] are:
++close The terminal window will close
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
shows it, a window will be opened.
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
window, do not split the current
window. Fails if the current buffer
Expand Down
23 changes: 17 additions & 6 deletions src/terminal.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@
* in tl_scrollback are no longer used.
*
* TODO:
* - Make terminal close by default when started without a command. Add
* ++noclose argument.
* - 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
* the GUI.
Expand Down Expand Up @@ -123,7 +121,11 @@ struct terminal_S {

int tl_normal_mode; /* TRUE: Terminal-Normal mode */
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_eof_chars;

Expand Down Expand Up @@ -643,6 +645,8 @@ ex_terminal(exarg_T *eap)

if ((int)(p - cmd) == 5 && STRNICMP(cmd, "close", 5) == 0)
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)
opt.jo_term_finish = 'o';
else if ((int)(p - cmd) == 6 && STRNICMP(cmd, "curwin", 6) == 0)
Expand Down Expand Up @@ -696,9 +700,15 @@ ex_terminal(exarg_T *eap)
cmd = skipwhite(p);
}
if (*cmd == NUL)
{
/* Make a copy of 'shell', an autocommand may change the option. */
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)
{
/* Write lines from current buffer to the job. */
Expand Down Expand Up @@ -1535,7 +1545,7 @@ set_terminal_mode(term_T *term, int normal_mode)
static void
cleanup_vterm(term_T *term)
{
if (term->tl_finish != 'c')
if (term->tl_finish != TL_FINISH_CLOSE)
move_terminal_to_buffer(term);
term_free_vterm(term);
set_terminal_mode(term, FALSE);
Expand Down Expand Up @@ -2603,7 +2613,7 @@ term_channel_closed(channel_T *ch)

cleanup_vterm(term);

if (term->tl_finish == 'c')
if (term->tl_finish == TL_FINISH_CLOSE)
{
aco_save_T aco;

Expand All @@ -2614,7 +2624,8 @@ term_channel_closed(channel_T *ch)
aucmd_restbuf(&aco);
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];

Expand Down
20 changes: 20 additions & 0 deletions src/testdir/test_terminal.vim
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,26 @@ func Test_terminal_finish_open_close()

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
call assert_equal(2, winnr('$'))
wincmd p
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -766,6 +766,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1612,
/**/
1611,
/**/
Expand Down

0 comments on commit 1dd9833

Please sign in to comment.