从上次离开的同一位置打开手册(或信息)页

从上次离开的同一位置打开手册(或信息)页

我认为手册页是有关已安装软件的文档的主要来源。我不仅想将它们用作参考,而且还想从头到尾真正阅读它们。

问题来了。当我关闭手册页时,下次我希望它在我离开的地方打开。是否可以?

理想情况下,它可以使用 less,这是默认的系统寻呼机。但我可以将其更改为任何可以实现这一目的的寻呼机。

例如,独立的 vim 会记住上次读取文件的位置。可能有某种方法可以将其用作寻呼机来记住位置。

请在发表评论/答案之前尝试您的想法。

答案1

这是一个解决方案TXRLisp,使用 Vim 作为查看器。在 Ubuntu 18 上与 Vim 8.0 配合使用。

(请翻译成您最喜欢的语言;这是我的,我自己做的。)

该文件被调用mnpgr.tl并位于某个位置/path/to/mnpgr.tl

#!/usr/bin/env txr

(defvarl home-dir (getenv "HOME"))

(defvarl mnpgr-dir (path-cat home-dir ".mnpgr-dir"))

(defvarl vim-commands
         (join-with "|"
                    '("hi def link CtrlHUnderline Special"
                      "hi def link CtrlHBold Keyword"
                      "set syntax=ctrlh"
                      "syntax match CtrlHHide /.\\b/  contained conceal"
                      "set conceallevel=2"
                      "set concealcursor=nc"
                      "map q :q!\r")))

(ensure-dir mnpgr-dir)

(match @(or `@page(@section)`     ;; for "man whatever"
            `@page\\.@section`)   ;; for "man -l file.1"
       (getenv "MAN_PN")
  (with-resources ((rendered-file (path-cat mnpgr-dir `@page.@section`)
                                  (remove-path rendered-file)))
    (with-stream (s (open-file rendered-file "w"))
      (whilet ((line (get-line)))
        (put-line line s)))
    (sh `vim +'@{vim-commands}' '@{rendered-file}' < /dev/tty`)))

我们使用以下命令将其安装为手册页程序:

export MANPAGER=/path/to/mnpgr.tl

笔记:

  1. 该程序使用您$HOME调用的.mnpgr-dir.

  2. 它捕获输出man并将其保存到工作目录中的文件中。文件名是根据MAN_PN环境变量计算得出的,该变量为我们提供了手册页和节号。

  3. 我们在该文件上运行 Vim。因为它有一个稳定的名称,Vim 可以记住最后一个位置。

  4. 我们不需要保留该文件,因此将其删除。 (我使用with-resources宏进行范围资源控制。)

  5. 该文件包含^H(退格)重印编码。 Vim 8 有一个 2005 年的语法定义,它提供了一个名为ctrlh.不幸的是,它不太有效。它对重击字符使用Ignore突出显示组,不会被隐藏。我怀疑旧的 Vim 版本可能隐藏了Ignore突出显示组。我们使用+Vim 命令行的功能注入一些命令来选择ctrlh语法并对其进行热补丁以使其表现更好。我们还将粗体和下划线突出显示组重新分配为彩色类别,而不是默认的粗体和下划线。

  6. 我们添加一个map命令以便q退出。这个想法是抄袭自 Vim 的+MANPAGER模式。 (我们不使用它,+MANPAGER因为它要求页面呈现为纯文本,没有退格键,然后强加黑客man语法突出显示,其中所有原始粗体和下划线标记都会丢失。)

错误:

  1. 通过退格重划突出显示的项目不可搜索。这是一件大事,而且可能会成为一个大事件。处理它的一种方法是使用预处理器将项目转换为另一种表示法。例如,带下划线的单词_^Hw_^Ho_^Hr_^Hd可以转换为^word^.适当的语法突出显示定义将隐藏下划线并对单词进行着色,使单词可搜索。这正是 Vim 手册中突出显示的单词的工作原理。

  2. 如果您使用 重新加载手册页:e %,则会丢失语法的热补丁ctrlh,因此您会看到所有退格键以及^H过度打印的字符。为了更好的解决方案,我们应该定义自己的语法突出显示定义文件类型和语法,例如mnpgr,并将其用作文件的后缀。

  3. 不会区分与同名冲突的手册页。如果您有时使用以下命令查看手册页man -l <file>,并且您的系统在/usr/share/man.例如,假设您在系统和您查看的树中克隆了 GNU Bash 的源代码man -l bash.1。假设您也使用man bash(谁不使用)。这两个都映射到渲染的文件~/.mnpgr-dir/bash.1

  4. sh使用函数,就像Csystem()中的一样;存在潜在的逃避问题。如果vim-commandsrendered-file要包含单引号,则会破坏围绕它们的单引号。


这现在是一个迷你项目谁的家在这里

它有自己的Vim语法定义文件mnpgr.vim。该程序解析退格重击并生成自己的符号,由 处理mnpgr.vim

答案2

如果会话不必在重新启动后继续存在,则可以仅使用 POSIX 作业控制。使用 Ctrl-Z将man作业置于后台,然后使用 返回fg

$ jobs
[1]   Stopped                 man gcc
[2]-  Stopped                 man bash
[3]+  Stopped                 info make

如果我想继续阅读我上次停下来的 Bash 手册页,只需

$ fg %2

答案3

您可以将手册页格式化为 PDF 并使用您最喜欢的 PDF 查看器阅读它们。这样做的另一个好处是让您看到实际的排版,而不是局限于字符单元终端模拟器的功能。

举个例子,格罗夫自己的手册页格式为单个 383 页文档

如果你有一堆未压缩的男人(7) 和/或文档(7) 文件方便,试试格罗夫1.23.0 以获得最佳结果。

groff -Rpet -mandoc -Tpdf page.1 page.2 page.3 ...

但您也可以使用以下命令轻松查看各个手册页文档男人, 当然。

zcat -f $(man -w groff_man) | man -l -Tpdf - >| groff_man.pdf

上述用途人数据库2.9.4 为其男人执行。

相关内容