Secara terprogram memasukkan file ke dalam buffer Dired

10

Saya memiliki daftar nama file (dengan path lengkap) dan saya ingin membuat buffer Dired yang berisi daftar file ini. Bagaimana saya bisa melakukan itu?

Bagaimana cara membuat buffer Dired dari daftar nama file?

Tanpa menggunakan dependensi eksternal.

Tu Do
sumber
Mohon klarifikasi. Apakah string dalam daftar Anda a) nama-nama file yang ingin Anda buat, atau b) konten file (hal yang Anda miliki jalur absolutnya)?
Dan
@Dan Daftar nama file dengan jalur absolut. Hanya nama filenya.
Tu Do
1
Jika saya mengerti Anda dengan benar, Anda bisa menggunakan (find-file your-directory-path)untuk mendapatkan diredbuffer yang relevan (mis., (find-file "/tmp/")Akan membuka tmpdirektori Anda dalam diredbuffer).
Dan
1
Saya telah mengedit pertanyaan Anda berdasarkan apa yang Anda katakan di komentar ini. Jangan ragu untuk mengembalikan jika saya salah.
Malabarba
3
Jika Anda ingin bertanya tentang objek file di elisp itu pertanyaan yang sama sekali berbeda, dengan jawaban yang sangat singkat: tidak ada. :-)
Malabarba

Jawaban:

20

C-h f diredmemberi tahu Anda jawabannya. Cukup berikan dired, sebagai DIRNAMEargumen, daftar yang memiliki nama buffer Dired yang Anda inginkan (string apa pun) dan sebagai cdr daftar nama file yang ingin Anda daftarkan dalam buffer. Secara umum, Anda ingin menggunakan nama file absolut. Sebagai contoh:

(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

Bergantung pada platform Anda, nama file dan direktori yang tidak ada yang Anda masukkan mungkin diabaikan (tidak terdaftar), atau mungkin menimbulkan kesalahan. Yang pertama terjadi jika Anda menggunakan ls-lisp.el(misalnya MS Windows). Anda dapat memaksakan penggunaan ls-lisppada platform apa pun, jika Anda suka (tetapi ls-lispmemiliki lebih sedikit lsopsi), dengan melakukan ini:

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

Jika Anda menggunakan library Dired + ( dired+.el) maka Anda dapat secara interaktif memilih file dan direktori yang akan didaftarkan : cukup berikan diredargumen awalan non-positif (yaitu, <= 0). Anda kemudian diminta berulang kali untuk direktori dan nama file yang ingin Anda daftarkan. Anda dapat menggunakan wildcard nama-file (yaitu, *untuk globbing), untuk memasukkan file dan direktori yang cocok. Gunakan C-guntuk mengakhiri input.

Dengan kata lain, alih-alih mendaftar satu direktori, buffer Dired dapat mendaftar sejumlah direktori dan nama file, yang bahkan dapat dimiliki oleh pohon direktori yang berbeda.

(Argus awalan non-negatif (yaitu,> = 0) meminta Anda untuk lsdaftar saklar. Jadi argumen awalan nol meminta Anda untuk kedua switch dan file / dirs ke daftar: pertama lsswitch dan kemudian file / dirs.)

Drew
sumber
Yah saya ingin melakukannya di Elisp, tidak menggunakan perintah. Saya hanya ingin potongan kode sederhana yang mengubah nama file (dengan path lengkap) menjadi entri dalam buffer Dired, mirip dengan bagaimana saya menggunakan (insert ...)untuk memasukkan teks ke dalam buffer.
Tu Do
1
@tudo: diredadalah fungsi elisp. Cukup evaluasi ini: (dired '("my-list" "/home/rekado/dev/script.scm" "/home/rekado/another-file"))dan Anda mendapatkan buffer dired yang berisi file-file ini sebagai @Drew menulis.
rekado
@ Kunado. Terima kasih. Sekarang saya membaca ulang jawabannya dengan benar seperti apa yang Anda katakan. Saya hanya ingin melihat potongan kode Elisp seperti milik Anda, dan saya pikir Drew memberi saya jawaban perintah pengguna ketika saya melihatnya sekilas.
Tu Do
@Rew Silakan tambahkan contoh rekado. Terima kasih atas jawaban anda.
Tu Do
Awalnya saya tidak berpikir akan sesederhana ini, ketika saya melihat kumpulan file . Saya pikir kita harus membuat Dired mengenali objek file yang tepat agar dapat berfungsi dengan baik.
Tu Do
2

Berikut adalah perintah untuk melakukan ini ketika daftar file dalam buffer, dengan satu file per baris.

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