答案1
使用 Vim 作为MANPAGER
.通过一些创造性的运用隐藏和iskeyword
,可以这样做:
setlocal nowrap
setlocal conceallevel=3
setlocal concealcursor=nvic
exe "setlocal iskeyword+=\b,_"
syntax match BACKHIDE '.\b' conceal contained
syntax match BOLD '\(.\)\b\1' contains=BACKHIDE
syntax match Underlined '_\b.' contains=BACKHIDE
highlight BOLD cterm=bold
由于 Backspace 等键仍然存在,使用搜索单词*
只会匹配类似突出显示的单词:
man
请注意如何找到粗体,但man
当前行中的法线却没有找到。
和更多设置(无耻的插件),Vim 为 提供了一个舒适的寻呼机man
,并且比 更好less
。
为了让 Vim 应用相关设置,我会这样做:
- 在环境变量合适的地方,
MANPAGER='vim -'
. 在 中
~/.vim/vimrc
,至少有:set nocompatible filetype plugin on syntax on if !empty($MAN_PN) autocmd StdinReadPost * set ft=man | file $MAN_PN endif
man
对于使用启动的命令MANPAGER
,环境变量中提供了联机帮助页名称MAN_PN
。我们可以利用这一点来检测 Vim 何时被用作MANPAGER
以及查找联机帮助页名称。在
~/.vim/ftplugin/man.vim
:setlocal nolist setlocal buftype=nofile setlocal bufhidden=hide setlocal noswapfile setlocal readonly setlocal nomodifiable setlocal nowrap setlocal conceallevel=3 exe "setlocal iskeyword+=\b,_" setlocal concealcursor=nvic nnoremap q :q!<CR> nnoremap <Space> <PageDown>
这些选项创建一个只读的、不可修改的暂存缓冲区(请参阅暂存缓冲区是如何创建的?在 Vim 维基百科中),禁用交换文件。然后,它应用本文开头列出的设置,并为了方便起见添加一些映射 -
q
将关闭当前的联机帮助页,并将Spacebar向下移动一页,如 中所示less
。在
~/.vim/after/syntax/man.vim
:syntax match BACKHIDE '.\b' conceal contained syntax match BOLD '\(.\)\b\1' contains=BACKHIDE syntax match Underlined '_\b.' contains=BACKHIDE highlight BOLD cterm=bold
这些是本文开头的语法和突出显示命令。
只需这些最低设置:
请注意顶行是如何突出显示的 - Vim 本身附带了一些联机帮助页语法突出显示,如果您删除了退格键(col -b -x
例如使用 ),您可以看到它。然而,通过这种方式你失去的比你得到的要多得多,因为 Vim 无法知道所有可能被下划线或粗体显示的内容。
我自己的个人设置使用摩洛凯岛配色方案、set number
、航空公司插件,以及 的不同突出显示BOLD
:
highlight link BOLD Constant
而且因为我在终端设置中启用了透明度(在屏幕截图中不可见),所以颜色比此处看到的更柔和、更令人愉悦。
:set number
如果您像我一样启用行号 ( ),请设置MANWIDTH
为小于的值,COLUMNS
这样您就不必横向滚动才能看到整个文本。MANWIDTH=75
适用于 80 列终端。我使用与屏幕一样宽的下拉终端(160-240 列,具体取决于分辨率),因此固定终端MANWIDTH=80
对我来说效果很好。
答案2
据我所知,没有干净的方法。
您可以关闭less
用于显示下划线/粗体的退格键的特殊处理,然后使用转义的退格键来搜索您想要的字符串:
- 少开(例如
man less
) - 关闭 UNDERLINE-SPECIAL(类型
-U<Enter>
) - 输入搜索字符串,使用
<C-v>
退格字符进行转义。
例如,对于带下划线的文本,您可以输入
/_<C-v><C-h>l_<C-v><C-h>e_<C-v><C-h>s_<C-v><C-h>s<Enter>
...搜索带下划线的单词“less”。
对于粗体文本,您可以输入
/l<C-v><C-h>le<C-v><C-h>es<C-v><C-h>ss<C-v><C-h>s<Enter>
...搜索粗体词“less”。
正如我所说,没有干净的方式。
编辑:正如 Stephane 在评论中指出的那样,您可以使用点(匹配任何字符)而不是文字<C-h>
,这使得输入更容易。
/l.le.es.ss.s
搜索粗体,并且
/_.l_.e_.s_.s
搜索带下划线的。
您仍然必须先关闭 UNDERLINE-SPECIAL,这使得下划线/粗体文本不太可读。
答案3
如果您看到它是粗体或带下划线的,那么您可能无法搜索它,因为您看到的是呈现。
例如,如果文本来自任何格式化的联机帮助页,则它是通过将重击字符解释为
- 粗体(当每个字符因退格并重复而被过度敲击时)或
- 下划线(当每个字符都写在下划线字符上时)。
这less
寻呼机常见问题解答评论说解释粗体/下划线。它使用终端视频属性来显示实际的粗体/下划线。
在渲染过程中,典型的寻呼机(例如)less
假装它只保存文本(粗体/下划线部分不是文本)。
在文本编辑器中,您可以搜索退格模式。也许某些特定的编辑器(例如 emacs)有能力做到这一点,即搜索文本(当它呈现为粗体/下划线时),但将粗体/下划线作为搜索的属性考虑在内。
阅读退格键不太令人愉快。这是问题中引用的联机帮助页的开头:
r^Hre^Hea^Had^Hd [-^He^Her^Hrs^Hs] [-^Ha^Ha _^Ha_^Hn_^Ha_^Hm_^He] [-^H> _^Hp_^Hr_^Ho_^Hm_^Hp_^Ht] [-^Ht^Ht _^Ht_^Hi_^Hm_^He_^Ho_^Hu_^Ht] [-^Hu> 从标准输入或文件中读取一行 描述符 _^Hf_^Hd 作为参数提供给 -^Hu^Hu 选项> 第一个单词分配给第一个 _^Hn_^Ha_^Hm_^He,第二个 > 第二个_^Hn_^Ha_^Hm_^He,等等,还有剩下的词和他们的> ing 分隔符分配给最后一个 _^Hn_^Ha_^Hm_^He。如果有> 从输入流中读取的单词比名称,剩余的名称
答案4
不是对您问题的直接回答,但为了更轻松地在像bash
这样的大型手册中找到文档,您可以尝试以下替代方案:
使用不同的格式,例如info
与大多数 GNU 软件的手册一样,该bash
手册也是用 texinfo 编写的,从中衍生出多种格式(man、info、pdf、html...)。
手册页称为页因为某种原因。它只是一个平面文本文件,其中唯一的结构是通过字体格式(缩进、粗体、下划线、全部大写)完成的。
对于这种尺寸的手册,您宁愿需要一个书比一个页。
虽然man
实现了页范例,信息实现了书范例。它具有章节、目录、参考文献和索引的概念,所有这些都可以完成搜索。
在一本关于 bash 的书中,要了解read
内置函数,您需要查看索引。在 中info
,您键入i
,然后输入read
(可完成),这将直接带您进入内置文档的文档read
(用于,
跳转到包含 的下一个索引条目read
)。您也可以从info
开始info bash read
。
在书中,如果您想查看有关内置函数的部分,您可以再次检查索引,或者查看目录。info
与i
和相同g
。
搜索网页
HTML 是另一种超文本格式(请注意,它info
早于网络和 HTML),非常适合大型手册。网络浏览器通常一次只能在一个页面中搜索,这使得它不如info
,但如果您在线,您可以使用duckduckgo或google等搜索引擎来搜索手册。
bash read builtin site:gnu.org
可能会将您带到包含read
.或者您可以使用索引:https://www.gnu.org/software/bash/manual/html_node/Builtin-Index.html#Builtin-Index
根据其他格式搜索手册页
您还可以尝试:
read
在行首搜索:/^\s*read
- 也作为一个完整的词:
/^\s*read\>/
您还可以利用节标题缩进较少的事实来获取目录形式。
在
most
分页器中,可以通过1:od
隐藏缩进的文本、4:od
隐藏缩进至少 4 列的文本来完成。使用,您可以使用和
less
执行相同的操作,这将显示如下内容:&^\S
&^ {,3}\S
[...] RESERVED WORDS SHELL GRAMMAR Simple Commands Pipelines Lists Compound Commands Coprocesses Shell Function Definitions COMMENTS QUOTING [...]
并让您更轻松地导航到感兴趣的部分(然后只需输入一个空白
&
即可再次查看全文,或:od
在 中输入most
)。