Програмно вставляйте файли в буфер Обмежений


10

У мене є список імен файлів (з повним контуром), і я хочу створити подвійний буфер, в якому буде вказано цей набір файлів. Як би я пішов робити це?

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

Без використання зовнішніх залежностей.


Будь ласка, поясніть. Чи є рядки у вашому списку а) назви файлів, які ви хочете створити, або б) вміст файлу (те, для чого у вас абсолютний шлях)?
День

@Dan Список імен файлів з абсолютними шляхами. Просто імена файлів.
Tu Do

1
Якщо я вас правильно зрозумів, ви можете просто скористатися, (find-file your-directory-path)щоб отримати відповідний diredбуфер (наприклад, (find-file "/tmp/")відкриє вашу tmpпапку в diredбуфері).
Дан

1
Я відредагував ваше запитання, виходячи з того, що ви сказали в цих коментарях. Не соромтесь відкатати, якщо я помилився.
Малабарба

3
Якщо ви хочете запитати про файлові об’єкти в elisp, це зовсім інше питання, з дуже короткою відповіддю: таких немає. :-)
Малабарба

Відповіді:


20

C-h f diredговорить вам відповідь. Просто переведіть diredв якості DIRNAMEаргументу список, який має в своєму автомобілі ім'я в'язаного буфера, яке ви хочете (будь-яку рядок), а також 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 може перелічити будь-яку кількість каталогів та імен файлів, які можуть навіть належати до різних дерев каталогів.

(Негативний аргумент префікса (тобто> = 0) пропонує вам lsперемикачі лістингу. Отже, нульовий аргумент з префіксом пропонує вам як перемикачі, так і файли / dirs у списку: спочатку lsперемикачі, а потім файли / dirs.)


Ну я хочу це зробити в Еліспі, не використовуючи команди. Я просто хочу простий фрагмент коду, який перетворить ім'я файлу (з повним контуром) у запис у в'язаному буфері, подібно до того, як я використовую (insert ...)для вставки тексту в буфер.
Tu Do

1
@tudo: diredє функцією еліпса . Просто оцініть це: (dired '("my-list" "/home/rekado/dev/script.scm" "/home/rekado/another-file"))і ви отримаєте відібраний буфер, що містить ці файли, як написав @Drew.
rekado

@rekado. Дякую. Тепер я перечитав відповідь правильно, це як те, що ви сказали. Я просто хочу побачити фрагмент коду Elisp, як ваш, і я подумав, що Дрю дав мені відповідь команди, коли я його проглянув.
Ту До

@Drew Додайте приклад rekado. Дякую за вашу відповідь.
Ту До

Спочатку я не думав, що це буде так просто, коли я бачу набори файлів . Я думав, що ми повинні змусити Dired розпізнавати належні файлові об’єкти, щоб він нормально працював.
Tu Do

2

Ось команда зробити це, коли список файлів знаходиться в буфері, з одним файлом у рядку.

(defun dired-virtual-vanilla ()
  (interactive)
  (dired (cons "*Dired*" (split-string (buffer-string) "\n" t))))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.