Программно вставлять файлы в буфер Dired

10

У меня есть список имен файлов (с полным путем), и я хочу создать буфер Dired, перечисляющий этот набор файлов. Как бы я поступил так?

Как создать буфер Dired из списка имен файлов?

Без использования внешних зависимостей.

Ту До
источник
Просьба уточнить. Являются ли строки в вашем списке а) именами файлов, которые вы хотите создать, или б) содержимым файла (то, для чего у вас есть абсолютный путь)?
Дан
@Dan Список имен файлов с абсолютными путями. Просто имена файлов.
Ту До
1
Если я вас правильно понимаю, вы можете просто использовать (find-file your-directory-path)для получения соответствующего diredбуфера (например, (find-file "/tmp/")откроет ваш tmpкаталог в diredбуфере).
Дан
1
Я отредактировал ваш вопрос на основе того, что вы сказали в этих комментариях. Не стесняйтесь откатиться, если я ошибся.
Малабарба
3
Если вы хотите спросить о файловых объектах в elisp, это совершенно другой вопрос с очень коротким ответом: их нет. :-)
Малабарба

Ответы:

20

C-h f diredговорит вам ответ. Просто передайте в diredкачестве DIRNAMEаргумента список, имеющий в качестве своей машины желаемое имя буфера Dired (любая строка) и в качестве cdr список имен файлов, которые вы хотите перечислить в буфере. Как правило, вы хотите использовать абсолютные имена файлов. Например:

(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

В зависимости от вашей платформы имена любых несуществующих файлов и каталогов, которые вы вводите, могут быть проигнорированы (не перечислены) или могут вызвать ошибку. Первое происходит, если вы используете ls-lisp.el(например, MS Windows). Вы можете форсировать использование ls-lispна любой платформе, если хотите (но у ls-lispнее меньше lsвариантов), выполнив это:

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

Если вы используете библиотеку Dired + ( dired+.el), то вы можете в интерактивном режиме выбирать файлы и каталоги для перечисления: просто укажите diredаргумент неположительного префикса (т. Е. <= 0). Затем вас несколько раз попросят указать каталоги и имена файлов, которые вы хотите перечислить. Вы можете использовать подстановочные знаки имени файла (т. *Е. Для подстановки), чтобы включить соответствующие файлы и каталоги. Используйте C-gдля завершения ввода.

Другими словами, вместо перечисления одного каталога буфер Dired может перечислять любое количество каталогов и имен файлов, которые могут даже принадлежать различным деревьям каталогов.

(Неотрицательный префикс arg (т. Е.> = 0) запрашивает у вас lsсписок переключателей. Таким образом, нулевой префикс arg запрашивает у вас и переключатели, и файлы / dirs для отображения в списке: сначала lsпереключатели, а затем файлы / dirs.)

Нарисовалась
источник
Ну, я хочу сделать это в Elisp, не используя команду. Я просто хочу простой фрагмент кода, который превращает имя файла (с полным путем) в запись в буфере Dired, подобно тому, как я использую (insert ...)для вставки текста в буфер.
Ту До
1
@tudo: diredфункция elisp. Просто оцените это: (dired '("my-list" "/home/rekado/dev/script.scm" "/home/rekado/another-file"))и вы получите постоянный буфер, содержащий эти файлы, как писал @Drew.
rekado
@rekado. Спасибо. Теперь я перечитал ответ правильно, это похоже на то, что вы сказали. Я просто хочу увидеть фрагмент кода Elisp, похожий на ваш, и я подумал, что Дрю дал мне ответ на команду пользователя, когда я его увидел.
Ту До
@Drew Пожалуйста, добавьте пример rekado. Спасибо за Ваш ответ.
Ту До
Изначально я не думал, что это будет так просто, когда я вижу наборы файлов . Я думал, что мы должны заставить Dired распознавать надлежащие файловые объекты, чтобы он работал правильно.
Ту До
2

Вот команда, чтобы сделать это, когда список файлов находится в буфере, с одним файлом в строке.

(defun dired-virtual-vanilla ()
  (interactive)
  (dired (cons "*Dired*" (split-string (buffer-string) "\n" t))))
killdash9
источник