aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2018-11-22 11:30:23 +0000
committerIngo Schwarze <schwarze@openbsd.org>2018-11-22 11:30:23 +0000
commit8653551cb202b50a668483cb155c4c8272808ae8 (patch)
tree68b96cfc6b1fe47c01660e8da7930c6cb832b808
parent059327df544eda5a4e78c14f33c6e503ff784296 (diff)
downloadmandoc-8653551cb202b50a668483cb155c4c8272808ae8.tar.gz
mandoc-8653551cb202b50a668483cb155c4c8272808ae8.tar.zst
mandoc-8653551cb202b50a668483cb155c4c8272808ae8.zip
In -T locale (the default), -T ascii, and -T utf8 mode, provide a new
output option -O tag[=term] to move right to the definition of "term" when opening the manual page in a pager, effectively porting the -T html fragment name feature - https://man.openbsd.org/ksh#ulimit - to the terminal. Try: $ man -O tag uvm_sysctl $ man -O tag=ulimit ksh $ man -O tag 3 compress Feature development triggered by a question from kn@. Klemens also tested, provided feedback that resulted in improvements, and provided an OK.
-rw-r--r--main.c22
-rw-r--r--man.113
-rw-r--r--manconf.h5
-rw-r--r--mandoc.116
-rw-r--r--manpath.c21
-rw-r--r--tag.c10
-rw-r--r--tag.h3
7 files changed, 69 insertions, 21 deletions
diff --git a/main.c b/main.c
index cad22750..d98c89ab 100644
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/* $Id: main.c,v 1.308 2018/08/23 19:33:27 schwarze Exp $ */
+/* $Id: main.c,v 1.309 2018/11/22 11:30:23 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2012, 2014-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -518,8 +518,13 @@ main(int argc, char *argv[])
fd = mparse_open(curp.mp, resp != NULL ? resp->file : *argv);
if (fd != -1) {
if (use_pager) {
- tag_files = tag_init();
use_pager = 0;
+ tag_files = tag_init();
+ if (conf.output.tag != NULL &&
+ tag_files->tagname == NULL)
+ tag_files->tagname =
+ *conf.output.tag != '\0' ?
+ conf.output.tag : *argv;
}
if (resp == NULL)
@@ -1180,7 +1185,7 @@ spawn_pager(struct tag_files *tag_files)
const char *pager;
char *cp;
size_t cmdlen;
- int argc;
+ int argc, use_ofn;
pid_t pager_pid;
pager = getenv("MANPAGER");
@@ -1196,7 +1201,7 @@ spawn_pager(struct tag_files *tag_files)
*/
argc = 0;
- while (argc + 4 < MAX_PAGER_ARGS) {
+ while (argc + 5 < MAX_PAGER_ARGS) {
argv[argc++] = cp;
cp = strchr(cp, ' ');
if (cp == NULL)
@@ -1210,14 +1215,21 @@ spawn_pager(struct tag_files *tag_files)
/* For less(1), use the tag file. */
+ use_ofn = 1;
if ((cmdlen = strlen(argv[0])) >= 4) {
cp = argv[0] + cmdlen - 4;
if (strcmp(cp, "less") == 0) {
argv[argc++] = mandoc_strdup("-T");
argv[argc++] = tag_files->tfn;
+ if (tag_files->tagname != NULL) {
+ argv[argc++] = mandoc_strdup("-t");
+ argv[argc++] = tag_files->tagname;
+ use_ofn = 0;
+ }
}
}
- argv[argc++] = tag_files->ofn;
+ if (use_ofn)
+ argv[argc++] = tag_files->ofn;
argv[argc] = NULL;
switch (pager_pid = fork()) {
diff --git a/man.1 b/man.1
index cf03693e..5eae0e2e 100644
--- a/man.1
+++ b/man.1
@@ -1,9 +1,9 @@
-.\" $Id: man.1,v 1.33 2018/04/19 23:41:16 schwarze Exp $
+.\" $Id: man.1,v 1.34 2018/11/22 11:30:23 schwarze Exp $
.\"
.\" Copyright (c) 1989, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
.\" Copyright (c) 2003, 2007, 2008, 2014 Jason McIntyre <jmc@openbsd.org>
-.\" Copyright (c) 2010, 2011, 2014-2017 Ingo Schwarze <schwarze@openbsd.org>
+.\" Copyright (c) 2010, 2011, 2014-2018 Ingo Schwarze <schwarze@openbsd.org>
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
@@ -31,7 +31,7 @@
.\"
.\" @(#)man.1 8.2 (Berkeley) 1/2/94
.\"
-.Dd $Mdocdate: April 19 2018 $
+.Dd $Mdocdate: November 22 2018 $
.Dt MAN 1
.Os
.Sh NAME
@@ -266,6 +266,13 @@ and
can be used to move to the next and to the previous place providing
information about the term last searched for with
.Ic :t .
+The
+.Fl O Cm tag Ns Op = Ns Ar term
+option documented in the
+.Xr mandoc 1
+manual opens a manual page at the definition of a specific
+.Ar term
+rather than at the beginning.
.It Ev MANPATH
The standard search path used by
.Nm
diff --git a/manconf.h b/manconf.h
index babd463b..bb376199 100644
--- a/manconf.h
+++ b/manconf.h
@@ -1,6 +1,6 @@
-/* $Id: manconf.h,v 1.6 2018/10/02 14:56:47 schwarze Exp $ */
+/* $Id: manconf.h,v 1.7 2018/11/22 11:30:23 schwarze Exp $ */
/*
- * Copyright (c) 2011, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011, 2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -30,6 +30,7 @@ struct manoutput {
char *man;
char *paper;
char *style;
+ char *tag;
size_t indent;
size_t width;
int fragment;
diff --git a/mandoc.1 b/mandoc.1
index cd84be76..24000357 100644
--- a/mandoc.1
+++ b/mandoc.1
@@ -1,4 +1,4 @@
-.\" $Id: mandoc.1,v 1.230 2018/10/02 14:56:47 schwarze Exp $
+.\" $Id: mandoc.1,v 1.231 2018/11/22 11:30:23 schwarze Exp $
.\"
.\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
.\" Copyright (c) 2012, 2014-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: October 2 2018 $
+.Dd $Mdocdate: November 22 2018 $
.Dt MANDOC 1
.Os
.Sh NAME
@@ -290,6 +290,18 @@ One useful application is for checking that
output formats in the same way as the
.Xr mdoc 7
source it was generated from.
+.It Cm tag Ns Op = Ns Ar term
+If the formatted manual page is opened in a pager,
+go to the definition of the
+.Ar term
+rather than showing the manual page from the beginning.
+If no
+.Ar term
+is specified, reuse the first command line argument that is not a
+.Ar section
+number.
+This is useful when it is the name of a manual page,
+in particular the name of a library function.
.It Cm width Ns = Ns Ar width
The output width is set to
.Ar width
diff --git a/manpath.c b/manpath.c
index f6cf704f..74f38a95 100644
--- a/manpath.c
+++ b/manpath.c
@@ -1,4 +1,4 @@
-/* $Id: manpath.c,v 1.36 2018/10/02 14:56:47 schwarze Exp $ */
+/* $Id: manpath.c,v 1.37 2018/11/22 11:30:23 schwarze Exp $ */
/*
* Copyright (c) 2011,2014,2015,2017,2018 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -232,8 +232,8 @@ int
manconf_output(struct manoutput *conf, const char *cp, int fromfile)
{
const char *const toks[] = {
- "includes", "man", "paper", "style",
- "indent", "width", "fragment", "mdoc", "noval", "toc"
+ "includes", "man", "paper", "style", "indent", "width",
+ "tag", "fragment", "mdoc", "noval", "toc"
};
const char *errstr;
@@ -257,7 +257,7 @@ manconf_output(struct manoutput *conf, const char *cp, int fromfile)
warnx("-O %s=?: Missing argument value", toks[tok]);
return -1;
}
- if ((tok == 6 || tok == 7) && *cp != '\0') {
+ if (tok > 6 && *cp != '\0') {
warnx("-O %s: Does not take a value: %s", toks[tok], cp);
return -1;
}
@@ -312,15 +312,22 @@ manconf_output(struct manoutput *conf, const char *cp, int fromfile)
warnx("-O width=%s is %s", cp, errstr);
return -1;
case 6:
- conf->fragment = 1;
+ if (conf->tag != NULL) {
+ oldval = mandoc_strdup(conf->tag);
+ break;
+ }
+ conf->tag = mandoc_strdup(cp);
return 0;
case 7:
- conf->mdoc = 1;
+ conf->fragment = 1;
return 0;
case 8:
- conf->noval = 1;
+ conf->mdoc = 1;
return 0;
case 9:
+ conf->noval = 1;
+ return 0;
+ case 10:
conf->toc = 1;
return 0;
default:
diff --git a/tag.c b/tag.c
index 823f2045..473ea7b6 100644
--- a/tag.c
+++ b/tag.c
@@ -1,4 +1,4 @@
-/* $Id: tag.c,v 1.20 2018/10/23 20:42:37 schwarze Exp $ */
+/* $Id: tag.c,v 1.21 2018/11/22 11:30:23 schwarze Exp $ */
/*
* Copyright (c) 2015, 2016, 2018 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -18,6 +18,9 @@
#include <sys/types.h>
+#if HAVE_ERR
+#include <err.h>
+#endif
#include <limits.h>
#include <signal.h>
#include <stddef.h>
@@ -216,6 +219,11 @@ tag_write(void)
if (tag_files.tfd <= 0)
return;
+ if (tag_files.tagname != NULL && ohash_find(&tag_data,
+ ohash_qlookup(&tag_data, tag_files.tagname)) == NULL) {
+ warnx("%s: no such tag", tag_files.tagname);
+ tag_files.tagname = NULL;
+ }
stream = fdopen(tag_files.tfd, "w");
entry = ohash_first(&tag_data, &slot);
while (entry != NULL) {
diff --git a/tag.h b/tag.h
index ab1388d7..bbd40b73 100644
--- a/tag.h
+++ b/tag.h
@@ -1,4 +1,4 @@
-/* $Id: tag.h,v 1.7 2015/11/20 21:59:54 schwarze Exp $ */
+/* $Id: tag.h,v 1.8 2018/11/22 11:30:23 schwarze Exp $ */
/*
* Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -18,6 +18,7 @@
struct tag_files {
char ofn[20];
char tfn[20];
+ char *tagname;
int ofd;
int tfd;
pid_t tcpgid;