
Wie kann ich mehrere unabhängige (keine Unterverzeichnisse) Verzeichnisse in einen Dired-Puffer einfügen? In meinem Fall möchte ich einen Dired-Puffer vorbereiten, der unabhängige Verzeichnisse mit mehreren Dateiänderungen enthält (z. B. im „wdired“-Modus mit mehreren Umbenennungen und Änderungen oder einfach mit mehreren Markierungen in verschiedenen Verzeichnissen), diese visuell überprüfen und dann mit einem Tastendruck ausführen.
Antwort1
Geben Sie als (erstes) Argument für die Funktion eine Liste von Zeichenfolgen anstelle eines Verzeichnisnamens an dired
.
Das erste Element in der Liste ist der Name des Dired-Puffers.
Die anderen Elemente in der Liste sind Verzeichnis- oder Dateinamen.
Der resultierende Dired-Puffer enthält eine Zeile für jedes Element in der Liste.
Jedes aufgelistete Verzeichnis kann natürlich eingefügt (d. h. um seine Dateiliste erweitert) werden, indem i
im Dired-Puffer darauf gearbeitet wird.
Bewerten Sie beispielsweise Folgendes:
(dired-other-window '("my dired buffer" DIR1 FILE1 DIR2 FILE2 FILE3))
wobei die DIRN
Verzeichnisnamen (Zeichenfolgen) und die FILEN
Dateinamen (Zeichenfolgen) sind. Sie können absolute Namen oder Namen relativ zum aktuellen Wert von verwenden default-directory
.
Das Ergebnis hier ist der Dired-Puffer my dired buffer
mit Zeilen für Verzeichnisse DIR1
und DIR2
Dateien FILE1
, FILE2
, und FILE3
.
Ich bin mir nicht sicher, ob ich den Rest Ihrer Frage verstehe. Aber der resultierende Dired-Puffer aus dem Obigen ist ein normaler Dired-Puffer. Sie können ihn verwenden, wdired
um Änderungen usw. zuzulassen.
Aktualisierung Nr. 1, nach Ihrem Kommentar --
Guter Punkt. Ja, Direds i
( dired-maybe-insert-subdir
) erfordert, dass alle eingefügten Unterverzeichnisse zum selben Verzeichnisbaum gehören. Ich weiß nicht, warum. Vielleicht hängt ein Teil des Codes (und davon gibt es eine Menge zu beachten), vielleicht der Umgang mit ls
, davon ab. Oder vielleicht ist es eine Einschränkung, die nicht wirklich notwendig ist.
Eine Möglichkeit, mit dieser Einschränkung umzugehen (sie zu umgehen), besteht darin, bei einem gemeinsamen Vorgängerverzeichnis für alle Unterverzeichnisse zu beginnen, die Sie in die Auflistung aufnehmen. Mit anderen Worten: Beginnen Sie mit M-x cd
diesem gemeinsamen Vorgängerverzeichnis, bevor Sie Ihren Dired-Puffer erstellen. Im Extremfall würde dies das Stammverzeichnis bedeuten . Das wird definitiv in allen Fällen funktionieren. Sie müssen wahrscheinlich absolute Dateinamen für die Verzeichnisse und Dateien verwenden, die Sie für die Auflistung M-x cd
übergeben .dired
Aber wie Sie sagen, wenn Sie MS Windows verwenden und die Verzeichnisse unterschiedliche Laufwerksbuchstaben haben, ist dies keine Lösung.
Unten finden Sie eine weitere Möglichkeit, die Sie ausprobieren können. Ich weiß nicht, ob es woanders Probleme verursachen könnte. (Wenn ja, würde mich interessieren, welche Probleme bei Ihnen auftreten. Siehe den Dateikopf der Bibliothekdired+.el
für Kontaktinformationen.)
Kopieren Sie den Quellcode für diese beiden Funktionen aus den Dateien dired-aux.el
: dired-insert-subdir
und dired-insert-subdir-newpos
und ändern Sie die Kopien dann wie folgt:
Kommentieren Sie für
dired-insert-subdir
diese Zeile aus:(dired-insert-subdir-validate dirname switches)
Ändern Sie für
dired-insert-subdir-newpos
den Code wie folgt:(defun dired-insert-subdir-newpos (new-dir) ;; Find pos for new subdir, according to tree order. (let ((alist dired-subdir-alist) elt dir new-pos) (while alist (setq elt (car alist) alist (cdr alist) dir (car elt)) (if (dired-tree-lessp dir new-dir) ;; Insert NEW-DIR after DIR (setq new-pos (dired-get-subdir-max elt) alist ()) (setq new-pos (point-max)))) (goto-char new-pos)) ;; want a separating newline between subdirs (unless (eobp) (forward-line -1)) (insert "\n") (point))
Laden Sie dann Ihren geänderten Code, nachdem Sie den Standard-Dired-Code geladen haben, und ersetzen Sie so effektiv die ursprünglichen Funktionen. (Alternativ können Sie diese Funktionen empfehlen.)
Dadurch funktioniert alles wie erwartet und es ist nicht mehr nötig, von einem gemeinsamen übergeordneten Verzeichnis aus zu starten. Aber wie gesagt, ich weiß nicht, ob andere Teile des Dired- (oder Wdired-)Codes durch eine solche Änderung gestört werden könnten. Experimentieren Sie einfach ein bisschen.
Beachten Sie jedoch, dass dired-insert-subdir-validate
tatsächlich zwei Dinge geprüft werden, von denen vielleicht nur eines entfernt werden sollte (?). Neben der Prüfung, ob sich das einzufügende Unterverzeichnis im selben Verzeichnisbaum befindet, wird geprüft, ob die ls
Schalter dafür mit denen der Gesamtliste kompatibel sind. Ich habe kein Problem beim dired-insert-subdir-validate
vollständigen Entfernen festgestellt, aber wenn diese Schalterprüfung wirklich wichtig ist, können Sie versuchen, nur diesen Teil des dired-insert-subdir-validate
Codes zu entfernen, der den Verzeichnisbaum prüft:
(or (dired-in-this-tree dirname (expand-file-name default-directory))
(error "%s: not in this directory tree" dirname))
Wenn es den Anschein hat, dass solche Codeänderungen keine unerwünschten Nebenwirkungen haben, die nicht einfach behoben werden können, werde ich in Erwägung ziehen, sie hinzuzufügen zuDired+.
Danke, dass Sie mich darauf aufmerksam gemacht haben. Normalerweise erstelle ich solche Listen aus einem gemeinsamen Vorfahren, daher ist mir diese Einschränkung bisher nicht aufgefallen.
Übrigens – ich habe den Emacs-„Bug“ Nr. 18421 für diesen Verbesserungsvorschlag eingereicht: Dired kann Verzeichniseinträge berücksichtigen, die nicht aus demselben Baum stammen.
* UPDATE #2 *
Ich habe diese Funktion hinzugefügt zuDired+.
Ich habe die Definitionen von geändertC-x d
( dired
),C-x 4 d
( dired-other-window
), UndC-x 5 d
( dired-other-frame
), sodass Sie, wenn Sie ein nicht positives Präfixargument verwenden (z. B. C-- C-x d
), nach (1) dem Dired-Puffernamen (beliebig, nicht notwendigerweise einem Verzeichnisnamen) und (2) den einzelnen Dateien oder Verzeichnissen gefragt werden, die aufgelistet werden sollen.
Ein nicht negatives Präfixargument fordert Sie dennoch zur Eingabe der ls
zu verwendenden Schalter auf. (Das C-0
gilt auch für beides: Aufforderung zur Eingabe von Schaltern und des Puffernamens und der aufzulistenden Dateien.)
Ich habe es reparierti
( dired-maybe-insert-subdir
), damit es mit beliebigen Verzeichnissen funktioniert. Und Sie können natürlich immer noch ein Präfixargument verwenden, um i
verschiedene Schalter anzugeben ls
, die für die eingefügte Unterverzeichnisliste verwendet werden sollen.