* Let mandoc pipe to less? [not found] ` <20110925111746.GA14018@lain.home> @ 2011-09-25 18:02 ` Ingo Schwarze 2011-09-25 18:26 ` Joerg Sonnenberger [not found] ` <20110927182436.GA33163@lorvorc.mips.inka.de> 0 siblings, 2 replies; 5+ messages in thread From: Ingo Schwarze @ 2011-09-25 18:02 UTC (permalink / raw) To: discuss; +Cc: espie, naddy Hi, espie@ just brought up the idea to automatically pipe mandoc output to less(1) if output is a tty. My first, instinctive reaction was "ugh, i don't want no magic". But trying to find cases where this might get into the way, i couldn't at first come up with any. I'm not yet convinced there are indeed none. This could also solve naddy@'s old wish to get rid of the notorious 2>&1 | less dance after -Tlint. Do we want this? Maybe i'm even slightly in favour, but not yet really sure. Yours, Ingo Index: main.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/main.c,v retrieving revision 1.78 diff -u -p -r1.78 main.c --- main.c 17 Sep 2011 14:45:22 -0000 1.78 +++ main.c 25 Sep 2011 17:58:25 -0000 @@ -17,6 +17,7 @@ */ #include <assert.h> +#include <err.h> #include <stdio.h> #include <stdint.h> #include <stdlib.h> @@ -57,6 +58,7 @@ struct curparse { char outopts[BUFSIZ]; /* buf of output opts */ }; +static void fork_pager(int); static int moptions(enum mparset *, char *); static void mmsg(enum mandocerr, enum mandoclevel, const char *, int, int, const char *); @@ -72,7 +74,7 @@ static const char *progname; int main(int argc, char *argv[]) { - int c; + int c, fd; struct curparse curp; enum mparset type; enum mandoclevel rc; @@ -116,6 +118,10 @@ main(int argc, char *argv[]) /* NOTREACHED */ } + fd = OUTT_LINT == curp.outtype ? STDERR_FILENO : STDOUT_FILENO; + if (isatty(fd)) + fork_pager(fd); + curp.mp = mparse_alloc(type, curp.wlevel, mmsg, &curp); argc -= optind; @@ -382,4 +388,54 @@ mmsg(enum mandocerr t, enum mandoclevel fprintf(stderr, ": %s", msg); fputc('\n', stderr); +} + +static void +fork_pager(int std_fd) +{ + char *pager; + int fildes[2]; + + if (-1 == pipe(fildes)) { + warn("pipe"); + return; + } + switch (fork()) { + case (-1): + warn("fork"); + return; + case (0): /* The child process stays mandoc. */ + close(fildes[0]); + if (-1 == dup2(fildes[1], std_fd)) + err(1, "dup2 in the formatter"); + /* No return here, or we might get double output. */ + close(fildes[1]); + return; + default: + break; + } + /* + * The parent process becomes the pager. + * In case of communication problems, + * it does the work itself, by simply returning. + */ + close(fildes[1]); + if (-1 == dup2(fildes[0], STDIN_FILENO)) { + warn("dup2 in the pager"); + return; + } + close(fildes[0]); + do { + pager = getenv("MANPAGER"); + if (NULL != pager && '\0' != *pager) + break; + pager = getenv("PAGER"); + if (NULL != pager && '\0' != *pager) + break; + pager = "/usr/bin/less"; + } while (0); + execl(pager, "mandoc [pager]", NULL); + warn("execl: %s", pager); + close(STDIN_FILENO); + return; } Index: mandoc.1 =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mandoc.1,v retrieving revision 1.47 diff -u -p -r1.47 mandoc.1 --- mandoc.1 18 Sep 2011 10:25:28 -0000 1.47 +++ mandoc.1 25 Sep 2011 17:58:25 -0000 @@ -108,6 +108,18 @@ text from stdin, implying and produces .Fl T Ns Cm ascii output. +If the output is connected to a terminal, it is automatically piped to the +pager selected by the +.Ev MANPAGER +environment variable, or by +.Ev PAGER +if the former is undefined or empty, or to +.Pa /usr/bin/less +by default. +If the +.Fl T Ns Cm lint +output mode is selected, the standard error output is piped in place +of the standard output. .Ss Input Formats The .Nm @@ -363,6 +375,16 @@ See .Sx HTML Output for details; beyond generating XHTML tags instead of HTML tags, these output modes are identical. +.Sh ENVIRONMENT +.Bl -tag -width MANPAGER +.It Ev MANPAGER +The full path to the pager utility. +.It Ev PAGER +The same if +.Ev MANPAGER +is undefined or empty; defaults to +.Pa /usr/bin/less . +.El .Sh EXIT STATUS The .Nm -- To unsubscribe send an email to discuss+unsubscribe@mdocml.bsd.lv ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Let mandoc pipe to less? 2011-09-25 18:02 ` Let mandoc pipe to less? Ingo Schwarze @ 2011-09-25 18:26 ` Joerg Sonnenberger 2011-09-26 23:06 ` Kristaps Dzonsons [not found] ` <20110927182436.GA33163@lorvorc.mips.inka.de> 1 sibling, 1 reply; 5+ messages in thread From: Joerg Sonnenberger @ 2011-09-25 18:26 UTC (permalink / raw) To: discuss; +Cc: espie, naddy On Sun, Sep 25, 2011 at 08:02:27PM +0200, Ingo Schwarze wrote: > espie@ just brought up the idea to automatically pipe mandoc > output to less(1) if output is a tty. In general, I dislike programs doing that. *cough* git *cough* I think this behavior belongs into man(1) or similar frontends. > This could also solve naddy@'s old wish to get rid of the notorious > 2>&1 | less dance after -Tlint. The bigger question here is whether the output should actually go to stderr in first place. It's the expected output for the tool after all. Joerg -- To unsubscribe send an email to discuss+unsubscribe@mdocml.bsd.lv ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Let mandoc pipe to less? 2011-09-25 18:26 ` Joerg Sonnenberger @ 2011-09-26 23:06 ` Kristaps Dzonsons 2011-09-27 5:14 ` Joerg Sonnenberger 0 siblings, 1 reply; 5+ messages in thread From: Kristaps Dzonsons @ 2011-09-26 23:06 UTC (permalink / raw) To: discuss; +Cc: Joerg Sonnenberger, espie, naddy >> espie@ just brought up the idea to automatically pipe mandoc >> output to less(1) if output is a tty. > > In general, I dislike programs doing that. *cough* git *cough* > I think this behavior belongs into man(1) or similar frontends. > >> This could also solve naddy@'s old wish to get rid of the notorious >> 2>&1 | less dance after -Tlint. > > The bigger question here is whether the output should actually go to > stderr in first place. It's the expected output for the tool after all. Hi, Bref, I don't like the pipe to less (or more or whatever). Not only does it break expected behaviour, it also breaks portability (mandoc is portable to "others") and with nroff. I also don't like magic: utilities doing Different Things depending on output confuse me. The -Tlint thing is a different story. At first I thought (Ingo will recognise this behaviour) No Way In Hell. But (1) mdoclint in regress pushes to stdout; (2) lint itself pushes to stdout; and (3) there's no real notion of portability/compat so we can do what works best for us. So basically I'm fine with sticking a dup2 in there if people think it will save time and effort. Thoughts? Do-its? Kristaps -- To unsubscribe send an email to discuss+unsubscribe@mdocml.bsd.lv ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Let mandoc pipe to less? 2011-09-26 23:06 ` Kristaps Dzonsons @ 2011-09-27 5:14 ` Joerg Sonnenberger 0 siblings, 0 replies; 5+ messages in thread From: Joerg Sonnenberger @ 2011-09-27 5:14 UTC (permalink / raw) To: Kristaps Dzonsons; +Cc: discuss, espie, naddy On Tue, Sep 27, 2011 at 01:06:32AM +0200, Kristaps Dzonsons wrote: > The -Tlint thing is a different story. At first I thought (Ingo > will recognise this behaviour) No Way In Hell. But (1) mdoclint in > regress pushes to stdout; (2) lint itself pushes to stdout; and (3) > there's no real notion of portability/compat so we can do what works > best for us. So basically I'm fine with sticking a dup2 in there if > people think it will save time and effort. ...or do some refactoring and replace stderr with errout and just reassign the variable? Joerg -- To unsubscribe send an email to discuss+unsubscribe@mdocml.bsd.lv ^ permalink raw reply [flat|nested] 5+ messages in thread
[parent not found: <20110927182436.GA33163@lorvorc.mips.inka.de>]
* Re: Let mandoc pipe to less? [not found] ` <20110927182436.GA33163@lorvorc.mips.inka.de> @ 2011-09-27 20:00 ` Ingo Schwarze 0 siblings, 0 replies; 5+ messages in thread From: Ingo Schwarze @ 2011-09-27 20:00 UTC (permalink / raw) To: discuss; +Cc: naddy, espie Hi, Christian Weisgerber wrote on Tue, Sep 27, 2011 at 08:24:36PM +0200: > Ingo Schwarze: >> espie@ just brought up the idea to automatically pipe mandoc >> output to less(1) if output is a tty. > FWIW, I dislike this. Unix commands don't behave like this. That's true, yes. So, nobody likes my patch, i guess i'm dopping it. By the way, i did find a case where it causes serious screwup. Apply the patch, build and install mandoc, and then do this: cd /usr/src/bin/ make cleandir make obj make depend make You get to press "q" multiple times to exit less. Ooops. So now you need to type make | cat Useful useless use of cat, very ugly no doubt. >> This could also solve naddy@'s old wish to get rid of the notorious >> 2>&1 | less dance after -Tlint. > That's a separate issue. Although the thought of -Tlint output > going to stderr and completely by-passing an automatically spawned > $PAGER highlights how mistaken linting to stderr is in the first > place. Hmm, quite a few people seem to agree on that. Probably we should make mandoc/main.c, mmsg() output - that is, parser warnings and errors - go to stdout in case of -Tlint, but leave other error output (like usage(), [mtw]options() "Bad argument", stat(2) errors, open(2) errors, read(2) errors, malloc(3) errors) on stderr - that's easy because all parser errors go through mmsg() but none of the system errors do, but instead use fprintf(3) or perror(3) directly. Yours, Ingo -- To unsubscribe send an email to discuss+unsubscribe@mdocml.bsd.lv ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-09-27 20:00 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <20110921122358.1e15e3f2@greg.bestnet.kharkov.ua> [not found] ` <4E7BD897.5020403@Leviacomm.net> [not found] ` <CAOS-L3iOOY_2nBA5tdv-xVo92rKK7=spNBBz4Qo__6op+CJdJg@mail.gmail.com> [not found] ` <CALi5TckNuUDm8+yb967XpeT7rgAbA9YFO=KOgm0HFx6Dghkp+A@mail.gmail.com> [not found] ` <slrnj7pdak.r8j.stu@naiad.spacehopper.org> [not found] ` <CALi5Tcn4M7kYmcx8tpPnC=TVO3tZ14yayOVhf+jrUXxEKZWVKw@mail.gmail.com> [not found] ` <20110925101243.GC4867@iris.usta.de> [not found] ` <20110925111746.GA14018@lain.home> 2011-09-25 18:02 ` Let mandoc pipe to less? Ingo Schwarze 2011-09-25 18:26 ` Joerg Sonnenberger 2011-09-26 23:06 ` Kristaps Dzonsons 2011-09-27 5:14 ` Joerg Sonnenberger [not found] ` <20110927182436.GA33163@lorvorc.mips.inka.de> 2011-09-27 20:00 ` Ingo Schwarze
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).