根据终端尺寸变化动态重新格式化手册页

根据终端尺寸变化动态重新格式化手册页

我的一个常见工作流程是在终端中打开手册页,然后在另一个终端中打开测试内容。手册页的格式设置为第一个终端的初始尺寸。现在,当我调整窗口大小(或者让 WM 自动为我执行此操作)时,预格式化页面的右侧会出现间隙,或者换行。此时我通常会q(uit) 和!!(再次运行),这会丢失我在页面中的位置。

我认为格式化过程非常消耗 CPU 资源,或者可能源于古代固定终端大小的过程。寻呼机less动态地对终端调整大小事件做出反应,因此理论上应该是可能的。

我尝试仔细阅读手册页、搜索网络、在 IRC 上询问——所有这些——但什么也没得到。

  • 我可以从 man 实用程序内部或外部触发重新格式化吗?

  • 是否有一个版本的 man 实用程序可以动态调整页面大小?

  • 有没有办法自定义格式化/显示过程的某些部分以使其更新SIGWINCH

答案1

基本问题是格式化是由一个程序完成的,而分页是由另一个程序完成的。即使格式化程序收到窗口大小已更改的信号并根据新的窗口大小重新格式化文本,它所能做的就是将新文本沿着管道传送到寻呼机。分页器无法确定新流中的哪个位置与其当前显示的旧流中的位置相对应。

您需要的是寻呼机能够重新格式化。正如 @Robin Green 所说,这就是 HTML。

如果您想使用 HTML 但仍然在终端中工作,您可以告诉man(1)以 HTML 输出并调用文本模式浏览器来显示它。

man -Hlynx man

这将man(1)在 lynx 文本模式浏览器中显示联机帮助页。 Lynx 不会直接响应窗口大小更改,但您可以按 ctrl-R,lynx 会根据新的窗口大小重新渲染页面。

据我所知,还有另外两种文本模式浏览器:links 和 elinks。您可以对这些和 lynx 进行试验,并确定哪一个可以为您提供浏览手册页的最佳体验。您可能希望仅对手册页使用自定义配置,并调用一个脚本来调用具有该特定配置的浏览器。

您可以将您喜欢的 man 选项放入MANOPT环境变量中。

$ export MANOPT=-Hlynx
$ export MANOPT=-Hmanlynx # provide your own wrapper to execute
                          # lynx with a different configuration.

您需要安装该groff软件包才能man生成 HTML。

答案2

使用合适的脚本将手册页即时转换为 html,例如服务员,在网络浏览器中查看它们(当然可以是基于文本的网络浏览器,如 lynx)。

这大概就是为什么没有人解决这个问题的原因 - 因为这个问题与 man->html 脚本的开发无关。

相关内容