diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-02-27 13:27:18 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-02-27 14:28:11 +0100 |
| commit | da859e4c5d97d3ac38587f5d5ea5ea013b6f3808 (patch) | |
| tree | 26220f318f4709d0d386ae8ae07cefe70bafd071 | |
| parent | 5628a44fded9c8fd2288a357f8fdc6605eec27ee (diff) | |
| download | vis-da859e4c5d97d3ac38587f5d5ea5ea013b6f3808.tar.gz vis-da859e4c5d97d3ac38587f5d5ea5ea013b6f3808.tar.xz | |
vis: allow useage of file dialog for :read command
Fix #505
| -rw-r--r-- | sam.c | 13 | ||||
| -rw-r--r-- | vis-cmds.c | 18 |
2 files changed, 18 insertions, 13 deletions
@@ -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; @@ -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) |
