Insertar archivos mediante programación en el búfer Dired

10

Tengo una lista de nombres de archivo (con la ruta completa) y quiero crear un búfer Dired que enumere este conjunto de archivos. ¿Cómo voy a hacer eso?

¿Cómo creo un búfer Dired a partir de una lista de nombres de archivo?

Sin usar dependencias externas.

Tu Do
fuente
Por favor aclarar ¿Son las cadenas en su lista a) los nombres de los archivos que desea crear, o b) el contenido del archivo (para lo cual tiene una ruta absoluta)?
Dan
@Dan Una lista de nombres de archivo con rutas absolutas. Solo los nombres de archivo.
Tu Do
1
Si lo entiendo correctamente, puede usarlo (find-file your-directory-path)para obtener el diredbúfer relevante (por ejemplo, (find-file "/tmp/")abrirá su tmpdirectorio en un diredbúfer).
Dan
1
Edité tu pregunta en función de lo que dijiste en estos comentarios. Siéntete libre de retroceder si me equivoco.
Malabarba
3
Si desea preguntar sobre objetos de archivo en elisp, esa es una pregunta completamente diferente, con una respuesta muy breve: no hay ninguna. :-)
Malabarba

Respuestas:

20

C-h f diredte dice la respuesta Simplemente pase dired, como DIRNAMEargumento, una lista que tenga como vehículo el nombre del búfer Dired que desea (cualquier cadena) y como cdr la lista de nombres de archivos que desea que aparezcan en el búfer. En general, desea utilizar nombres de archivo absolutos. Por ejemplo:

(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

Dependiendo de su plataforma, los nombres de los archivos y directorios inexistentes que ingrese podrían ignorarse (no figurar en la lista) o generar un error. Lo primero sucede si lo usa ls-lisp.el(por ejemplo, MS Windows). Puede forzar el uso de ls-lispcualquier plataforma, si lo desea (pero ls-lisptiene menos lsopciones), haciendo esto:

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

Si usa la biblioteca Dired + ( dired+.el), puede elegir interactivamente archivos y directorios para enumerar: simplemente proporcione diredun argumento de prefijo no positivo (es decir, <= 0). Luego se le solicitará repetidamente los directorios y los nombres de archivo que desea enumerar. Puede usar comodines de nombre de archivo (es decir, *para globbing), para incluir los archivos y directorios coincidentes. Use C-gpara finalizar la entrada.

En otras palabras, en lugar de enumerar un solo directorio, el búfer Dired puede enumerar cualquier cantidad de directorios y nombres de archivos, que incluso pueden pertenecer a diferentes árboles de directorios.

(Un argumento de prefijo no negativo (es decir,> = 0) le solicita los lsconmutadores de la lista. Por lo tanto, un argumento de prefijo cero le solicita tanto los modificadores como los archivos / directorios para enumerar: primero los lsmodificadores y luego los archivos / directorios.)

Dibujó
fuente
Bueno, quiero hacerlo en Elisp, sin usar el comando. Solo quiero un fragmento de código simple que convierta un nombre de archivo (con la ruta completa) en una entrada en el búfer Dired, similar a la forma en que utilizo (insert ...)para insertar texto en un búfer.
Tu Do
1
@tudo: diredes una función elisp. Simplemente evalúe esto: (dired '("my-list" "/home/rekado/dev/script.scm" "/home/rekado/another-file"))y obtendrá un búfer directo que contiene estos archivos como escribió @Drew.
rekado
@rekado. Gracias. Ahora releí la respuesta correctamente, es como lo que dijiste. Solo quiero ver un fragmento de código de Elisp como el tuyo, y pensé que Drew me dio una respuesta de comando de usuario cuando lo vislumbré.
Tu Do
@Drew Agrega el ejemplo de rekado. Gracias por tu respuesta.
Tu Do
Inicialmente no pensé que sería así de simple, cuando veo conjuntos de archivos . Pensé que debemos hacer que Dired reconozca los objetos de archivo adecuados para que funcione correctamente.
Tu Do
2

Aquí hay un comando para hacer esto cuando la lista de archivos está en un búfer, con un archivo por línea.

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