一致する行のみを表示しますか?


31

長いファイルで、約200行程度に一致するパターンを検索したいと思います。一致した行は、ファイル内のランダムな場所にあります。
行が一致すると、行自体のみが関連し、前後のコンテキストは関係しません。

通常、で/一致を検索してジャンプしnます。
ただし、画面上に一度に関連する行が1行または2行しかないことを意味します。

結果行のリストを調べながら、一致しなかったすべての行を非表示にする方法はありますか?


総当たり攻撃のアプローチは、一致しない行をすべて削除し、その削除を後で元に戻すことです。しかし、それが永続的な取り消しにならない場合でも、それはさまざまな点でいです...

回答:


34
:vimgrep pattern %
:cwin

vimgrep現在のファイル(%)または指定したファイルでパターンを検索します。

cwinその後、目的の行のみを表示するバッファをウィンドウに開きます。cwinバッファ内では、ほぼすべてのナビゲーション/検索コマンドを使用できます。Returnキーを押して、ソースファイル内のカーソルの下の行にジャンプします。


1
:vimgrep略称することができます:vim
D.ベンKnoble

どうすれば再びバッファに戻ることができますか?
パシャ

また、どのようにバッファを閉じますか?事前に感謝
パシャ

クイックフィックス(cwindow)バッファーから、任意の行でReturnキーを押すと、元のバッファーのその場所にジャンプできます。cwindowバッファはどこからでも閉じることができ:ccl[ose]ますが、通常はバッファを閉じます(たとえば、それに切り替えて、:bd)。:cw[indow]再度実行してQuickfixバッファーを再度開くと、最後のvimgrepの結果が使用されます。
ザックイングブレツェン

15

一致するすべての行をリストするには

:g/{pattern}

:printコマンドは省略できます。これはのデフォルトです:g。)


1
これは、(「元のgrep」ですg/REgexp/p)...問題は...しかし、あなたは簡単に試合の一つにジャンプすることができないということです
マーティンTournoij

@Carpetsmoker:そのとおりです。そのために、私はプラグインを持っています、他の答えを見てください。
インゴカルカット

これは多くの場合に役立ちます。出力を新しいバッファにリダイレクトできますか?これにより、行の構文が強調表示されたままになります。(うーん...それは別の質問を提起します、ちょっと待ってください...)
Volker Siegel

@IngoKarkatの意味は何ですかg。私はそれがグローバルなパターンだと思います。通常、スラッシュ/patternを使用してVI検索を実行すると、すべてのオカレンスが検索されます。手紙を押すことでナビゲートできますn
Alexander Cska

@AlexanderCska:いいえ、これは検索用の修飾子ではなく:g[lobal]、パターンを引数として取る別のコマンドです。詳細はで確認できます:help :global
インゴカルカット

12

あなたは使用することができるfoldmethodfoldexpr無関係なラインを離れて折るためのオプションを。

検索後、最後の検索が@/レジスタに保存されます。したがって、このように一致しないものはすべて簡単に折りたたむことができます(1行の一致の場合のみ)。

:setlocal foldexpr=getline(v:lnum)=~@/?0:1 foldmethod=expr

表示または非表示にできるコンテキスト行の複数レベルの折りたたみの追加、または複数行の一致など、より高度な方法は、Vim Tips Wikiで見つけることができます。


そこにされるように思えるset foldlevel=0必要?しかし、おそらくそれがデフォルトです。
フォルカーシーゲル

1
はい、デフォルトはゼロですが、それなしでは機能しない場合、追加しても害はありません。:
ベン

しかし、今...トレースなしで再び元に戻す方法は?
フォルカーシーゲル

通常モードでは、「zi」を使用して折りたたみのオンとオフを切り替えることができます。
ジョン・オム。

ほとんどの場合、これを行うには、まず:tab spファイルの新しい使い捨てのビューを取得します。その後、戻るのは:close、タブを削除するのと同じくらい簡単な方法です。
ベン

6

順序が重要でない場合は、行を移動するだけです。

:g/pat/m0

詳細については、以下を参照してください。

:h :g
:h :m

1
そして、:g/pat/m$(最後にマッチした行を移動します)、OKもある
ラーナー張

6

[d]パターンに一致しないすべての行を削除します(!):

:g!/pattern/d

またはさらにシンプル(「Bレイヤー」によるコメントのおかげ):

:v/pattern/d

ええ、しかし、:vよりも同等のものを使用するのがより一般的:g!です (後者を使用したTBHを最後に見たときのことは覚えていません!)
Bレイヤー

2

(他の回答のように)一致するすべての行を一覧表示し、特定の一致にジャンプする場合、FindOccurrenceプラグイン[/その(および[n1つのクエリではなく最後の検索パターン)のマッピングを提供します。[/patternリストはのようなもの:g/patternですが、ジャンプする一致の番号を尋ねます。


0

別の方法は、を使用:h :ilistすることです。これを使用して、manページの概要を取得します。結果は次のようになります。

~/find.~
  1:    3 NAME
  2:    6 SYNOPSIS
  3:    9 DESCRIPTION
  4:   18 OPTIONS
  5:   93 EXPRESSION
  6:  779 EXAMPLES
  7:  877 HISTORY
  8:  931 BUGS

インデックスによって結果行に移動することを選択できる小さな関数を次に示します。

function! s:select_ilist(ilist_result)
  if empty(a:ilist_result) || a:ilist_result =~# '^\_s*Error'
    return
  endif

  let select = input(a:ilist_result . "\ngoto : ")
  if empty(select) | return | endif

  " ilist result starts with '\nfilename\n', filename can be empty
  let lines = split(a:ilist_result[stridx(a:ilist_result, "\n", 1) : ], "\n")
  if select <= 0 || select > len(lines) | return | endif

  exec matchstr(lines[select-1], '^\v\s*\d+\:\s+\zs\d+')
endfunction

次のように使用できます。

command! -buffer Section call s:select_ilist(execute('silent! ilist /\v\C^[A-Z][^a-z]+$/'))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.