aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-02-27 13:27:18 +0100
committerMarc André Tanner <mat@brain-dump.org>2017-02-27 14:28:11 +0100
commitda859e4c5d97d3ac38587f5d5ea5ea013b6f3808 (patch)
tree26220f318f4709d0d386ae8ae07cefe70bafd071
parent5628a44fded9c8fd2288a357f8fdc6605eec27ee (diff)
downloadvis-da859e4c5d97d3ac38587f5d5ea5ea013b6f3808.tar.gz
vis-da859e4c5d97d3ac38587f5d5ea5ea013b6f3808.tar.xz
vis: allow useage of file dialog for :read command
Fix #505
-rw-r--r--sam.c13
-rw-r--r--vis-cmds.c18
2 files changed, 18 insertions, 13 deletions
diff --git a/sam.c b/sam.c
index 5747aa4..a8472db 100644
--- a/sam.c
+++ b/sam.c
@@ -1557,19 +1557,6 @@ static bool cmd_write(Vis *vis, Win *win, Command *cmd, const char *argv[], Curs
return true;
}
-static bool cmd_read(Vis *vis, Win *win, Command *cmd, const char *argv[], Cursor *cur, Filerange *range) {
- if (!argv[1]) {
- vis_info_show(vis, "Filename expected");
- return false;
- }
-
- const char *args[MAX_ARGV] = { argv[0], "cat", "--" };
- for (int i = 3; i < MAX_ARGV-2; i++)
- args[i] = argv[i-2];
- args[MAX_ARGV-1] = NULL;
- return cmd_pipein(vis, win, cmd, (const char**)args, cur, range);
-}
-
static ssize_t read_buffer(void *context, char *data, size_t len) {
buffer_append(context, data, len);
return len;
diff --git a/vis-cmds.c b/vis-cmds.c
index 43d2fed..f0aba72 100644
--- a/vis-cmds.c
+++ b/vis-cmds.c
@@ -410,6 +410,24 @@ static bool cmd_edit(Vis *vis, Win *win, Command *cmd, const char *argv[], Curso
return vis->win != oldwin;
}
+static bool cmd_read(Vis *vis, Win *win, Command *cmd, const char *argv[], Cursor *cur, Filerange *range) {
+ bool ret = false;
+ const size_t first_file = 3;
+ const char *args[MAX_ARGV] = { argv[0], "cat", "--" };
+ const char **name = argv[1] ? &argv[1] : (const char*[]){ ".", NULL };
+ for (size_t i = first_file; *name && i < LENGTH(args)-1; name++, i++) {
+ const char *file = file_open_dialog(vis, *name);
+ if (!file || !(args[i] = strdup(file)))
+ goto err;
+ }
+ args[LENGTH(args)-1] = NULL;
+ ret = cmd_pipein(vis, win, cmd, args, cur, range);
+err:
+ for (size_t i = first_file; i < LENGTH(args); i++)
+ free((char*)args[i]);
+ return ret;
+}
+
static bool has_windows(Vis *vis) {
for (Win *win = vis->windows; win; win = win->next) {
if (!win->file->internal)