diff options
-rw-r--r-- | adapter/protocol/man.nim | 24 | ||||
-rw-r--r-- | doc/mancha.1 | 17 |
2 files changed, 32 insertions, 9 deletions
diff --git a/adapter/protocol/man.nim b/adapter/protocol/man.nim index e35abde7..17f44dea 100644 --- a/adapter/protocol/man.nim +++ b/adapter/protocol/man.nim @@ -220,9 +220,9 @@ proc processManpage(file: File; header: string) = discard file.pclose() proc doMan(man, keyword, section: string) = - let sectionOpt = if section == "": "" else: " -s " & section - let cmd = "GROFF_NO_SGR=1 MAN_KEEP_FORMATTING=1 " & - man & sectionOpt & " " & keyword & " 2>&1" + let sectionOpt = if section == "": "" else: ' ' & section + let cmd = "MANCOLOR=1 GROFF_NO_SGR=1 MAN_KEEP_FORMATTING=1 " & + man & sectionOpt & ' ' & keyword & " 2>&1" let file = popen(cstring(cmd), "r") if file == nil: stdout.write("Cha-Control: ConnectionError 1 failed to run " & cmd) @@ -236,8 +236,10 @@ proc doMan(man, keyword, section: string) = <pre>""") proc doLocal(man, path: string) = - let cmd = "GROFF_NO_SGR=1 MAN_KEEP_FORMATTING=1 " & - man & " -l " & path & " 2>&1" + # Note: we intentionally do not use -l, because it is not supported on + # various systems (at the very least FreeBSD, NetBSD). + let cmd = "MANCOLOR=1 GROFF_NO_SGR=1 MAN_KEEP_FORMATTING=1 " & + man & ' ' & path & " 2>&1" let file = popen(cstring(cmd), "r") if file == nil: stdout.write("Cha-Control: ConnectionError 1 failed to run " & cmd) @@ -304,6 +306,16 @@ proc main() = man = s break notfound man = "/usr/bin/env man" + var apropos = getEnv("MANCHA_APROPOS") + if apropos == "": + # on most systems, man is compatible with apropos (using -s syntax for + # specifying sections). + # ...not on FreeBSD :( here we have -S and MANSECT for specifying man + # sections, and both are silently ignored when searching with -k. hooray. + when not defined(freebsd): + apropos = man + else: + apropos = "/usr/bin/apropos" # this is where it should be. let path = getEnv("MAPPED_URI_PATH") let scheme = getEnv("MAPPED_URI_SCHEME") if scheme == "man": @@ -311,7 +323,7 @@ proc main() = doMan(man, keyword, section) elif scheme == "man-k": let (keyword, section) = parseSection(path) - doKeyword(man, keyword, section) + doKeyword(apropos, keyword, section) elif scheme == "man-l": doLocal(man, path) else: diff --git a/doc/mancha.1 b/doc/mancha.1 index 5a5dae4f..0485479b 100644 --- a/doc/mancha.1 +++ b/doc/mancha.1 @@ -18,8 +18,8 @@ mancha - view manual pages via cha(1) to the \fBw3mman\fR(1) utility. \fBmancha\fR will call \fBcha\fR(1) with the appropriate \fIman:\fR, -\fIman-k:\fR or \fIman-l:\fR URLs. The protocol adapter then opens the man page -and injects markup into it, e.g. man page references are converted into +\fIman\-k:\fR or \fIman\-l:\fR URLs. The protocol adapter then opens the man +page and injects markup into it, e.g. man page references are converted into \fIman:\fR links. .SH OPTIONS @@ -41,11 +41,22 @@ Following environment variables are used: .TP .B MANCHA_CHA -If set, the contents of the variable are used instead of \fIcha\fR. +If set, the contents of the variable are used instead of \fIcha\fR. (Note that +the \fIcha\fR command is called through \fBsystem\fR(3), so you do not have to +override it so long as \fIcha\fR is found in your \fBPATH\fR.) .TP .B MANCHA_MAN If set, the contents of the variable are used instead of \fI/usr/bin/man\fR. +.TP +.B MANCHA_APROPOS +If set, the contents of the variable are used instead of \fI/usr/bin/man\fR. + +(This is not a typo; normally (except on FreeBSD), \fBmancha\fR assumes that +\fBman\fR(1) is compatible with \fBapropos\fR(1) and accepts the \fI\-s\fR +parameter. Overriding \fBMANCHA_MAN\fR therefore also overrides the command used +for \fBman\-k\fR, so long as \fBMANCHA_APROPOS\fR is not set.) + .SH SEE ALSO \fBman\fR(1), \fBcha\fR(1), \fBcha-localcgi\fR(5), \fBw3mman\fR(1) |