unify jobstart, termopen, and system interfaces

For any of these functions, if {cmd} is a string, execute
"&shell &shellcmdflag '{cmd}'", or simply {cmd} if it's a list.

In termopen(), if the 'name' option is not supplied, try to guess using
'{cmd}' (string) or {cmd}[0] (list).  Simplify ex_terminal to use the
string form of termopen().

termopen: get name from argument

Convert list_to_argv to tv_to_argv.

Helped-by: Björn Linse <@bfredl>
Helped-by: oni-link <knil.ino@gmail.com>
Helped-by: Thiago de Arruda <@tarruda>
This commit is contained in:
Scott Prager
2015-04-15 13:05:30 -04:00
parent 74aef89720
commit 1eb3396922
8 changed files with 139 additions and 96 deletions

View File

@@ -9410,23 +9410,19 @@ static void ex_folddo(exarg_T *eap)
static void ex_terminal(exarg_T *eap)
{
char *name = NULL;
char cmd[512];
if (strcmp((char *)eap->arg, "") == 0) {
snprintf(cmd, sizeof(cmd), "['%s']", (char *)p_sh);
name = (char *)p_sh;
} else {
// Escape quotes and slashes so they get sent literally.
// We will call termopen() with ['shell'] if not given a {cmd}.
char *name = (char *)p_sh;
char *lquote = "['";
char *rquote = "']";
if (*eap->arg != NUL) {
name = (char *)vim_strsave_escaped(eap->arg, (char_u *)"\"\\");
snprintf(cmd, sizeof(cmd), "['%s','%s',\"%s\"]",
(char *)p_sh, (char *)p_shcf, name);
lquote = rquote = "\"";
}
char ex_cmd[512];
snprintf(ex_cmd, sizeof(ex_cmd),
":enew%s | call termopen(%s, {'name':\"%s\"}) | startinsert",
eap->forceit==TRUE ? "!" : "", cmd, name);
":enew%s | call termopen(%s%s%s) | startinsert",
eap->forceit==TRUE ? "!" : "", lquote, name, rquote);
do_cmdline_cmd((uint8_t *)ex_cmd);
if (name != (char *)p_sh) {