如何搜索粗体或带下划线的文本?

Mar*_*oij 5 less man

如何搜索粗体或带下划线的文本?这对于搜索经常被突出显示的关键字通常很有用。例如,在此摘录中bash(1)

在此处输入图片说明

我可能想搜索reador timeout,但只搜索那个会给我几十个我将不得不n过去的无用结果。您可以使用一些“技巧”来减少这种情况(例如搜索<Space>read<Space>read \[),但这并不总是适用于每个联机帮助页或关键字。

请注意,我并不是特别喜欢less这样;使用不同的寻呼机很好。less恰好是默认寻呼机。

mur*_*uru 5

使用 Vim 作为MANPAGER. 通过一些创造性地使用hideiskeyword,可以做到这一点:

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

由于退格键等仍然存在,因此使用 using 搜索单词*将仅匹配类似突出显示的单词:

在此输入图像描述

man请注意如何找到粗体,但man当前行中的法线却没有找到。

通过一些更多的设置(无耻的插件),Vim 为 提供了一个舒适的寻呼机man,并且比 更好less

为了让 Vim 应用相关设置,我会这样做:

  1. 在环境变量合适的地方,MANPAGER='vim -'.
  2. 在 中~/.vim/vimrc,至少有:

    set nocompatible
    filetype plugin on
    syntax on
    
    if !empty($MAN_PN)
        autocmd StdinReadPost * set ft=man | file $MAN_PN
    endif
    
    Run Code Online (Sandbox Code Playgroud)

    man对于使用启动的命令MANPAGER,环境变量中提供了联机帮助页名称MAN_PN。我们可以利用这一点来检测 Vim 何时被用作MANPAGER以及查找联机帮助页名称。

  3. ~/.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>
    
    Run Code Online (Sandbox Code Playgroud)

    这些选项创建一个只读的、不可修改的暂存缓冲区(请参阅Vim Wikia 中的暂存缓冲区是如何创建的?),禁用交换文件。然后,它应用本文开头列出的设置,并为了方便起见添加一些映射 -q将关闭当前的联机帮助页,并将Spacebar向下移动一页,如 中所示less

  4. ~/.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
    
    Run Code Online (Sandbox Code Playgroud)

    这些是本文开头的语法和突出显示命令。

只需这些最低设置:

在此输入图像描述

请注意顶行是如何突出显示的 - Vim 本身附带了一些手册页语法突出显示,如果删除了退格键(使用col -b -x例如使用 ),您可以看到它。然而,通过这种方式你失去的比你得到的要多得多,因为 Vim 无法知道所有可能被下划线或粗体显示的内容。

我自己的个人设置使用molokai colorchemeset number航空公司插件以及不同的突出显示BOLD

highlight link BOLD Constant
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

而且因为我在终端设置中启用了透明度(在屏幕截图中不可见),所以颜色比此处看到的更柔和、更令人愉悦。

:set number如果您像我一样启用行号 ( ),请设置MANWIDTH为小于的值,COLUMNS这样您就不必横向滚动才能看到整个文本。MANWIDTH=75适用于 80 列终端。我使用与屏幕一样宽的下拉终端(160-240 列,具体取决于分辨率),因此固定终端MANWIDTH=80对我来说效果很好。

  • 那太棒了!非常感谢您的努力。(这不应该是 `~/.vim/after/syntax/man.vim` 吗?)我想一个缺点是,如果你搜索 `/man`,你只能看到未格式化的内容。也许添加可以是一个键绑定,用于在类似“col -b”的文本处理版本中搜索文本。 (2认同)

Tho*_*key 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。如果有>
              从输入流中读取的单词比名称,剩余的名称