Öffnen Sie rekursiv Dateien, die mit regulärem Ausdruck übereinstimmen, in markierten Verzeichnissen

9

Im Allgemeinen möchte ich in der Lage sein, alle Dateien in einem bestimmten Satz von Verzeichnissen (und deren Unterverzeichnissen) zu öffnen, in denen der Dateiname mit einem bestimmten regulären Ausdruck übereinstimmt.

Beispielsweise

  /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

Ich habe die Verzeichnisse markiert hst, incund lib, und jetzt möchte ich alle Dateien mit Erweiterungen besuchen .c, .ccund .hinnerhalb dieser drei Verzeichnisse und Unterverzeichnisse.

Es wäre sogar noch besser, wenn ich alles sehen könnte, was ich öffne, bevor ich es öffne. Wenn der dired-Puffer aktualisiert wurde, um mir alle Dateien anzuzeigen, die meiner Suche entsprechen, und alle hervorgehoben wurden, könnte ich eine Überprüfung der Integrität durchführen, um sicherzustellen, dass meine Suche das zurückgibt, was ich erwartet habe.

Ich bin offen für Vorschläge, dasselbe mit helmoder dired+oder anderen Erweiterungen zu tun, mit denen ich einfacher in meinem Dateisystem navigieren kann.

Nispio
quelle
Hat Mathias oder Drew Ihre Frage beantwortet? Oder suchten Sie etwas anderes?
Malabarba

Antworten:

14

Versuche dies:

C-u C-x d

Hier können Sie Argumente eingeben, wie Dired Dateien auflisten soll. Standardmäßig heißt es -alan der Eingabeaufforderung. Fügen Sie Rdem hinzu und enden Sie mit -alR. Typ RET.

Wählen Sie ein Verzeichnis aus, geben Sie es ein und drücken Sie RET.

Dadurch werden alle Verzeichnisse rekursiv aus dem von Ihnen ausgewählten Verzeichnis und darunter geöffnet.

Geben Sie hier ein, % mum alle Dateien zu markieren, die einem bestimmten Dateinamenmuster entsprechen. Ich tippe dann auch oft tund dann k, um alle Dateien zu töten (auszublenden), an denen ich nicht interessiert bin. Tippe terneut, um alle Dateien zu markieren.

Was das Öffnen der Dateien angeht, gibt es meines Erachtens keine Standardmethode, aber Sie können einfach einen neuen Befehl dafür definieren (in Ihre .emacsDatei einfügen):

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

Höchstwahrscheinlich hat jemand dies bereits in ein nettes Dired-Erweiterungspaket aufgenommen, aber es macht Spaß, es auch selbst zu tun;)

Genießen!

Mathias Dahl
quelle
7

Sie können dies einfach mit der helm-projectile-find-file tun . Da Projectile alle Dateien mit ihrem relativen Pfad verfolgt, können Sie leicht auf alles eingrenzen. Verwenden wir Ihr Beispiel. In Ihrem Fall sollten Sie offene Dateien in hst, incund lib. Sie können alle Dateien, die zu diesem Verzeichnis gehören, auf zwei Arten abrufen:

  • Geben Sie in der Helm-Eingabeaufforderung von helm-projectile-find-filejedes Verzeichnis und die markierten Dateien ein, die auf dieses Verzeichnis eingegrenzt sind. Zum Beispiel gebe ich zuerst ein ^hst/(was sich auf alle Dateien beschränkt, die hst/am Anfang jedes Kandidaten enthalten sind). Markieren Sie alle Dateien mitM-a und machen Sie etwas Ähnliches für Dateien in den beiden anderen Verzeichnissen.

  • Oder Sie können Dateien in allen Verzeichnissen mit diesem Muster abrufen : ^hst/\|^inc\|^lib. Helm akzeptiert schließlich Regex. Der Regex \|bedeutet or. Tun Sie dies, wenn Sie alles auf einmal auswählen möchten.

Mit beiden haben Sie alle Dateien markiert, die Sie öffnen möchten. Dann drücken Sie einfach RET, um alle zu öffnen.

Bitte beachten Sie, dass Sie erhöhen müssen, wenn Sie viele Dateien in diesen Verzeichnissen haben helm-candidate-number-limit. Andernfalls werden keine Kandidaten mehr angezeigt, sobald die Anzahl der Kandidaten das Limit erreicht hat, und Sie können keine unsichtbaren Kandidaten auswählen. Stellen Sie eine höhere Zahl ein oder setzen nilSie diese , wenn Sie diese Grenze nicht möchten.

Das Gute an Helm ist, dass Sie Dateien interaktiv auswählen können.

Tu Do.
quelle
Ich denke, er möchte sie alle gleichzeitig öffnen und nicht einen von ihnen auswählen.
Malabarba
1
@Malabarba Sie können mit M-ausing mehrere Dateien auswählen helm-projectile-find-fileund einmal RET drücken, um sie alle mit der von mir aufgeführten Methode zu öffnen.
Tu Do
Na sicher! Entschuldigung, habe diesen Satz verpasst. Ich habe es bearbeitet, um es Idioten wie mir ein wenig offensichtlicher zu machen. Fühlen Sie sich frei, einen Rollback durchzuführen, wenn Sie nicht mögen oder wenn ich etwas falsch gemacht habe.
Malabarba
@ Malabarba Danke. Es ist jetzt klarer.
Tu Do
4

Hier sind zwei Möglichkeiten (Alternativen):

  1. In Dired können Sie alle Unterverzeichnisse einschließen, die Dateien enthalten, auf die Sie reagieren möchten, indem Sie entweder lsSchalter -Rverwenden i, die bestimmte Unterverzeichnisse enthalten, oder diese verwenden. Wenn Sie die Bibliothek Dired + verwenden , können Sie mit * .(gebunden an) diredp-mark/unmark-extensionalle aufgelisteten Dateien mit einer bestimmten Erweiterung (z. B. .h) markieren . Anschließend können Sie mit F(gebunden an dired-do-find-marked-files) alle markierten Dateien öffnen.

  2. Mit der Bibliothek Dired + können Sie auf alle markierten Dateien und alle markierten Dateien in markierten, rekursiv definierten Unterverzeichnissen, IOW, Unterverzeichnissen von Unterverzeichnissen, deren Unterverzeichnissen usw. reagieren.

    Wenn in einem markierten Verzeichnis keine Dateien in diesem Verzeichnis markiert sind (dh in einer Dired-Liste für dieses Unterverzeichnis markiert sind), wird die Aktion für alle Dateien ausgeführt.

    Es gibt eine ganze Reihe von Befehlen, um solche Dateien auf unterschiedliche Weise zu bearbeiten (Öffnen, Suchen usw.). Die Dateien, auf die reagiert werden soll, werden jedoch nur auf diese Weise festgelegt. Es besteht auch nicht die Möglichkeit, beispielsweise ein Glob-Muster oder einen regulären Ausdruck einzugeben, um die Menge zu filtern.

    Wenn Sie jedoch Library Icicles zusammen mit Dired + verwenden M-+ C-F, können Sie mit (dh M-+ C-S-fgebunden an icicle-visit-marked-file-of-content-recursive) einige oder alle der gerade beschriebenen Dateien öffnen (dh die markierten oder in markierten Unterverzeichnissen, die rekursiv definiert sind).

    Sie können Regexps im laufenden Betrieb verwenden, um die Dateinamen (und / oder den Dateiinhalt) zu filtern. Zum Beispiel können Sie, wie Sie verlangen, öffnen Sie alle Dateien , die Erweiterungen haben .c, .ccund .hin den markierten subdirs (mit markiert subdirs wird auf die gleiche Weise, rekursiv behandelt).

Drew
quelle
3

eshell übernimmt die **/*Glob-Erweiterung im zsh-Stil. Ein Ansatz besteht darin, eshell im richtigen Verzeichnis zu starten und auszuführenfor f in **/*cc **/*h { find-file $f}

Alternativ unterstützt die Funktion find-filePlatzhalter, wenn sie von elisp aufgerufen wird. Hier ist ein nützlicher Ausschnitt aus der Dokumentation dazu 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.

Ich konnte nicht herausfinden, wie ich das mit Globsh im Zsh-Stil zum Laufen bringen kann, aber es könnte eine gute Option sein.

Wenn sich alle diese Dateien in einem einzigen quellengesteuerten Projekt befinden, ist das Projektil möglicherweise ein anderer und besserer Ansatz.

PS. Wenn Sie sich für eshell entscheiden, würde ich vorschlagen, eshell-toggle-cdan einen Schlüssel zu binden , damit Sie einfach eine eshell-Eingabeaufforderung im Verzeichnis des Puffers einfügen können, den Sie bearbeiten.

Shapr
quelle
Ich denke nicht, dass find-filedas rekursiv funktioniert, was das Hauptmerkmal ist, nach dem ich suche. Das Öffnen einer Shell und das Eingeben eines Befehls scheint zu viel Arbeit zu sein, weil (ich vermute) mein Befehl so etwas wie sein müsste. for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }Oder ist es einfacher als das?
Nispio