Inserimento programmatico di file nel buffer Dired


10

Ho un elenco di nomi di file (con percorso completo) e voglio creare un buffer Dired che elenca questo set di file. Come potrei farlo?

Come faccio a creare un buffer Dired da un elenco di nomi di file?

Senza usare dipendenze esterne.


Si prega di precisare. Le stringhe nel tuo elenco sono a) i nomi dei file che desideri creare oppure b) il contenuto del file (la cosa per cui hai un percorso assoluto)?
Dan

@Dan Un elenco di nomi di file con percorsi assoluti. Solo i nomi dei file.
Tu Do

1
Se ti capisco correttamente, puoi semplicemente usare (find-file your-directory-path)per ottenere il diredbuffer pertinente (ad esempio, (find-file "/tmp/")aprirà la tua tmpdirectory in un diredbuffer).
Dan

1
Ho modificato la tua domanda in base a ciò che hai detto in questi commenti. Sentiti libero di tornare indietro se ho sbagliato.
Malabarba,

3
Se vuoi fare una domanda sugli oggetti file in elisp, questa è una domanda completamente diversa, con una risposta molto breve: non ce ne sono. :-)
Malabarba,

Risposte:


20

C-h f diredti dice la risposta. Basta passare dired, come DIRNAMEargomento, a un elenco che ha come auto il nome del buffer Dired desiderato (qualsiasi stringa) e come cdr l'elenco dei nomi di file che si desidera elencare nel buffer. In genere, si desidera utilizzare nomi di file assoluti. Per esempio:

(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

A seconda della piattaforma in uso, i nomi di tutti i file e le directory inesistenti inseriti potrebbero essere ignorati (non elencati) o potrebbero generare un errore. Il primo si verifica se si utilizza ls-lisp.el(ad esempio MS Windows). Puoi forzare l'uso di ls-lispsu qualsiasi piattaforma, se lo desideri (ma ls-lispha meno lsopzioni), facendo questo:

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

Se usi la libreria Dired + ( dired+.el), puoi scegliere interattivamente i file e le directory da elencare: basta dare diredun argomento con prefisso non positivo (cioè <= 0). Vengono quindi richiesti ripetutamente le directory e i nomi dei file che si desidera elencare. È possibile utilizzare i caratteri jolly dei nomi di file (ad esempio, *per globbing), per includere i file e le directory corrispondenti. Utilizzare C-gper terminare l'immissione.

In altre parole, invece di elencare una singola directory, il buffer Dired può elencare qualsiasi numero di directory e nomi di file, che possono anche appartenere a diversi alberi di directory.

(Un arg di prefisso non negativo (cioè,> = 0) richiede le lsopzioni di elenco. Quindi un arg di prefisso zero richiede sia le opzioni che i file / directory da elencare: prima le lsopzioni e poi i file / directory.)


Beh, voglio farlo in Elisp, non usando il comando. Voglio solo un semplice frammento di codice che trasformi un nome di file (con percorso completo) in una voce nel buffer Dired, simile a come uso (insert ...)per inserire il testo in un buffer.
Tu Do

1
@tudo: diredè una funzione elisp. Valuta questo: (dired '("my-list" "/home/rekado/dev/script.scm" "/home/rekado/another-file"))e ottieni un buffer diretto contenente questi file come ha scritto @Drew.
rekado,

@rekado. Grazie. Ora rileggo correttamente la risposta è come quello che hai detto. Voglio solo vedere uno snippet di codice Elisp come il tuo e ho pensato che Drew mi dava una risposta al comando dell'utente quando l'ho visto.
Tu Do

@Drew Aggiungi l'esempio di rekado. Grazie per la tua risposta.
Tu Do

Inizialmente non pensavo che sarebbe stato così semplice, quando vedo i set di file . Ho pensato che dobbiamo far riconoscere a Dired gli oggetti file corretti affinché funzioni correttamente.
Tu Do

2

Ecco un comando per farlo quando l'elenco dei file è in un buffer, con un file per riga.

(defun dired-virtual-vanilla ()
  (interactive)
  (dired (cons "*Dired*" (split-string (buffer-string) "\n" t))))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.