aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-11-16 22:39:28 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-11-16 22:39:28 +0100
commit4707fed2a21f4836b0eba28135040c3a456c9da9 (patch)
tree7edbe2574c64edc690eeb917609e3d1a493e6158
parent4a6df4bceaf76d4ed727ddf3510d69f65484324c (diff)
downloadvis-4707fed2a21f4836b0eba28135040c3a456c9da9.tar.gz
vis-4707fed2a21f4836b0eba28135040c3a456c9da9.tar.xz
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 `!`.
-rw-r--r--main.c2
-rw-r--r--sam.c12
-rw-r--r--vis.h1
3 files changed, 12 insertions, 3 deletions
diff --git a/main.c b/main.c
index d1c346e..5b61022 100644
--- a/main.c
+++ b/main.c
@@ -1265,6 +1265,8 @@ static const char *key2register(Vis *vis, const char *keys, enum VisRegister *re
*reg = VIS_REG_SEARCH;
else if (keys[0] == ':')
*reg = VIS_REG_COMMAND;
+ else if (keys[0] == '!')
+ *reg = VIS_REG_SHELL;
return keys+1;
}
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;
}
diff --git a/vis.h b/vis.h
index e3d0812..2506c4a 100644
--- a/vis.h
+++ b/vis.h
@@ -398,6 +398,7 @@ enum VisRegister {
VIS_MACRO_REPEAT, /* copy of the above macro once the recording is finished */
VIS_REG_SEARCH, /* last used search pattern "/ */
VIS_REG_COMMAND, /* last used :-command ": */
+ VIS_REG_SHELL, /* last used shell command given to either <, >, |, or ! */
VIS_REG_INVALID, /* has to be the last 'real' register */
VIS_REG_A, VIS_REG_B, VIS_REG_C, VIS_REG_D, VIS_REG_E,
VIS_REG_F, VIS_REG_G, VIS_REG_H, VIS_REG_I, VIS_REG_J,