Man Pages 本身很棒,问题在于 Man Page 阅读器

2025-04-09 #documentation #man #unix TLDR: Man Pages 支持链接,但 Man Page 阅读器既不显示也不允许跟随这些链接。

人们经常批评 Man Pages “彼此之间没有链接” 和 “如果我把窗口调窄,它们不会自动换行”。这些都是完全合理的抱怨,但事实是 Man Pages 实际上支持这些特性:只是我们用来阅读 Man Pages 的程序没有实现它们。

格式

[permalink]

Man Pages 以 mdoc(7) 格式和传统的 man(7) 格式1 存储。 这些文件的实际格式不是世界上最容易阅读的,但绝对不比 XML 或 JSON 糟糕。 mdoc 具有纯语义标记。一个 mdoc Man Page 的一部分看起来像下面这样2:

.Sh NAME
.Nm openrc
.Nd stops and starts services for the specified runlevel
.Sh SYNOPSIS

在这种情况下,.Sh.Nm.Nd 是宏,它们将后面的文本分别标记为 “节标题”、“文档名称” 和 “文档描述”。如果你尝试手动读取或编辑这些文件,你需要查阅 macro overview

引用 ("链接")

[permalink]

有两个宏特别值得关注:

这两个宏都可以渲染为链接。 事实上,当 mdoc(7) 页面被转换为 HTML 时,这两个宏都会被转换为实际的链接。 上面链接的两个 Man Page 都包含了这方面的例子。 .Sh (section header) 宏渲染为一个锚点,因此链接可以直接指向它。

具有讽刺意味的是,mdoc(7) 的文档在浏览器上以 HTML 格式显示时会渲染链接,但在终端中通过 man(1) 命令显示时则不会。

结论

[permalink]

我们需要更好的 Man Page 阅读器。 能够让我们将引用作为链接来追踪的阅读器。

目前,man(1) 格式化 Man Page 并将其通过管道传递给 less(1)。 我们无法轻易地在此处添加对链接的支持:我们需要一个能够原生理解 Man Pages 的 pager。

顺便说一句,我们还可以在终端窗口变窄时重新排列文本。

  1. 当我在这里说 “传统” 时,我是认真的。 man(7) 的文档表明它从 1979 年使用到 1989 年,而 mdoc(7) 首次出现在 20 世纪 90 年代初,在 4.4BSD 中。 ↩︎
  2. 此示例是从 OpenRC’s man pages 复制粘贴的。 有关完整的示例和许可详细信息,请参阅存储库。 ↩︎