aboutsummaryrefslogtreecommitdiff
path: root/vis.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-05-18 12:31:33 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-05-18 15:07:02 +0200
commit0d1152340ccb3c6a0a8b4160fda34cc6687b236e (patch)
tree054c0110c76227e8aae96e1fec3a5a2a37aa9e99 /vis.c
parentffe11d4cd4a4c81395b3272706cf696b93710c61 (diff)
downloadvis-0d1152340ccb3c6a0a8b4160fda34cc6687b236e.tar.gz
vis-0d1152340ccb3c6a0a8b4160fda34cc6687b236e.tar.xz
vis: add an interactive mode to vis_pipe{,_collect}(...)
Previously the interactive mode was implicitly enabled by passing an invalid range. However for some use cases (e.g. completion) we need to be able to pipe a given text range to an external process without also redirecting stderr (which is used to draw the slmenu interface on top of vis).
Diffstat (limited to 'vis.c')
-rw-r--r--vis.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/vis.c b/vis.c
index e367291..f35c50b 100644
--- a/vis.c
+++ b/vis.c
@@ -1161,20 +1161,18 @@ Regex *vis_regex(Vis *vis, const char *pattern) {
return regex;
}
-int vis_pipe(Vis *vis, Filerange *range, const char *argv[],
+int vis_pipe(Vis *vis, Filerange *range, bool interactive, const char *argv[],
void *stdout_context, ssize_t (*read_stdout)(void *stdout_context, char *data, size_t len),
void *stderr_context, ssize_t (*read_stderr)(void *stderr_context, char *data, size_t len)) {
/* if an invalid range was given, stdin (i.e. key board input) is passed
* through the external command. */
Text *text = vis->win->file->text;
- View *view = vis->win->view;
int pin[2], pout[2], perr[2], status = -1;
- bool interactive = !text_range_valid(range);
- size_t pos = view_cursor_get(view);
- Filerange rout = *range;
- if (interactive)
- rout = (Filerange){ .start = pos, .end = pos };
+ bool valid_range = text_range_valid(range);
+ if (!valid_range)
+ interactive = true;
+ Filerange rout = valid_range ? *range : text_range_new(0, 0);
if (pipe(pin) == -1)
return -1;
@@ -1205,7 +1203,7 @@ int vis_pipe(Vis *vis, Filerange *range, const char *argv[],
vis_info_show(vis, "fork failure: %s", strerror(errno));
return -1;
} else if (pid == 0) { /* child i.e filter */
- if (!interactive)
+ if (!interactive || valid_range)
dup2(pin[0], STDIN_FILENO);
close(pin[0]);
close(pin[1]);
@@ -1330,11 +1328,11 @@ static ssize_t read_buffer(void *context, char *data, size_t len) {
return len;
}
-int vis_pipe_collect(Vis *vis, Filerange *range, const char *argv[], char **out, char **err) {
+int vis_pipe_collect(Vis *vis, Filerange *range, bool interactive, const char *argv[], char **out, char **err) {
Buffer bufout, buferr;
buffer_init(&bufout);
buffer_init(&buferr);
- int status = vis_pipe(vis, range, argv, &bufout, read_buffer, &buferr, read_buffer);
+ int status = vis_pipe(vis, range, interactive, argv, &bufout, read_buffer, &buferr, read_buffer);
buffer_terminate(&bufout);
buffer_terminate(&buferr);
if (out)