patch 8.0.0916: cannot specify properties of window for terminal open
Problem: Cannot specify properties of window for when opening a window for
a finished terminal job.
Solution: Add "term_opencmd".
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index bd92b3d..bf8bae4 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -8085,6 +8085,12 @@
"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()*
diff --git a/src/channel.c b/src/channel.c
index 22d9083..70ee2f3 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -4434,6 +4434,28 @@
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))
diff --git a/src/structs.h b/src/structs.h
index 767b0f4..91326f6 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1693,7 +1693,8 @@
#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 @@
int jo_curwin;
int jo_hidden;
char_u *jo_term_name;
+ char_u *jo_term_opencmd;
int jo_term_finish;
#endif
} jobopt_T;
diff --git a/src/terminal.c b/src/terminal.c
index 63e1cec..0b4c2ef 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -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 @@
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 @@
}
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 @@
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 @@
/* 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 @@
&& 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;
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 97c13ef..4de853a 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -320,7 +320,7 @@
endfunc
-func Test_finish_close()
+func Test_finish_open_close()
call assert_equal(1, winnr('$'))
if s:python != ''
@@ -371,6 +371,19 @@
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()
diff --git a/src/version.c b/src/version.c
index 306aeb4..8ca7d70 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 916,
+/**/
915,
/**/
914,