]> granicus.if.org Git - vim/commitdiff
patch 8.0.0916: cannot specify properties of window for terminal open v8.0.0916
authorBram Moolenaar <Bram@vim.org>
Sat, 12 Aug 2017 14:01:04 +0000 (16:01 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 12 Aug 2017 14:01:04 +0000 (16:01 +0200)
Problem:    Cannot specify properties of window for when opening a window for
            a finished terminal job.
Solution:   Add "term_opencmd".

runtime/doc/eval.txt
src/channel.c
src/structs.h
src/terminal.c
src/testdir/test_terminal.vim
src/version.c

index bd92b3dc26b0cf6e4bf01a78a16df3489796cc44..bf8bae4f2083107e70f2e985e97374a2904aac0e 100644 (file)
@@ -8085,6 +8085,12 @@ term_start({cmd}, {options})                             *term_start()*
                                        "open": open window if needed
                                     Note that "open" can be interruptive.
                                     See |term++close| and |term++open|.
+                  "term_opencmd"    command to use for opening the window when
+                                    "open" is used for "term_finish"; must
+                                    have "%d" where the buffer number goes,
+                                    e.g. "10split|buffer %d"; when not
+                                    specified "botright sbuf %d" is used
+
                {only available when compiled with the |+terminal| feature}
 
 term_wait({buf} [, {time}])                                    *term_wait()*
index 22d908326f072de439fe779b0fa0cd99de76f21a..70ee2f309aa677655e9c9a09e6344b8b0b7c3aad 100644 (file)
@@ -4434,6 +4434,28 @@ get_job_options(typval_T *tv, jobopt_T *opt, int supported, int supported2)
                opt->jo_set2 |= JO2_TERM_FINISH;
                opt->jo_term_finish = *val;
            }
+           else if (STRCMP(hi->hi_key, "term_opencmd") == 0)
+           {
+               char_u *p;
+
+               if (!(supported2 & JO2_TERM_OPENCMD))
+                   break;
+               opt->jo_set2 |= JO2_TERM_OPENCMD;
+               p = opt->jo_term_opencmd = get_tv_string_chk(item);
+               if (p != NULL)
+               {
+                   /* Must have %d and no other %. */
+                   p = vim_strchr(p, '%');
+                   if (p != NULL && (p[1] != 'd'
+                                           || vim_strchr(p + 2, '%') != NULL))
+                       p = NULL;
+               }
+               if (p == NULL)
+               {
+                   EMSG2(_(e_invarg2), "term_opencmd");
+                   return FAIL;
+               }
+           }
            else if (STRCMP(hi->hi_key, "term_rows") == 0)
            {
                if (!(supported2 & JO2_TERM_ROWS))
index 767b0f444dd85b9d1827eb51498e003ec5407bca..91326f6652c7b40b95f19cddb8b1f761ae0cfd16 100644 (file)
@@ -1693,7 +1693,8 @@ struct channel_S {
 #define JO2_VERTICAL       0x0100      /* "vertical" */
 #define JO2_CURWIN         0x0200      /* "curwin" */
 #define JO2_HIDDEN         0x0400      /* "hidden" */
-#define JO2_ALL                    0x07FF
+#define JO2_TERM_OPENCMD    0x0800     /* "term_opencmd" */
+#define JO2_ALL                    0x0FFF
 
 #define JO_MODE_ALL    (JO_MODE + JO_IN_MODE + JO_OUT_MODE + JO_ERR_MODE)
 #define JO_CB_ALL \
@@ -1757,6 +1758,7 @@ typedef struct
     int                jo_curwin;
     int                jo_hidden;
     char_u     *jo_term_name;
+    char_u     *jo_term_opencmd;
     int                jo_term_finish;
 #endif
 } jobopt_T;
index 63e1cec5f571b6deccba57315335cc17241c3de8..0b4c2ef68ab98e99f7d840faba2842fe31a7855b 100644 (file)
@@ -36,8 +36,6 @@
  * that buffer, attributes come from the scrollback buffer tl_scrollback.
  *
  * TODO:
- * - When using term_finish "open" have a way to specify how the window is to
- *   be opened.  E.g. term_opencmd "10split buffer %d".
  * - support different cursor shapes, colors and attributes
  * - make term_getcursor() return type (none/block/bar/underline) and
  *   attributes (color, blink, etc.)
@@ -119,6 +117,7 @@ struct terminal_S {
     int                tl_normal_mode; /* TRUE: Terminal-Normal mode */
     int                tl_channel_closed;
     int                tl_finish;      /* 'c' for ++close, 'o' for ++open */
+    char_u     *tl_opencmd;
 
 #ifdef WIN3264
     void       *tl_winpty_config;
@@ -365,6 +364,9 @@ term_start(char_u *cmd, jobopt_T *opt, int forceit)
     }
     curbuf->b_fname = curbuf->b_ffname;
 
+    if (opt->jo_term_opencmd != NULL)
+       term->tl_opencmd = vim_strsave(opt->jo_term_opencmd);
+
     set_string_option_direct((char_u *)"buftype", -1,
                                  (char_u *)"terminal", OPT_FREE|OPT_LOCAL, 0);
 
@@ -514,6 +516,7 @@ free_terminal(buf_T *buf)
     term_free_vterm(term);
     vim_free(term->tl_title);
     vim_free(term->tl_status_text);
+    vim_free(term->tl_opencmd);
     vim_free(term);
     buf->b_term = NULL;
 }
@@ -1539,7 +1542,9 @@ term_channel_closed(channel_T *ch)
 
                    /* TODO: use term_opencmd */
                    ch_log(NULL, "terminal job finished, opening window");
-                   vim_snprintf(buf, sizeof(buf), "botright sbuf %d", fnum);
+                   vim_snprintf(buf, sizeof(buf),
+                           term->tl_opencmd == NULL
+                               ? "botright sbuf %d" : term->tl_opencmd, fnum);
                    do_cmdline_cmd((char_u *)buf);
                }
                else
@@ -2434,7 +2439,7 @@ f_term_start(typval_T *argvars, typval_T *rettv)
            && get_job_options(&argvars[1], &opt,
                JO_TIMEOUT_ALL + JO_STOPONEXIT
                    + JO_EXIT_CB + JO_CLOSE_CALLBACK,
-               JO2_TERM_NAME + JO2_TERM_FINISH + JO2_HIDDEN
+               JO2_TERM_NAME + JO2_TERM_FINISH + JO2_HIDDEN + JO2_TERM_OPENCMD
                    + JO2_TERM_COLS + JO2_TERM_ROWS + JO2_VERTICAL + JO2_CURWIN
                    + JO2_CWD + JO2_ENV) == FAIL)
        return;
index 97c13efbc8785b3cac88a2b505dc4f5b40e12a30..4de853a6abc95de99208e686bd3466ec670205a0 100644 (file)
@@ -320,7 +320,7 @@ func Test_terminal_curwin()
 
 endfunc
 
-func Test_finish_close()
+func Test_finish_open_close()
   call assert_equal(1, winnr('$'))
 
   if s:python != ''
@@ -371,6 +371,19 @@ func Test_finish_close()
   call WaitFor("winnr('$') == 2", waittime)
   call assert_equal(2, winnr('$'))
   bwipe
+
+  call assert_fails("call term_start(cmd, {'term_opencmd': 'open'})", 'E475:')
+  call assert_fails("call term_start(cmd, {'term_opencmd': 'split %x'})", 'E475:')
+  call assert_fails("call term_start(cmd, {'term_opencmd': 'split %d and %s'})", 'E475:')
+  call assert_fails("call term_start(cmd, {'term_opencmd': 'split % and %d'})", 'E475:')
+
+  call term_start(cmd, {'term_finish': 'open', 'term_opencmd': '4split | buffer %d'})
+  close
+  call WaitFor("winnr('$') == 2", waittime)
+  call assert_equal(2, winnr('$'))
+  call assert_equal(4, winheight(0))
+  bwipe
+
 endfunc
 
 func Test_terminal_cwd()
index 306aeb428017cf1763bdb5ce1c3b25b7b7725113..8ca7d7022fb9c5d57bcaf6a8073de2d985417cf6 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    916,
 /**/
     915,
 /**/