マークされたディレクトリで正規表現に一致するファイルを再帰的に開きます


9

一般的に言えば、ファイル名が特定の正規表現に一致する特定のディレクトリセット(およびそのサブディレクトリ)内のすべてのファイルを開くことができるようにしたいと思います。

例えば

  /home/nispio/project:
  total used in directory 1612 available 1000000000
  drwxrwxr-x 13 nispio group    4096 Sep 19 14:06 .
  drwxrwxr-x  7 nispio group    4096 Sep 22 16:41 ..
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 cfg
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 hlp
* drwxrwxr-x  2 nispio group    4096 Sep 23 16:52 hst
* drwxrwxr-x  2 nispio group    4096 Sep 29 14:52 inc
* drwxrwxr-x  2 nispio group    4096 Oct  1 12:53 lib
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 mcr
  drwxrwxr-x  2 nispio group    4096 Sep 24 10:50 pyl
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 snr
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 unix

私は、ディレクトリをマークしたhstinclib、と今私は拡張子を持つすべてのファイルを訪問したい.c.ccと、.hこれらの3つのディレクトリとそのサブディレクトリ内。

開く前に、開いているものをすべて見ることができればさらに良いでしょう。検索に一致したすべてのファイルを表示するようにdiredバッファーが更新され、それらのすべてが強調表示された場合、サニティチェックを実行して、検索が期待した結果を返したことを確認できます。

私が使ってこれと同じことを行うために提案を開いていますhelmか、dired+または私にできるようになる他の拡張機能をより簡単に自分のファイルシステムをナビゲートします。


MathiasまたはDrewがクエストインに回答しましたか?それとも別のものを探していましたか?
Malabarba 2014年

回答:


14

これを試して:

C-u C-x d

これで、Diredがファイルをリストする方法の引数を入力できます。デフォルトでは-alプロンプトに表示されます。それに追加Rして、で終わる-alR。と入力しRETます。

ディレクトリを選択/入力して、を押しRETます。

これにより、選択したディレクトリ以下のすべてのディレクトリが再帰的に開きます。

ここから入力% mして、特定のファイル名パターンに一致するすべてのファイルをマークします。次に、たいていはタイプしてtから、k関心のないすべてのファイルを削除(非表示)tします。すべてのファイルをマークするには、もう一度タイプします。

実際にファイルを開く限り、標準的な方法はないと思いますが、新しいコマンドを簡単に定義して、.emacsファイルに配置できます。

(defun dired-find-marked-files ()
 (interactive)
 (dolist (f (dired-get-marked-files)) 
  (find-file f)))

ほとんどの場合、誰かがこれをいくつかの素敵なDired拡張パッケージにすでに含めていますが、自分で行うのも楽しいです;)

楽しい!


7

これはhelm-projectile-find-fileで簡単に実行できます。Projectileはすべてのファイルをその相対パスで追跡しているため、簡単に何にでも絞り込むことができます。あなたの例を使ってみましょう。あなたのケースでは、あなたは内のファイルを開きたいhstinclib。次の2つの方法で、このディレクトリに属する​​すべてのファイルを取得できます。

  • のHelmプロンプトでhelm-projectile-find-file、各ディレクトリとそのディレクトリに絞り込まれたマークファイルを入力します。たとえば、最初に入力します^hst/hst/各候補の先頭に含まれるすべてのファイルに絞り込みます)。すべてのファイルをM-aマークし、他の2つのディレクトリのファイルに対して同様のことを行います。

  • それとも、あなたがすることができ、このパターンを使用してすべてのディレクトリ内のファイルを検索します^hst/\|^inc\|^lib。Helmは結局正規表現を受け入れます。正規表現\|はを意味しorます。すべてを一度に選択する場合は、これを実行します。

これらのいずれかを使用して、開きたいすべてのファイルにマークを付けます。次に、を押しRETてそれらをすべて開きます。

これらのディレクトリに多数のファイルがある場合は、を増やす必要があることに注意してくださいhelm-candidate-number-limit。そうしないと、候補の数が制限に達すると、候補は表示されなくなり、非表示の候補を選択できなくなります。より大きな数に設定するnilか、この制限が必要ない場合はに設定してください。

Helmの良い点は、対話的にファイルを選択できることです。


彼はそれらの1つを選択するのではなく、同時にすべてを開きたいと思います。
Malabarba 2014年

1
@MalabarbaをM-a使用して複数のファイルを選択しhelm-projectile-find-file、RETを1回押すと、リストにある方法を使用してすべてを開くことができます。
火ドゥ

もちろん!すみません、その文章を逃しました。私のような馬鹿にも少しわかりやすいように編集しました。気に入らない場合や、何か問題があった場合は、遠慮なくロールバックしてください。
Malabarba 2014年

@Malabarbaありがとう。より明確になりました。
Tu Do

4

2つの可能性があります(代替案)。

  1. Diredでは、ls含めるスイッチを-R使用iするか、特定のサブディレクトリを含めるためにを使用して、操作するファイルを含むすべてのサブディレクトリを含めることができます。ライブラリDired +を使用している場合は、* .(bound to diredp-mark/unmark-extension、を使用して、指定された拡張子を持つすべてのリストされたファイルをマークできます(など.h)。その後、F(bound to dired-do-find-marked-files)を使用して、マークされたすべてのファイルを開くことができます。

  2. ライブラリDired +を使用すると、マークされたすべてのファイル、および再帰的に定義されたマークされたサブディレクトリ内のすべてのマークされたファイル、IOW、サブディレクトリのサブディレクトリ、それらのサブディレクトリなどを操作できます。

    マークされたディレクトリについて、そのディレクトリでファイルがマークされていない場合(つまり、そのサブディレクトリのDiredリストでマークされている場合)、アクションはそのすべてのファイルに対して行われます。

    このようなファイルをさまざまな方法(開く、検索など)で操作するためのコマンドはかなりたくさんあります。しかし、操作するファイルはその方法でのみ決定されます。たとえば、グロブパターンや正規表現を入力してセットをフィルタリングすることもできません。

    ただし、ライブラリIciclesDired +と一緒に使用する場合はM-+ C-FM-+ C-S-f(つまり、にバインドされているicicle-visit-marked-file-of-content-recursive)を使用して、記述されたファイルのいずれかまたはすべてを開くことができます(つまり、マークされた、またはマークされたサブディレクトリにあるファイルを再帰的に定義します)。

    その場で正規表現を使用して、ファイル名(および/またはファイルの内容)をフィルタリングできます。例えば、あなたが、あなたが要求して、拡張子を持つすべてのファイルを開くことができ.c.ccおよび.hマークサブディレクトリに(マークサブディレクトリで再帰的に、同じように処理されています)。


3

eshellはzshスタイルの**/*glob拡張を処理するため、1つのアプローチは、正しいディレクトリでeshellを起動して実行することです。for f in **/*cc **/*h { find-file $f}

または、関数find-fileはelispから呼び出されたときにワイルドカードをサポートします。そのためのドキュメントの便利なスニペットを次に示しますfind-file

(find-file FILENAME &optional WILDCARDS)
Interactively, or if WILDCARDS is non-nil in a call from Lisp, expand wildcards (if any) and visit multiple files.

私はそれをzshスタイルのグロビングで動作させる方法を理解できませんでしたが、それは良いオプションかもしれません。

これらすべてのファイルが単一のソース管理プロジェクトにある場合、発射物は別のより良いアプローチになる可能性があります。

PS。eshellをeshell-toggle-cd使用する場合は、キーにバインドすることをお勧めします。そうすることで、編集しているバッファーのディレクトリにeshellプロンプトを簡単にポップアップできます。


find-fileそれが再帰的に動作することはないと思います。これが私の主な機能です。シェルを開いてコマンドを入力するのは、(私が推測しているように)コマンドが次のようなものでなければならないため、あまりにも多くの作業のように見えfor d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }ます。
nispio 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.