vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit 8fba3d231e631df4576bffa03a291094eb33b3d9 parent 7f0f85b67033207cb4533f7ac48f2c674b02db26 Author: Marc André Tanner <mat@brain-dump.org> Date: Mon, 27 Feb 2017 13:27:18 +0100 vis: allow useage of file dialog for :read command Fix #505 Diffstat:
| M | sam.c | | | 13 | ------------- |
| M | vis-cmds.c | | | 18 | ++++++++++++++++++ |
2 files changed, 18 insertions(+), 13 deletions(-)
diff --git 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 @@ -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)