Mehrere nicht zusammenhängende Verzeichnisse in einem Pufferspeicher

618
user38983

Wie kann ich mehrere nicht zusammenhängende (nicht-Unterverzeichnisse) Verzeichnisse in einen Pufferspeicher einfügen? In meinem Fall möchte ich einen Pufferspeicher mit nicht zusammenhängenden Verzeichnissen mit mehreren Dateiänderungen vorbereiten (z. B. im Modus 'wdired' mit mehreren Umbenennungen und Änderungen oder einfach mit mehreren Markierungen in verschiedenen Verzeichnissen), die Dateien visuell überprüfen und dann überprüfen Führen Sie sie mit einem Tastendruck aus.

1

1 Antwort auf die Frage

3
Drew

Geben Sie anstelle des Verzeichnisnamens eine Liste von Zeichenfolgen als (erstes) Argument an, das funktioniert 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 hat für jedes Element in der Liste eine Zeile.

Jedes aufgeführte Verzeichnis kann natürlich eingefügt werden (dh zu seiner Dateiliste erweitert werden), indem ies im Dired-Puffer verwendet wird.

Bewerten Sie dies beispielsweise:

(dired-other-window '("my dired buffer" DIR1 FILE1 DIR2 FILE2 FILE3)) 

Dabei DIRNsind dies die Verzeichnisnamen (Zeichenfolgen) und die FILENDateinamen (Zeichenfolgen). Sie können absolute Namen oder Namen relativ zum aktuellen Wert von verwenden default-directory.

Das Ergebnis ist hier Dired Puffer my dired buffer, mit Linien für Verzeichnisse DIR1und DIR2und Dateien FILE1, FILE2und FILE3.

Ich bin mir nicht sicher, ob ich dem Rest Ihrer Frage folge. Der daraus resultierende Dired-Puffer ist jedoch ein normaler Dired-Puffer. Sie können wdireddamit Änderungen usw. zulassen.


Update Nr. 1 nach Ihrem Kommentar -

Guter Punkt. Ja, Dired's i( dired-maybe-insert-subdir) setzt voraus, dass alle eingefügten Unterverzeichnisse derselben Verzeichnisstruktur angehören. Ich weiß nicht warum. Vielleicht hängt ein Teil des Codes (und es gibt eine Menge davon zu berücksichtigen), der möglicherweise den Umgang damit betrifft ls, davon ab. Oder vielleicht ist es eine Einschränkung, die nicht wirklich notwendig ist.

Eine Möglichkeit, mit dieser Einschränkung umzugehen, besteht darin, bei einem gemeinsamen Vorfahrverzeichnis für alle Unterverzeichnisse zu beginnen, die Sie in die Liste aufnehmen. IOW starten, indem Sie M-x cdmit diesem gemeinsamen Vorfahren Verzeichnis, bevor Sie Ihren Dired Puffer zu schaffen. Im Extremfall würde dies M-x cddas Stammverzeichnis bedeuten . Das wird auf jeden Fall funktionieren. Sie müssen wahrscheinlich absolute Dateinamen für die Verzeichnisse und Dateien verwenden, an die Sie direddie Auflistung übergeben.

Aber wie Sie sagen, wenn Sie MS Windows verwenden und sich die Verzeichnisse auf unterschiedlichen Laufwerksbuchstaben befinden, ist dies keine Lösung.

Unten ist eine andere Sache, die Sie ausprobieren können. Weiß nicht, ob es woanders Probleme geben könnte. (Ich würde gerne wissen, auf welche Probleme Sie stoßen, falls dies der Fall ist. dired+.elInformationen zum Kontakt finden Sie im Dateiheader der Bibliothek .)

Kopieren Sie den Quellcode für diese beiden Funktionen aus file dired-aux.el: dired-insert-subdirund dired-insert-subdir-newpos, und ändern Sie die Kopien wie folgt:

  • Für dired-insert-subdir, kommentieren Sie diese Zeile aus:

    (dired-insert-subdir-validate dirname switches) 
  • Für dired-insert-subdir-newposÄndern Sie dazu den Code:

    (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 modifizierten Code, nachdem Sie den Vanilla Dired-Code geladen haben, und ersetzen Sie die ursprünglichen Funktionen. (Alternativ können Sie diese Funktionen beraten.)

Dies scheint zu bewirken, dass die Dinge wie erwartet funktionieren und es nicht erforderlich ist, von einem gemeinsamen Ahnenverzeichnis auszugehen. Aber wie gesagt, ich weiß nicht, ob einige andere Teile des Dired-Codes (oder des Wdired-Codes) durch eine solche Änderung gestört werden könnten. Experimentiere einfach ein bisschen.

Beachten Sie jedoch, dass dired-insert-subdir-validatetatsächlich zwei Dinge geprüft werden, von denen nur eines entfernt werden sollte (?). Neben der Überprüfung, ob das einzufügende Unterverzeichnis in derselben Verzeichnisstruktur liegt, wird geprüft, ob die entsprechenden lsSchalter mit denen der Gesamtauflistung kompatibel sind. Ich habe kein Problem mit dem Entfernen dired-insert-subdir-validateinsgesamt festgestellt, aber wenn diese Überprüfung wirklich wichtig ist, können Sie einfach versuchen, diesen Teil des dired-insert-subdir-validateCodes 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 zu Dired + hinzuzufügen .

Danke, dass Sie mich darauf aufmerksam gemacht haben. Ich schätze, ich erstelle solche Listen normalerweise von einem gemeinsamen Vorfahren, daher ist mir diese Einschränkung bisher nicht aufgefallen.


Übrigens - Ich habe bei Emacs "Fehler" # 18421 für diese Erweiterungsanfrage eingereicht: Lassen Sie Dired Verzeichnislisten aufnehmen, die nicht aus demselben Baum stammen.


* UPDATE # 2 *

Ich habe diese Funktion zu Dired + hinzugefügt .

Ich habe die Definitionen von C-x d( dired), C-x 4 d( dired-other-window) und C-x 5 d( dired-other-frame) so geändert, dass Sie bei Verwendung eines nicht positiven Präfix arg (z. B. C-- C-x d) aufgefordert werden, (1) den Dired-Puffernamen anzugeben (beliebiger Name, nicht unbedingt ein Verzeichnis) Name) und (2) die einzelnen Dateien oder Verzeichnisse, die aufgelistet werden sollen.

Ein nicht negatives Präfix arg fordert Sie weiterhin auf, die lsSwitches zu verwenden. (Also C-0beides: Eingabeaufforderungen für Schalter, Puffername und Dateien, die aufgelistet werden sollen.)

Ich habe i( dired-maybe-insert-subdir) so eingestellt, dass es mit beliebigen Verzeichnissen funktioniert. Sie können natürlich immer noch ein Präfix arg verwenden i, um verschiedene lsSchalter anzugeben, die für die eingefügte Unterverzeichnisliste verwendet werden sollen.

Unter Windows Emacs 23.1.1 weigert sich "i", das Verzeichnis einzufügen, und beschwert sich ": nicht in diesem Verzeichnisbaum ". Sehen Sie dasselbe? Da die Verzeichnisse, an denen ich interessiert bin, unter zwei verschiedenen Laufwerksbuchstaben liegen, kann ich kein Verzeichnis unter einem einzigen Verzeichnis starten, das beide als Unterverzeichnisse enthält. user38983 vor 10 Jahren 0
Richtig - siehe mein Update zur Antwort. Sag mir, was du herausfindest. Drew vor 10 Jahren 0
FWIW, ich habe Dired + aktualisiert, um dies zu unterstützen. Keine Ahnung, ob Probleme damit gemeldet werden. Scheint so gut zu funktionieren. Drew vor 10 Jahren 0
O-okay. Senden Sie eine Anfrage und erhalten Sie eine Antwort und eine Korrektur. Laden Sie den Fix herunter, und stellen Sie fest, dass der Autor * der Bibliothek * den Fix eingefügt hat und auch die anderen Fragen von emacs beantwortet hat. Ich habe es ausprobiert und es hat meine Bedürfnisse an diesem Punkt für über einen Monat perfekt erfüllt. user38983 vor 9 Jahren 0