web-dev-qa-db-ja.com

太字または下線付きのテキストを検索するにはどうすればよいですか?

太字または下線付きのテキストを検索するにはどうすればよいですか?これは、多くの場合、そのように強調表示されているキーワードを検索するのに役立ちます。たとえば、このbash(1)からの抜粋では次のようになります。

enter image description here

readまたはtimeoutを検索したい場合がありますが、それだけを検索すると、n過去に必要な数十の役に立たない結果が得られます。これを減らすために使用できる「トリック」がいくつかありますが(たとえば、<Space>read<Space>またはread \[の検索)、すべてのマンページまたはキーワードで常に機能するとは限りません。

私はless自体に特に執着していないことに注意してください。別のポケットベルを使用しても問題ありません。 lessはたまたまデフォルトのポケットベルです。

5
Martin Tournoij

VimをMANPAGERとして使用します。 conceal および 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

enter image description here

バックスペースなどがまだ存在するため、*を使用して単語を検索すると、同様に強調表示された単語のみが一致します。

enter image description here

太字の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
    

    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>
    

    オプションは、読み取り専用の変更不可能なスクラッチバッファーを作成し( Vim Wikiaのスクラッチバッファーはどのように作成されますか? を参照)、スワップファイルを無効にします。次に、この投稿の冒頭に記載されている設定を適用し、便宜上いくつかのマッピングを追加します-qは現在のマンページを閉じ、 Spacebarlessのように、1ページ下に移動します。

  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
    

    これらは、投稿の最初からの構文と強調表示コマンドです。

これらの最小設定だけで:

enter image description here

一番上の行がどのように強調表示されているかに注意してください-Vim自体には、バックスペースを削除したかどうかを確認できるマンページ構文の強調表示が付属しています(たとえば、col -b -xを使用)。ただし、Vimには下線が引かれている、または太字になっている可能性のあるすべてのものを知る方法がないため、その方法で得られるよりもはるかに多くを失うことになります。

私自身の個人設定では、 モロカイcolorschemeset number、航空会社のプラグイン、およびBOLDの別の強調表示を使用しています。

highlight link BOLD Constant

enter image description here

また、端末設定で透明度を有効にしているため(スクリーンショットには表示されていません)、色はここで見られるよりも柔らかく、心地よいものになっています。

私のように行番号(:set number)を有効にする場合は、MANWIDTHCOLUMNS未満の値に設定して、テキスト全体を表示するために横にスクロールする必要がないようにします。 MANWIDTH=75は80列の端末でうまく機能します。画面と同じ幅のドロップダウン端末(解像度に応じて160〜240列)を使用しているので、固定のMANWIDTH=80で問題なく動作します。

4
muru

私が知っているきれいな方法はありません。

lessが下線/太字を表示するために使用するバックスペースの特別な処理をオフにしてから、エスケープされたバックスペースを使用して必要な文字列を検索できます。

  1. 開く回数を減らす(例:man less
  2. UNDERLINE-SPECIALをオフにします(タイプ-U<Enter>
  3. <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」という単語を検索します。

私が言ったように、クリーン方法はありません。


EDIT: Stephaneがコメントで指摘しているように、リテラル<C-h>の代わりにドット(任意の文字に一致)を使用すると、入力が簡単になります。

/l.le.es.ss.s

太字で検索するには、

/_.l_.e_.s_.s

下線付きを検索します。

それでも、最初にUNDERLINE-SPECIALをオフにする必要があります。これにより、下線付き/太字のテキストが読みにくくなります。

4
Wildcard

質問に対する直接の答えではありませんが、bashのような大きなマニュアルでドキュメントをより簡単に見つけるには、次の方法を試すことができます。

infoのような別の形式を使用する

ほとんどのGNUソフトウェアのマニュアルのようなbashマニュアルはtexinfoで書かれており、そこからいくつかのフォーマット(man、info、pdf、html ...)が派生しています。

マニュアルページは、理由からページと呼ばれます。これは、フォントの書式設定(インデント、太字、下線、すべて大文字)を介して構造化が行われる1つのフラットテキストファイルです。

このサイズのマニュアルの場合、ページよりもが必要です。 -)。

manpageパラダイムを実装しますが、infoはbookを実装します-)パラダイム。章/セクション、目次、参照、索引の概念があり、すべて完了して検索できます。

Bashに関する本では、readビルトインについて学ぶために、インデックスを調べます。 infoiと入力し、read(完了可能)と入力すると、readビルトインのドキュメントに直接移動します(,を使用) readを含む次のインデックスエントリにジャンプします)。 infoinfo bash readとして開始することもできます。

本の中で、ビルトインに関するセクションを見たい場合は、インデックスをもう一度確認するか、目次を確認します。 infoでもiおよびgと同じです。

ウェブを検索

HTMLは別のハイパーテキスト形式です(infoはWebとHTMLよりも前のものであることに注意してください)。より大きなマニュアルに適しています。 Webブラウザーは通常、一度に1ページしか検索できないため、infoほど良くはありませんが、オンラインの場合は、duckduckgoやgoogleなどの検索エンジンを使用してマニュアルを検索できます。

bash read builtin site:gnu.org

readのドキュメントが含まれているセクションに移動する可能性があります。または、インデックスを使用することもできます: https://www.gnu.org/software/bash/manual/html_node/Builtin-Index.html#Builtin-Index

他のフォーマットに基づいてmanページを検索する

現在のポケットベルでは簡単にできない太字/下線のテキストを検索する代わりに、次のことを試すこともできます。

  • 行の先頭でreadを検索します:/^\s*read
  • また、全体としてWord:/^\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
    [...]
    

    関心のあるセクションに簡単に移動できるようにします(空の&を入力して全文をもう一度表示するか、most:odを入力します)。

3

太字または下線付きで表示されている場合は、renderedであるため、検索できない可能性があります。

たとえば、テキストがフォーマットされたマンページからのものである場合、重ね打ちされた文字を次のように解釈することによって生成されます。

  • 太字(各キャラクターがバックスペースして繰り返すことで重ね打ちされた場合)または
  • 下線付き(各文字が下線付きの文字の上に書かれている場合)。

less ポケットベルFAQ解釈太字/下線:端末のビデオ属性を使用して、実際の太字/下線を表示します。

レンダリングの過程で、lessなどの一般的なポケットベルは、textのみを保持しているように見せかけます(太字/下線部分は保持しません)テキスト)。

テキストエディタでは、バックスペースパターンを検索できます。おそらく、特定のエディター(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> 
 1つ行は、標準入力から、または-^ Hu ^ Hu optio> 
の引数として指定されたファイル
記述子_ ^ Hf_ ^ Hdから読み取られます。最初のWordが最初の_ ^に割り当てられます。 Hn_ ^ Ha_ ^ Hm_ ^ He、2番目の> 
 2番目の_ ^ Hn_ ^ Ha_ ^ Hm_ ^ Heなど、残りの単語とその> 
 ing区切り文字が最後の_ ^に割り当てられます。 Hn_ ^ Ha_ ^ Hm_ ^ He。 > 
単語が名前よりも入力ストリームから読み取られた場合、残りの名前
3
Thomas Dickey

less -Uは、テキストをかなり読みにくくします。別の方法として、テキストを前処理して、ユニコード結合文字を使用して太字と下線を実装することもできます。たとえば、下線にU + 0332を使用し、太字をU +0333の二重下線として表します。

次のようなupagerスクリプトを作成できます。

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

次に:

export MANPAGER=upager

man bashは次のようにレンダリングされます:

   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

たとえば、太字または下線のread/r.e.a.dで検索できます。

ただし、すべてのターミナルエミュレータがそれらの結合文字を正しくレンダリングするわけではないようです。 konsoleがこれまでで最高の結果をもたらしたことがわかりました。


xtermでも機能する別の、おそらくより良いアプローチは、roffのフォーマットを維持しながら、すべての太字または下線の文字を非表示の文字で後置することです。このようにして、フォーマットに影響を与えずに、上記のように通常のread/readで検索し、太字/下線read/r.e.a.dで検索できます。

U + 200Bのような非表示の文字は、ゼロ幅スペースがlessによって<U+200B>としてレンダリングされるため、オプションではありません。動作しているように見える文字はU + 034F 結合子結合子 です。これは結合文字であり、非表示であり、通常、少なくとも英語のテキストには影響しません。

したがって、次のようなgcjpagerページャーを作成できます。

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

(およびexport MANPAGER=/path/to/gcjpager)。

3