Mehrere unabhängige Verzeichnisse in einem Dired-Puffer

Mehrere unabhängige Verzeichnisse in einem Dired-Puffer

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 iim Dired-Puffer darauf gearbeitet wird.

Bewerten Sie beispielsweise Folgendes:

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

wobei die DIRNVerzeichnisnamen (Zeichenfolgen) und die FILENDateinamen (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 buffermit Zeilen für Verzeichnisse DIR1und DIR2Dateien 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, wdiredum Ä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 cddiesem 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+.elfür Kontaktinformationen.)

Kopieren Sie den Quellcode für diese beiden Funktionen aus den Dateien dired-aux.el: dired-insert-subdirund dired-insert-subdir-newposund ändern Sie die Kopien dann wie folgt:

  • Kommentieren Sie für dired-insert-subdirdiese Zeile aus:

    (dired-insert-subdir-validate dirname switches)
    
  • Ändern Sie für dired-insert-subdir-newposden 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-validatetatsä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 lsSchalter dafür mit denen der Gesamtliste kompatibel sind. Ich habe kein Problem beim dired-insert-subdir-validatevollständigen Entfernen festgestellt, aber wenn diese Schalterprüfung wirklich wichtig ist, können Sie versuchen, nur 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 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 lszu verwendenden Schalter auf. (Das C-0gilt 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 iverschiedene Schalter anzugeben ls, die für die eingefügte Unterverzeichnisliste verwendet werden sollen.

verwandte Informationen