単一のプロジェクト内のすべての有用なファイルを検索する最も簡単な方法は何ですか?


28

現在のプロジェクトのすべてのファイルのコンテンツ全体で正規表現を検索する最も簡単な方法は何ですか?有用でないファイルをスキップしますか?

役に立たないファイルは、コンパイルされたファイル、インポートされたライブラリ、バージョン管理ファイルなどのようなものです。

私は知っていますがrgrep、すべてを検索するだけです。「賢く」検索し、いくつかの異なるプログラミング言語を知っているパッケージがあるので、個々のプロジェクトごとに構成する必要はありませんか?


rgrepデフォルトで「役に立たないファイル」の条件に一致するすべてのファイルが除外されることを考えると、「すべてを検索するだけ」というコメントは少しわかりにくいです。
phils

回答:


32

Emacs内でのプロジェクトベースの検索は、projectileを使用して実行できます。

<projectroot>\.projectileファイル内の)ファイルを無視するプロジェクトごとの構成を許可するか、他のすべてを監視および無視するサブディレクトリを指定します。

これは、実行することができgrepack(必要でack-and-a-half.el)とagag.el)定義されたプロジェクト内のファイルに(どちらかに基づいて、.projectileファイルまたはプロジェクトのルートを定義するためのサポートVCファイルを見つけることによって)。

便利なコマンド

(有用なファイルの検索に関して)

Projectile Readmeに従って

  • C-c p s g :: grepプロジェクト内のファイルで実行します。
  • C-c p s a :: ackプロジェクトで実行されます。ack-and-halfの存在が必要です。
  • C-c p s s :: agプロジェクトで実行されます。ag.elの存在が必要です。
  • C-c p f ::プロジェクト内のすべてのファイルのリストを表示します。
  • C-c p d ::プロジェクト内のすべてのディレクトリのリストを表示します。
  • C-c p a ::プロジェクト内の同じ名前で異なる拡張子を持つファイルを切り替えます。
  • C-c p o:: multi-occur現在開いているすべてのプロジェクトバッファで実行されます。

これらは、プロジェクトの一部として定義されている(またはキャッシュの生成/再生成時に検出される)ファイルに対してのみ機能します。


おかげで、これに使用できる発射コマンドは何ですか?
マラバルバ14

コマンドのサブセット(検索、ファイル検索、diredを処理するコマンド)が含まれるように編集しました。完全なリストはパッケージのreadmeにあります。
ジョナサンリーチペピン14

13

関連ファイルのみのプロジェクト全体の検索は、ag別名the_silver_searcherを使用して実行できます。

なぜag?

  • それはあなたからのファイルパターンを無視し.gitignore.hgignoresvn:ignoreスイッチを使用して、バージョン管理の無視リストから無視リストを使用しないように検索を選択できます-U
  • ソースリポジトリに検索したくないファイルがある場合は、そのパターンを.agignoreファイルに追加するだけです。
    • グローバル.agignoreファイルをに配置して$HOMEから、プロジェクト固有の.agignoreファイルをプロジェクトルートに配置できます。

セットアップagとemacs

  • システムにag別名the_silver_searcherをインストールします。
  • .agignoreファイルをセットアップします。.agignoreは私のグローバルファイルだけを持っていることを好みます$HOME
  • agパッケージをインストールします(Melpaで入手可能)。
  • 次に、パッケージに付属するag-projector ag-project-regexp関数を使用して、agプロジェクト全体のファイル検索を実行できます。
    • デフォルトでは、これらの関数は、検索するディレクトリとしてVCSリポジトリのルートを使用します。を設定またはカスタマイズすることにより、これをオーバーライドできますag-project-root-function
    • プロジェクトがgitで制御されていない場合でも、プロジェクトルートに空のフォルダーを置くことにより、ag-project/ ag-project-regexpベースの検索用にプロジェクトルートをマークでき.gitます。その後、カスタマイズする必要はありませんag-project-root-function

4

プロジェクトでGitを使用する場合は、https://github.com/abo-abo/swiperのみが必要ですcounsel

  • counsel-git ファイルを見つける

  • counsel-git-grep grepへ

唯一の依存関係はgitです

テキストのgrep処理は、シルバーサーチャー(ag)よりも高速です

弁護士は、他の強力なツールも提供します。たとえば、実行した後counsel-git-grep、あなたは押すことができますC-c C-oし、C-x C-qに行くためにwgrep-mode簡単にプロジェクトのスコープ内のテキストを交換します。

詳細を説明する記事https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/があります。その記事ではcounsel-ag(弁護士に組み込まれた別のコマンド)をcousnel-git-grep使用していますが、まったく同じワークフローを使用しています。


しかし、なぜテキストグレッピングはagよりも速いのでしょうか。詳しく説明してもらえますか?
denis631

1
agのようなgrepプログラムでもありgit-grepます。どちらが速いかはわかりません。参照github.com/BurntSushi/ripgrep(などの人気のgrepプログラムのパフォーマンスを比較agしてのgit-grep
陳ビン

1

最初の答えは美しいですが、Emacsの最新バージョンに関するいくつかの重要な詳細は省略しています。私は自分でEmacsを知っているので、他の新人はこれに気付かないかもしれません。プロジェクト内のファイル内でテキストを検索することが目標である場合、最初にMELPAリポジトリを使用してProjectileをインストールします。

これにより、パッケージが.emacs.dにインストールされ、EmacsインストールでProjectileを要求するなど、基本的な構成が$ USERディレクトリの.emacsに追加されます(.emacsファイルを作成したと仮定)。

ただし、有効にしてキーマッププレフィックスを関連付ける必要があるため、ミニバッファーで呼び出すことができます。

受け入れられた回答には、次のコマンドが記載されています。

C-c p s g

このキーマッププレフィックスを使用してProjectileを構成しない限り、これは機能しません。ただし、.emacsのProjectのコマンドとしてCc Cpを使用するように構成しました。

(projectile-mode +1)
(define-key projectile-mode-map (kbd "C-c C-p") 'projectile-command-map)

これにより、grepを使用してプロジェクト内のファイルでテキスト検索を実行できます。

C-c C-p f # switch to a project first
C-c C-p s g # perform grep search in project

分解するには、 C-c C-pProjectileを呼び出しs g、grep検索を実行します。検索がvisit_contactあり、プロジェクトでRubyのrspecを検索していると仮定すると、このような美しい出力が得られます。

./spec/support/capybara_classification_code_helper.rb:21:  def visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:8:    visit_contact
./spec/features/admin_edits_classification_code_role_dynamic_field_spec.rb:33:    visit_contact
./spec/features/user_views_global_filters_from_line_item_spec.rb:9:      visit_contact
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.