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
, inc
und lib
, und jetzt möchte ich alle Dateien mit Erweiterungen besuchen .c
, .cc
und .h
innerhalb 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 helm
oder dired+
oder anderen Erweiterungen zu tun, mit denen ich einfacher in meinem Dateisystem navigieren kann.
Antworten:
Versuche dies:
Hier können Sie Argumente eingeben, wie Dired Dateien auflisten soll. Standardmäßig heißt es
-al
an der Eingabeaufforderung. Fügen SieR
dem 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,
% m
um 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
.emacs
Datei einfügen):Höchstwahrscheinlich hat jemand dies bereits in ein nettes Dired-Erweiterungspaket aufgenommen, aber es macht Spaß, es auch selbst zu tun;)
Genießen!
quelle
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
,inc
undlib
. 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-file
jedes 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, diehst/
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\|
bedeutetor
. 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 setzennil
Sie diese , wenn Sie diese Grenze nicht möchten.Das Gute an Helm ist, dass Sie Dateien interaktiv auswählen können.
quelle
M-a
using mehrere Dateien auswählenhelm-projectile-find-file
und einmal RET drücken, um sie alle mit der von mir aufgeführten Methode zu öffnen.Hier sind zwei Möglichkeiten (Alternativen):
In Dired können Sie alle Unterverzeichnisse einschließen, die Dateien enthalten, auf die Sie reagieren möchten, indem Sie entweder
ls
Schalter-R
verwendeni
, die bestimmte Unterverzeichnisse enthalten, oder diese verwenden. Wenn Sie die Bibliothek Dired + verwenden , können Sie mit* .
(gebunden an)diredp-mark/unmark-extension
alle aufgelisteten Dateien mit einer bestimmten Erweiterung (z. B..h
) markieren . Anschließend können Sie mitF
(gebunden andired-do-find-marked-files
) alle markierten Dateien öffnen.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 (dhM-+ C-S-f
gebunden anicicle-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
,.cc
und.h
in den markierten subdirs (mit markiert subdirs wird auf die gleiche Weise, rekursiv behandelt).quelle
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-file
Platzhalter, wenn sie von elisp aufgerufen wird. Hier ist ein nützlicher Ausschnitt aus der Dokumentation dazufind-file
: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-cd
an einen Schlüssel zu binden , damit Sie einfach eine eshell-Eingabeaufforderung im Verzeichnis des Puffers einfügen können, den Sie bearbeiten.quelle
find-file
das 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?