Fügen Sie Dateien programmgesteuert in den Dired-Puffer ein

10

Ich habe eine Liste mit Dateinamen (mit vollständigem Pfad) und möchte einen Dired-Puffer erstellen, in dem diese Dateien aufgelistet sind. Wie würde ich das machen?

Wie erstelle ich einen Dired-Puffer aus einer Liste von Dateinamen?

Ohne externe Abhängigkeiten zu verwenden.

Tu Do.
quelle
Bitte klären Sie. Sind die Zeichenfolgen in Ihrer Liste a) die Namen der Dateien, die Sie erstellen möchten, oder b) der Inhalt der Datei (das Ding, für das Sie einen absoluten Pfad haben)?
Dan
@ Dan Eine Liste von Dateinamen mit absoluten Pfaden. Nur die Dateinamen.
Tu Do
1
Wenn ich Sie richtig verstehe, können Sie einfach (find-file your-directory-path)den entsprechenden diredPuffer abrufen (z. B. (find-file "/tmp/")wird Ihr tmpVerzeichnis in einem diredPuffer geöffnet ).
Dan
1
Ich habe Ihre Frage basierend auf dem, was Sie in diesen Kommentaren gesagt haben, bearbeitet. Fühlen Sie sich frei, einen Rollback durchzuführen, wenn ich etwas falsch gemacht habe.
Malabarba
3
Wenn Sie nach Dateiobjekten in elisp fragen möchten, ist dies eine ganz andere Frage mit einer sehr kurzen Antwort: Es gibt keine. :-)
Malabarba

Antworten:

20

C-h f diredsagt dir die Antwort. Übergeben Sie einfach zu dired, wie das DIRNAMEArgument, eine Liste , die als ihr Auto Name des Dired Puffer hat man ( eine beliebige Zeichenfolge) und als cdr der Liste der Dateinamen möchten Sie im Puffer aufgelistet werden sollen. Im Allgemeinen möchten Sie absolute Dateinamen verwenden. Zum Beispiel:

(dired (list "My Dired Buffer Name*"     ; The Dired buffer name
             "/usr/foo/file1.el"         ; First file
             "/usr/bar/toto/some-file.c" ; Second file
             "/whatever/directory/"      ; Third is a directory
             "/a/file/somewhere.zzz"))   ; Fourth

Abhängig von Ihrer Plattform werden die Namen nicht vorhandener Dateien und Verzeichnisse, die Sie eingeben, möglicherweise ignoriert (nicht aufgelistet) oder es kann ein Fehler auftreten. Ersteres passiert, wenn Sie ls-lisp.el(z. B. MS Windows) verwenden. Sie können die Verwendung ls-lispauf jeder Plattform erzwingen , wenn Sie möchten (aber ls-lispweniger lsOptionen haben), indem Sie Folgendes tun:

(setq ls-lisp-use-insert-directory-program nil)
(require 'ls-lisp)

Wenn Sie die Bibliothek Dired + ( dired+.el) verwenden, können Sie interaktiv Dateien und Verzeichnisse zum Auflisten auswählen: Geben Sie einfach diredein nicht positives Präfixargument an (dh <= 0). Sie werden dann wiederholt aufgefordert, die Verzeichnisse und Dateinamen einzugeben, die aufgelistet werden sollen. Sie können Platzhalter *für Dateinamen (dh zum Globbing) verwenden, um die übereinstimmenden Dateien und Verzeichnisse einzuschließen. Verwenden Sie C-gdiese Option, um die Eingabe zu beenden.

Mit anderen Worten, anstatt ein einzelnes Verzeichnis aufzulisten, kann der Dired-Puffer eine beliebige Anzahl von Verzeichnissen und Dateinamen auflisten, die sogar zu verschiedenen Verzeichnisbäumen gehören können.

(Ein nicht negatives Präfix arg (dh> = 0) fordert Sie zur Eingabe der lsSchalter auf. Ein Null-Präfix arg fordert Sie daher auf, sowohl Schalter als auch Dateien / Verzeichnisse aufzulisten: zuerst die lsSchalter und dann die Dateien / Verzeichnisse.)

Drew
quelle
Nun, ich möchte es in Elisp tun, ohne den Befehl zu verwenden. Ich möchte nur ein einfaches Code-Snippet, das einen Dateinamen (mit vollständigem Pfad) in einen Eintrag im Dired-Puffer verwandelt, ähnlich wie ich (insert ...)Text in einen Puffer einfüge.
Tu Do
1
@tudo: diredist eine Elisp-Funktion. Bewerten Sie dies einfach: (dired '("my-list" "/home/rekado/dev/script.scm" "/home/rekado/another-file"))und Sie erhalten einen dired Puffer, der diese Dateien enthält, wie @Drew geschrieben hat.
rekado
@rekado. Danke. Jetzt lese ich die Antwort noch einmal richtig, es ist wie das, was du gesagt hast. Ich möchte nur einen Elisp-Code-Ausschnitt wie Ihren sehen, und ich dachte, Drew hätte mir eine Antwort auf einen Benutzerbefehl gegeben, als ich ihn sah.
Tu Do
@Drew Bitte füge das Beispiel von rekado hinzu. Danke für deine Antwort.
Tu Do
Anfangs dachte ich nicht, dass es so einfach sein würde, wenn ich Dateigruppen sehe . Ich dachte, wir müssen Dired dazu bringen, die richtigen Dateiobjekte zu erkennen, damit es richtig funktioniert.
Tu Do
2

Hier ist ein Befehl, um dies zu tun, wenn sich die Liste der Dateien in einem Puffer mit einer Datei pro Zeile befindet.

(defun dired-virtual-vanilla ()
  (interactive)
  (dired (cons "*Dired*" (split-string (buffer-string) "\n" t))))
killdash9
quelle