vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit a22794b402334e99a245c3565bcc17bc653c308c
parent 1886bbac3fb4897dff79198ee501f558ccadc876
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Wed, 17 May 2017 10:07:24 +0200

vis: ensure complete ! command output is displayed

For interactive processes started using `:!` stdout is redirected
to stderr normally used by vis to draw its user interface.
For some reason the first byte written by the interactive application
is not being displayed. I suspect it has something to do with the
terminal state change. For now we are writing a dummy space (which
is never shown) ourself to ensure that the complete output is visible.

Fix #545

Diffstat:
Mvis.c | 14+++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/vis.c b/vis.c @@ -1734,12 +1734,20 @@ int vis_pipe(Vis *vis, File *file, Filerange *range, const char *argv[], dup2(pin[0], STDIN_FILENO); close(pin[0]); close(pin[1]); - if (interactive) + if (interactive) { dup2(STDERR_FILENO, STDOUT_FILENO); - else if (read_stdout) + /* For some reason the first byte written by the + * interactive application is not being displayed. + * It probably has something to do with the terminal + * state change. By writing a dummy byte ourself we + * ensure that the complete output is visible. + */ + write(STDOUT_FILENO, " ", 1); + } else if (read_stdout) { dup2(pout[1], STDOUT_FILENO); - else + } else { dup2(null, STDOUT_FILENO); + } close(pout[1]); close(pout[0]); if (!interactive) {