diff options
Diffstat (limited to 'src/nvim/ex_docmd.c')
-rw-r--r-- | src/nvim/ex_docmd.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index aba50b2042..3ff1442640 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -7302,12 +7302,31 @@ void set_pressedreturn(bool val) static void ex_terminal(exarg_T *eap) { char ex_cmd[1024]; + size_t len = 0; + + if (cmdmod.cmod_tab > 0 || cmdmod.cmod_split != 0) { + bool multi_mods = false; + + // ex_cmd must be a null terminated string before passing to add_win_cmd_modifiers + ex_cmd[0] = '\0'; + + len = add_win_cmd_modifiers(ex_cmd, &cmdmod, &multi_mods); + assert(len < sizeof(ex_cmd)); + int result = snprintf(ex_cmd + len, sizeof(ex_cmd) - len, " new"); + assert(result > 0); + len += (size_t)result; + } else { + int result = snprintf(ex_cmd, sizeof(ex_cmd), "enew%s", eap->forceit ? "!" : ""); + assert(result > 0); + len += (size_t)result; + } + + assert(len < sizeof(ex_cmd)); if (*eap->arg != NUL) { // Run {cmd} in 'shell'. char *name = vim_strsave_escaped(eap->arg, "\"\\"); - snprintf(ex_cmd, sizeof(ex_cmd), - ":enew%s | call termopen(\"%s\")", - eap->forceit ? "!" : "", name); + snprintf(ex_cmd + len, sizeof(ex_cmd) - len, + " | call termopen(\"%s\")", name); xfree(name); } else { // No {cmd}: run the job with tokenized 'shell'. if (*p_sh == NUL) { @@ -7327,9 +7346,8 @@ static void ex_terminal(exarg_T *eap) } shell_free_argv(argv); - snprintf(ex_cmd, sizeof(ex_cmd), - ":enew%s | call termopen([%s])", - eap->forceit ? "!" : "", shell_argv + 1); + snprintf(ex_cmd + len, sizeof(ex_cmd) - len, + " | call termopen([%s])", shell_argv + 1); } do_cmdline_cmd(ex_cmd); |