From 4707fed2a21f4836b0eba28135040c3a456c9da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Wed, 16 Nov 2016 22:39:28 +0100 Subject: sam: use default shell command for <, >, | and ! when applicaple If the shell command is omitted, the last shell command (of any type) is substituted. The most recently used shell command is stored in a new register currently named `!`. --- sam.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'sam.c') diff --git a/sam.c b/sam.c index b52a5ee..2c6152c 100644 --- a/sam.c +++ b/sam.c @@ -492,9 +492,15 @@ static char *parse_text(const char **s) { return buf.data; } -static char *parse_shellcmd(const char **s) { +static char *parse_shellcmd(Vis *vis, const char **s) { skip_spaces(s); - return parse_until(s, "\n", NULL, false); + char *cmd = parse_until(s, "\n", NULL, false); + if (!cmd) { + const char *last_cmd = register_get(vis, &vis->registers[VIS_REG_SHELL], NULL); + return last_cmd ? strdup(last_cmd) : NULL; + } + register_put0(vis, &vis->registers[VIS_REG_SHELL], cmd); + return cmd; } static void parse_argv(const char **s, const char *argv[], size_t maxarg) { @@ -746,7 +752,7 @@ static Command *command_parse(Vis *vis, const char **s, int level, enum SamError } } - if (cmddef->flags & CMD_SHELL && !(cmd->argv[1] = parse_shellcmd(s))) { + if (cmddef->flags & CMD_SHELL && !(cmd->argv[1] = parse_shellcmd(vis, s))) { *err = SAM_ERR_SHELL; goto fail; } -- cgit v1.2.3