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:
| M | vis.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) {