aboutsummaryrefslogtreecommitdiff
path: root/vis.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2015-11-28 16:18:53 +0100
committerMarc André Tanner <mat@brain-dump.org>2015-11-28 20:09:14 +0100
commitde9fa14094e1a97769af014d4c23aabfab145d87 (patch)
tree0d19cc46456d993f86d4bf2a59a3f2810b055d89 /vis.c
parentb09c2afba792282de34ed8865fd2a4ca53a48d9d (diff)
downloadvis-de9fa14094e1a97769af014d4c23aabfab145d87.tar.gz
vis-de9fa14094e1a97769af014d4c23aabfab145d87.tar.xz
vis: add cmd argument to VIS_OP_FILTER
Diffstat (limited to 'vis.c')
-rw-r--r--vis.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/vis.c b/vis.c
index 73e6ba3..1ab6e4e 100644
--- a/vis.c
+++ b/vis.c
@@ -670,8 +670,13 @@ static void action_do(Vis *vis, Action *a) {
} else if (a->op == &ops[VIS_OP_REPLACE]) {
vis_mode_switch(vis, VIS_MODE_REPLACE);
} else if (a->op == &ops[VIS_OP_FILTER]) {
- vis_prompt_show(vis, ":", "'<,'>!");
- vis_mode_switch(vis, VIS_MODE_PROMPT);
+ if (a->arg.s) {
+ if (vis_cmd(vis, a->arg.s))
+ vis_mode_switch(vis, VIS_MODE_NORMAL);
+ } else {
+ vis_prompt_show(vis, ":", "'<,'>!");
+ vis_mode_switch(vis, VIS_MODE_PROMPT);
+ }
} else if (vis->mode == &vis_modes[VIS_MODE_OPERATOR]) {
mode_set(vis, vis->mode_prev);
} else if (vis->mode->visual) {
@@ -993,7 +998,10 @@ int vis_run(Vis *vis, int argc, char *argv[]) {
return vis->exit_status;
}
-bool vis_operator(Vis *vis, enum VisOperator id) {
+bool vis_operator(Vis *vis, enum VisOperator id, ...) {
+ va_list ap;
+ va_start(ap, id);
+
switch (id) {
case VIS_OP_CASE_LOWER:
case VIS_OP_CASE_UPPER:
@@ -1015,17 +1023,18 @@ bool vis_operator(Vis *vis, enum VisOperator id) {
break;
case VIS_OP_FILTER:
vis->action.type = LINEWISE;
+ vis->action.arg.s = va_arg(ap, char*);
break;
default:
break;
}
if (id >= LENGTH(ops))
- return false;
+ goto err;
Operator *op = &ops[id];
if (vis->mode->visual) {
vis->action.op = op;
action_do(vis, &vis->action);
- return true;
+ goto out;
}
/* switch to operator mode inorder to make operator options and
@@ -1044,7 +1053,12 @@ bool vis_operator(Vis *vis, enum VisOperator id) {
if (id == VIS_OP_PUT_AFTER)
vis_motion(vis, VIS_MOVE_NOP);
+out:
+ va_end(ap);
return true;
+err:
+ va_end(ap);
+ return false;
}
void vis_mode_switch(Vis *vis, enum VisMode mode) {