Como posso procurar texto em negrito ou sublinhado?

3

Como posso pesquisar por texto em negrito ou sublinhado? Isso costuma ser útil para pesquisar palavras-chave, que geralmente são destacadas como tal. Por exemplo, neste trecho de bash(1) :

Eupossoquererpesquisarporreadoutimeout,masprocurarapenasissomedarádezenasderesultadosinúteis,queeutereiparanpassado.Existemalguns"truques" que você pode usar para reduzir isso (por exemplo, pesquisando por <Space>read<Space> ou read \[ ), mas isso nem sempre funciona para todas as páginas de manual ou palavras-chave.

Note que não estou particularmente ligado a less como tal; usando um pager diferente é bom. less é o pager padrão.

    
por Martin Tournoij 22.03.2016 / 21:04

5 respostas

4

Não há uma maneira limpa que eu conheça.

Você pode desativar o tratamento especial de backspaces que less usa para exibir sublinhado / negrito e usar espaciais de escape para pesquisar a sequência desejada:

  1. Abra menos (por exemplo, man less )
  2. Desativar ESPÉCIE INTERIOR (tipo -U<Enter> )
  3. Digite sua string de pesquisa, usando <C-v> para escapar dos caracteres de retrocesso.

Para textos sublinhados, por exemplo, você pode digitar

/_<C-v><C-h>l_<C-v><C-h>e_<C-v><C-h>s_<C-v><C-h>s<Enter>

... para procurar a palavra sublinhada "menos".

Para negrito, você pode digitar

/l<C-v><C-h>le<C-v><C-h>es<C-v><C-h>ss<C-v><C-h>s<Enter>

... para procurar a palavra em negrito "menos".

Como eu disse, não há uma maneira limpa .

EDITAR: Como Stephane aponta nos comentários, você pode usar um ponto (que corresponde a qualquer caractere) em vez de um literal <C-h> , o que torna a digitação mais fácil.

/l.le.es.ss.s

para procurar negrito e

/_.l_.e_.s_.s

para procurar sublinhado.

Você ainda precisa desativar o UNDERLINE-SPECIAL primeiro, o que torna o texto sublinhado / negrito pouco legível.

    
por 22.03.2016 / 21:20
3

Use o Vim como MANPAGER . Com algum uso criativo de ocultar e iskeyword , isso pode ser feito:

setlocal nowrap
setlocal conceallevel=3
setlocal concealcursor=nvic
exe "setlocal iskeyword+=\b,_"
syntax match BACKHIDE '.\b' conceal contained
syntax match BOLD '\(.\)\b' contains=BACKHIDE
syntax match Underlined '_\b.' contains=BACKHIDE
highlight BOLD cterm=bold

ComooBackspace,etc.,aindaestálá,umapesquisapelapalavraqueusa*corresponderáapenasapalavrasdestacadasdamesmaforma:

Observecomoonegritomanéencontrado,masonormalmannalinhaatualnãoé.

Com mais algumas configurações (plugue sem vergonha), o Vim fornece um pager confortável para man e melhor que less .

Para que o Vim aplique as configurações relevantes, eis o que faço:

  1. Em um local adequado para variáveis de ambiente, MANPAGER='vim -' .
  2. Em ~/.vim/vimrc , tenha um mínimo de:

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

    Para um comando iniciado por man usando MANPAGER , o nome da página de manual é fornecido na variável de ambiente MAN_PN . Podemos aproveitar isso para detectar quando o Vim está sendo usado como MANPAGER e para descobrir o nome do manpage.

  3. Em ~/.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>
    

    As opções criam um buffer zero somente leitura e não modificável (veja Como um buffer temporário é criado? no Vim Wikia ), desabilitando arquivos de troca. Em seguida, aplica as configurações listadas no início deste post e adiciona alguns mapeamentos por conveniência - q fechará a página de manual atual e Barra de Espaço moverá uma página para baixo, como em less .

  4. Em ~/.vim/after/syntax/man.vim :

    syntax match BACKHIDE '.\b' conceal contained
    syntax match BOLD '\(.\)\b' contains=BACKHIDE
    syntax match Underlined '_\b.' contains=BACKHIDE
    highlight BOLD cterm=bold
    

    Estes são os comandos de sintaxe e destaque do início da postagem.

Com apenas estas configurações mínimas:

Observecomoalinhasuperiorédestacada-opróprioViméfornecidocomalgunsrealcesdesintaxedemanpage,quevocêpodeverseremoveuosbackspaces(usandocol-b-x,porexemplo).Noentanto,vocêperdemuitomaisdoqueganhaassim,jáqueoVimnãotemcomosabertudoquepossatersidosublinhadoounegrito.

Minhasconfiguraçõespessoaisusam o esquema de cores molokai , set number , o plug-in de companhia aérea e um realce diferente para BOLD :

highlight link BOLD Constant

E como tenho a transparência ativada nas configurações do terminal (não visível na captura de tela), as cores são mais suaves e mais agradáveis do que as vistas aqui.

Se você ativar números de linha ( :set number ) como eu, defina MANWIDTH como um valor menor que COLUMNS , para que você não tenha que rolar para os lados para ver o texto inteiro. MANWIDTH=75 funciona bem para terminais de 80 colunas. Eu uso um terminal drop-down tão largo quanto a tela (160-240 colunas, dependendo da resolução), então um MANWIDTH=80 fixo funciona bem para mim.

    
por 24.03.2016 / 11:07
3

less -U torna o texto bastante ilegível. Uma alternativa poderia ser pré-processar o texto para usar caracteres combinados unicode para implementar negrito e sublinhado. Por exemplo, usando U + 0332 para sublinhado e negrito, representado como um sublinhado duplo com U + 0333.

Você pode criar um script upager como:

#! /bin/bash -
ul=$'\u0332' bold=$'\u0333' bs=$'\b'
sed "s/\(.\)$bs/$bold/g;s/_$bs\(.\)/$ul/g" | less

Então:

export MANPAGER=upager

man bash renderizaria como:

   r̳e̳a̳d̳  [-̳e̳r̳s̳]  [-̳a̳  a̲n̲a̲m̲e̲] [-̳d̳ d̲e̲l̲i̲m̲] [-̳i̳ t̲e̲x̲t̲] [-̳n̳ n̲c̲h̲a̲r̲s̲]
   [-̳N̳ n̲c̲h̲a̲r̲s̲] [-̳p̳ p̲r̲o̲m̲p̲t̲] [-̳t̳ t̲i̲m̲e̲o̲u̲t̲] [-̳u̳ f̲d̲] [n̲a̲m̲e̲ ...]
          One line is read from the standard input,  or  from
          the  file  descriptor f̲d̲ supplied as an argument to

E você pode procurar um read em negrito ou sublinhado com /r.e.a.d , por exemplo.

Nem todos os emuladores de terminal parecem renderizar esses caracteres corretamente. Eu achei konsole deu os melhores resultados até agora.

Uma abordagem diferente e talvez melhor que também funcione em xterm poderia ser manter a formatação do roff mas postfixar cada caractere negrito ou sublinhado com um caractere invisível. Dessa forma, você pode pesquisar por um% normalread com /read e um negrito / sublinhado read com /r.e.a.d , como acima, enquanto a formatação não é afetada.

Caracteres invisíveis como U + 200B o espaço com largura zero são processados por less como <U+200B> , portanto, não são uma opção. Um personagem que parece funcionar é U + 034F, o Combinando Grapheme Joiner . Esse é um caractere de combinação e é invisível e geralmente não tem efeito, pelo menos, no texto em inglês.

Você pode fazer um% pag_de% pager como:

#! /bin/bash -
cgj=$'\u34f' bs=$'\b'
sed "s/.$bs./&$cgj/g" | less

(e gcjpager ).

    
por 22.03.2016 / 22:29
3

Não é uma resposta direta à sua pergunta, mas para encontrar mais facilmente a documentação em um manual grande como bash , você pode tentar estas alternativas:

Usando um formato diferente, como info

O manual bash como o manual da maioria dos softwares GNU está escrito em texinfo, do qual vários formatos são derivados (man, info, pdf, html ...).

Uma página man é chamada de página por um motivo. É apenas um arquivo de texto simples onde a única estruturação é feita via formatação de fonte (recuo, negrito, sublinhado, letras maiúsculas).

Para um manual deste tamanho, você prefere um livro a uma página .

Enquanto man implementa o paradigma page , info implementa o paradigma book . Tem conceitos de capítulo / seções, tabela de conteúdo, referências e índice, todos pesquisáveis com conclusão.

Em um livro sobre o bash, para aprender sobre o read builtin, você consultaria o índice. Em info , digite i e, em seguida, insira read (conclusão disponível), que o levará diretamente à documentação do read builtin (use , para ir para a próxima entrada de índice que contém% código%). Você também pode iniciar read como info .

Em um livro, se você quiser ver a seção sobre builtins, verifique o índice novamente ou consulte o índice. Mesmo em info bash read com info e i .

Pesquise na web

HTML é outro formato de hipertexto (note que g é anterior à web e HTML) bem ajustado para manuais maiores. Os navegadores da Web geralmente só podem pesquisar em uma única página por vez, o que não é tão bom quanto info , mas, se você estiver on-line, pode usar mecanismos de pesquisa como duckduckgo ou google para pesquisar manuais.

bash read builtin site:gnu.org

provavelmente levaria você até a seção que contém a documentação de info . Ou você pode usar o índice: link

página de manual de pesquisa com base em outra formatação

Em vez de pesquisar texto em negrito / sublinhado que não seja fácil de fazer com pagers man atuais, você também pode tentar:

  • pesquise read no início da linha: read
  • também como uma palavra inteira: /^\s*read
  • você também pode usar o fato de que cabeçalhos de seção são menos recuados, para obter uma forma de índice.

    No /^\s*read\>/ pager, isso pode ser feito com most para ocultar o texto indentado, 1:od para ocultar o texto recuado por pelo menos 4 colunas.

    Com 4:od , você pode fazer o mesmo com less e &^\S , o que mostraria algo como:

    [...]
    RESERVED WORDS
    SHELL GRAMMAR
       Simple Commands
       Pipelines
       Lists
       Compound Commands
       Coprocesses
       Shell Function Definitions
    COMMENTS
    QUOTING
    [...]
    

    e permitir que você navegue mais facilmente para uma seção de interesse (e, em seguida, insira um &^ {,3}\S vazio para ver o texto completo novamente ou & in :od ).

por 23.03.2016 / 15:51
2

Se você pode vê-lo em negrito ou sublinhado, provavelmente não é possível pesquisá-lo, porque o que você vê é processado .

Por exemplo, se o texto for proveniente de qualquer página de manual formatada, ele será produzido pela interpretação de caracteres excedidos como

  • negrito (quando cada caractere é sobrecarregado pelo retrocesso e repetição) ou
  • sublinhado (quando cada caractere é escrito sobre um caractere sublinhado).

Os less FAQ do pager com comentários que interpretam o negrito / sublinhado . Ele usa atributos de vídeo do terminal para mostrar o negrito / sublinhado real.

No processo de renderização, um paginador típico, como less , finge que apenas contém o texto (as partes em negrito / sublinhado não são texto).

Em um editor de texto, você pode pesquisar os padrões de retrocesso. Talvez algum editor específico (como o emacs) tenha a capacidade de fazer isso, ou seja, procurar texto (enquanto é renderizado como negrito / sublinhado), mas considerando o negrito / sublinhado como um atributo da pesquisa.

Ler backspaces é menos agradável. Aqui está o início da manpage citada na pergunta:

       r^Hre^Hea^Had^Hd [-^H-e^Her^Hrs^Hs] [-^H-a^Ha _^Ha_^Hn_^Ha_^Hm_^He] [-^H>
       _^Hp_^Hr_^Ho_^Hm_^Hp_^Ht] [-^H-t^Ht _^Ht_^Hi_^Hm_^He_^Ho_^Hu_^Ht] [-^H-u>
              One  line  is  read  from  the  standard input, or from the file  
              descriptor _^Hf_^Hd supplied as an argument to the -^H-u^Hu optio>
              first word is assigned to the first _^Hn_^Ha_^Hm_^He, the second >
              second _^Hn_^Ha_^Hm_^He, and so on, with leftover words and their>
              ing  separators  assigned  to the last _^Hn_^Ha_^Hm_^He.  If ther>
              words read from the input stream than names, the remaining names
    
por 22.03.2016 / 21:19

Tags