From 743625d0a2ab57f1df38ea2dd5d5822e3ab95d38 Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Fri, 22 Aug 2014 04:52:55 +0000 Subject: implement MANPAGER and PAGER --- apropos.1 | 16 ++++++++++++++-- main.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++----------- mandoc.1 | 17 ++++++++++++++++- 3 files changed, 79 insertions(+), 14 deletions(-) diff --git a/apropos.1 b/apropos.1 index e1756039..b08afa38 100644 --- a/apropos.1 +++ b/apropos.1 @@ -1,4 +1,4 @@ -.\" $Id: apropos.1,v 1.32 2014/08/22 03:42:18 schwarze Exp $ +.\" $Id: apropos.1,v 1.33 2014/08/22 04:52:55 schwarze Exp $ .\" .\" Copyright (c) 2011, 2012 Kristaps Dzonsons .\" Copyright (c) 2011, 2012, 2014 Ingo Schwarze @@ -318,7 +318,12 @@ Text production: .It Li \&Dx Ta Dx No version reference .El .Sh ENVIRONMENT -.Bl -tag -width MANPATH +.Bl -tag -width MANPAGER +.It Ev MANPAGER +Any non-empty value of the environment variable +.Ev MANPAGER +will be used instead of the standard pagination program, +.Xr more 1 . .It Ev MANPATH The standard search path used by .Xr man 1 @@ -336,6 +341,13 @@ or if it contains two adjacent colons, the standard search path is inserted between the colons. If none of these conditions are met, it overrides the standard search path. +.It Ev PAGER +Specifies the pagination program to use when +.Ev MANPAGER +is not defined. +If neither PAGER nor MANPAGER is defined, +.Pa /usr/bin/more Fl s +will be used. .El .Sh FILES .Bl -tag -width "/etc/man.conf" -compact diff --git a/main.c b/main.c index 924eddd3..adf3d0ff 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.183 2014/08/22 03:42:18 schwarze Exp $ */ +/* $Id: main.c,v 1.184 2014/08/22 04:52:55 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010, 2011, 2012, 2014 Ingo Schwarze @@ -637,7 +637,12 @@ mmsg(enum mandocerr t, enum mandoclevel lvl, static void spawn_pager(void) { - int fildes[2]; +#define MAX_PAGER_ARGS 16 + char *argv[MAX_PAGER_ARGS]; + const char *pager; + char *cp; + int fildes[2]; + int argc; if (pipe(fildes) == -1) { fprintf(stderr, "%s: pipe: %s\n", @@ -659,15 +664,48 @@ spawn_pager(void) } return; default: - close(fildes[1]); - if (dup2(fildes[0], STDIN_FILENO) == -1) { - fprintf(stderr, "%s: dup input: %s\n", - progname, strerror(errno)); - } else { - execlp("more", "more", "-s", NULL); - fprintf(stderr, "%s: exec: %s\n", - progname, strerror(errno)); - } + break; + } + + /* The original process becomes the pager. */ + + close(fildes[1]); + if (dup2(fildes[0], STDIN_FILENO) == -1) { + fprintf(stderr, "%s: dup input: %s\n", + progname, strerror(errno)); exit((int)MANDOCLEVEL_SYSERR); } + + pager = getenv("MANPAGER"); + if (pager == NULL || *pager == '\0') + pager = getenv("PAGER"); + if (pager == NULL || *pager == '\0') + pager = "/usr/bin/more -s"; + cp = mandoc_strdup(pager); + + /* + * Parse the pager command into words. + * Intentionally do not do anything fancy here. + */ + + argc = 0; + while (argc + 1 < MAX_PAGER_ARGS) { + argv[argc++] = cp; + cp = strchr(cp, ' '); + if (cp == NULL) + break; + *cp++ = '\0'; + while (*cp == ' ') + cp++; + if (*cp == '\0') + break; + } + argv[argc] = NULL; + + /* Hand over to the pager. */ + + execvp(argv[0], argv); + fprintf(stderr, "%s: exec: %s\n", + progname, strerror(errno)); + exit((int)MANDOCLEVEL_SYSERR); } diff --git a/mandoc.1 b/mandoc.1 index a9e4a67d..1ec1a754 100644 --- a/mandoc.1 +++ b/mandoc.1 @@ -1,4 +1,4 @@ -.\" $Id: mandoc.1,v 1.107 2014/08/22 03:42:18 schwarze Exp $ +.\" $Id: mandoc.1,v 1.108 2014/08/22 04:52:55 schwarze Exp $ .\" .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons .\" Copyright (c) 2012, 2014 Ingo Schwarze @@ -440,6 +440,21 @@ 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 +Any non-empty value of the environment variable +.Ev MANPAGER +will be used instead of the standard pagination program, +.Xr more 1 . +.It Ev PAGER +Specifies the pagination program to use when +.Ev MANPAGER +is not defined. +If neither PAGER nor MANPAGER is defined, +.Pa /usr/bin/more Fl s +will be used. +.El .Sh EXIT STATUS The .Nm -- cgit v1.2.3