aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-09-25 10:57:01 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-09-25 11:53:12 +0200
commitc3bbd835fca0ba184f191b270d9aebfc2466be82 (patch)
tree956502573e1e83d7bf39ec04c11cb8c1131a413c /main.c
parentd3798ba58d3f8ebef9a024c8d538d7bebb0b6931 (diff)
downloadvis-c3bbd835fca0ba184f191b270d9aebfc2466be82.tar.gz
vis-c3bbd835fca0ba184f191b270d9aebfc2466be82.tar.xz
vis: move file name and word completion logic to a shell script
The shell script should be reviewed for quoting issues, currently it allows command injections as in: $ vis-complete "'; rm -f some-file; echo " However it is intended for interactive usage and from within vis it is only ever called with a valid completion prefix. The file name completion logic now supports nested directories. Close #347
Diffstat (limited to 'main.c')
-rw-r--r--main.c6
1 files changed, 2 insertions, 4 deletions
diff --git a/main.c b/main.c
index 485478e..b0b932d 100644
--- a/main.c
+++ b/main.c
@@ -2131,8 +2131,7 @@ static const char *complete_word(Vis *vis, const char *keys, const Arg *arg) {
Buffer cmd;
buffer_init(&cmd);
char *prefix = get_completion_prefix(vis);
- if (prefix && buffer_printf(&cmd, "tr -cs '[:alnum:]_' '\n' | grep '^%s.' | sort -u | "
- VIS_MENU " -b | sed 's/^%s//' | tr -d '\n'", prefix, prefix)) {
+ if (prefix && buffer_printf(&cmd, VIS_COMPLETE " --word '%s'", prefix)) {
Filerange all = text_range_new(0, text_size(txt));
insert_dialog_selection(vis, &all, (const char*[]){ buffer_content0(&cmd), NULL });
}
@@ -2145,8 +2144,7 @@ static const char *complete_filename(Vis *vis, const char *keys, const Arg *arg)
Buffer cmd;
buffer_init(&cmd);
char *prefix = get_completion_prefix(vis);
- if (prefix && buffer_printf(&cmd, "ls -1 | grep '^%s.' | sort | "
- VIS_MENU " -b | sed 's/^%s//' | tr -d '\n'", prefix, prefix)) {
+ if (prefix && buffer_printf(&cmd, VIS_COMPLETE " --file '%s'", prefix)) {
Filerange empty = text_range_new(0, 0);
insert_dialog_selection(vis, &empty, (const char*[]){ buffer_content0(&cmd), NULL });
}