From 32a467f472aedfce2701f99abc5eca786a306083 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Fri, 15 Jan 2021 15:42:56 -0500 Subject: Automatically pipe hilex ANSI output to PAGER --- bin/hilex.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'bin/hilex.c') diff --git a/bin/hilex.c b/bin/hilex.c index 4ce86450..133336bb 100644 --- a/bin/hilex.c +++ b/bin/hilex.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -94,6 +95,43 @@ enum Option { typedef void Header(const char *opts[]); typedef void Output(const char *opts[], enum Class class, const char *text); +static bool tty; +static void ansiHeader(const char *opts[]) { + (void)opts; + if (!(tty = isatty(STDOUT_FILENO))) return; + const char *shell = getenv("SHELL"); + const char *pager = getenv("PAGER"); + if (!shell) shell = "/bin/sh"; + if (!pager) pager = "less"; + setenv("LESS", "FRX", 0); + + int rw[2]; + int error = pipe(rw); + if (error) err(EX_OSERR, "pipe"); + + pid_t pid = fork(); + if (pid < 0) err(EX_OSERR, "fork"); + if (!pid) { + dup2(rw[0], STDIN_FILENO); + close(rw[0]); + close(rw[1]); + execl(shell, shell, "-c", pager, NULL); + err(EX_CONFIG, "%s", shell); + } + dup2(rw[1], STDOUT_FILENO); + close(rw[0]); + close(rw[1]); + setlinebuf(stdout); +} + +static void ansiFooter(const char *opts[]) { + (void)opts; + if (!tty) return; + int status; + fclose(stdout); + wait(&status); +} + static const char *SGR[ClassCap] = { [Keyword] = "37", [Macro] = "32", @@ -250,7 +288,7 @@ static const struct Formatter { Output *format; Header *footer; } Formatters[] = { - { "ansi", NULL, ansiFormat, NULL }, + { "ansi", ansiHeader, ansiFormat, ansiFooter }, { "debug", NULL, debugFormat, NULL }, { "html", htmlHeader, htmlFormat, htmlFooter }, { "irc", ircHeader, ircFormat, NULL }, -- cgit 1.4.1