Отримайте всі імена файлів у поточному буфері подвійних мереж за допомогою Elisp


10

Як випливає з назви, як я можу отримати всі записи файлів у подвійному буфері за допомогою Elisp?


1
Якщо це питання настільки просто, як здається, все, що вам потрібно, це directory-files.
Джордон Біондо

@JordonBiondo Добре знати ще одну загальну функцію. Спочатку я мав намір використовувати with-current-bufferв буфері Dired, щоб отримати список файлів або позначені файли. Тепер я можу використовувати список усіх файлів directory-files.
Tu Do

@JordonBiondo Я спробував це ще раз. Ваш метод працює лише тоді, коли у нас є "належний" Dired буфер. Якщо у нас є спеціальний буфер Dired, який вставляється з довільними файлами з різних каталогів, directory-filesце не варіант.
Ту До

Відповіді:


7

Маніпуляція позначками видається непотрібною і, можливо, проблематичною.

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

;; Silence compile-time warning:
(declare-function dired-map-dired-file-lines "dired-aux")

(defun my-dired-files ()
  "Return a list of files (only) in the current dired buffer."
  (eval-when-compile (require 'cl-lib))
  (require 'dired-aux)
  (let (flist)
    (cl-flet ((fpush (fname) (push fname flist)))
      (dired-map-dired-file-lines #'fpush))
    (nreverse flist)))

Редагувати:

У коментарях ви говорите, що ви хочете, щоб у результаті в список включили шляхи до каталогу, а також шляхи до файлів.

dired-map-dired-file-linesявно виключає каталоги, і немає можливості їх включати; але легко визначити функцію, яка виконує, просто скопіювавши оригінал та опустивши небажаний тест:

(defun my-dired-map-over-files-and-dirs (fun)
  "Perform FUN with point at the end of each file or directory line.
FUN takes one argument, the absolute filename."
  (save-excursion
    (let (file buffer-read-only)
      (goto-char (point-min))
      (while (not (eobp))
        (save-excursion
          (and (not (eolp))
               (setq file (dired-get-filename nil t)) ; nil on non-file
               (progn (end-of-line)
                      (funcall fun file))))
        (forward-line 1)))))

Просто використовуйте це замість dired-map-dired-file-linesпочаткової функції. Потім ви можете також виключити declare-functionдзвінок.

Ви, звичайно, можете додатково змінити цю нову функцію, щоб створити потрібний список безпосередньо, замість того, щоб викликати функцію для цього. Я вважаю, що більш загальний підхід на практиці прекрасний, але ви можете віддати перевагу ідеї об'єднати все це в одну функцію.


Чи є версія, що не стосується CL? Мені подобається CL, але я не в змозі використовувати залежність CL в Projectile.
Ту До

cl-fletпросто визначає функцію. Це робить код чистішим, але він все ще є лише функцією, тому визначте його, проте вам потрібно. Або взагалі не використовувати dired-map-dired-file-lines, а замість цього дублювати та змінювати його код за потребою.
phils

ти правий. Толінг знаків очищає старі позначки, що проблематично. Я вважаю вашу відповідь правильною.
Ту-ду

здається, що ваше рішення отримує лише файли, але ніякого каталогу. Будь ласка, оновіть її, коли це можливо.
Tu Do

Так, я просто змінив dired-get-filenameчастину, (dired-get-filename t t)щоб отримати все.
Ту-ду

6

Я не знаю, чи є одна функція, яка це робить, але це може працювати для вас:

(let (r)
  (dired-unmark-all-files ?\r nil)
  (dired-toggle-marks)
  (setq r (dired-get-marked-files))
  (dired-toggle-marks)
  r)

Іноді ви можете спростити це до:

(progn (dired-toggle-marks)
       (dired-get-marked-files))

3

На додаток до відповіді @ abo-abo, яка розповідає, як отримати список імен файлів (& dir):

Залежно від того, що ви хочете, замість цього ви можете використовувати dired-copy-filename-as-kill(прив’язаний w) dired-get-marked-files.

Він розміщує імена файлів у єдиній, розділеній пробілом рядку , і висуває цей рядок до kill-ring.

(Відділення простору означає, звичайно, що це не так корисно, коли деякі самі імена файлів містять пробіли. ;-))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.