]> granicus.if.org Git - vim/commitdiff
patch 8.0.1612: need to close terminal after shell stopped v8.0.1612
authorBram Moolenaar <Bram@vim.org>
Fri, 16 Mar 2018 21:54:53 +0000 (22:54 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 16 Mar 2018 21:54:53 +0000 (22:54 +0100)
Problem:    Need to close terminal after shell stopped.
Solution:   Make :terminal without argument close the window by default.

runtime/doc/terminal.txt
src/terminal.c
src/testdir/test_terminal.vim
src/version.c

index d6c3d199fe5b9d6d14821b924d6eb5d018b67333..f3f6a91bc4da2b5fc5ee6595823d8bbedb1619bd 100644 (file)
@@ -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
@@ -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
index 67972f14b55ea2dcbf757630199cbef3adb4f9e1..60d0098c504cebca6e72c9864997dcd9dee06cee 100644 (file)
@@ -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.
@@ -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;
 
@@ -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)
@@ -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. */
@@ -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);
@@ -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;
 
@@ -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];
 
index 9ac0f2755b530ceba2f8e09789dd399589021654..58737edc8367d1544d200d77387bf580af186a2a 100644 (file)
@@ -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
index 6ab5963ead343363983c035d16497a21c70dcf72..a5883446ca1e38a5ca74784f3edbef99c88b5f4c 100644 (file)
@@ -766,6 +766,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1612,
 /**/
     1611,
 /**/