使用Elisp获取当前Dired缓冲区中的所有文件名


10

如标题所示,如何使用Elisp获取Dired缓冲区中的所有文件条目?


1
如果这个问题看起来很简单,那么您所需要做的就是directory-files
Jordon Biondo

@JordonBiondo很高兴知道另一个更通用的功能。最初,我打算with-current-buffer在Dired缓冲区上使用以获取文件列表或标记文件。有关所有文件的列表,我现在可以使用directory-files
Tu Do

@JordonBiondo我再试一次。仅当我们具有“适当的” Dired缓冲区时,您的方法才有效。如果我们有自定义Dired缓冲区,该缓冲区插入了来自不同目录的任意文件,则directory-files不是一种选择。
Tu Do

Answers:


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,但无法在Projectile中使用CL依赖项。
Tu Do

cl-flet只是定义一个函数。它使代码更简洁,但它仍然只是一个函数,因此请定义一个。或根本不使用dired-map-dired-file-lines,而是根据需要复制和修改其代码。
菲尔2014年

你是对的。切换标记会清除旧标记,这是有问题的。我认为您的答案是正确的。
Tu Do

您的解决方案似乎只检索文件,而不检索目录。请尽可能更新它。
Tu Do

是的,我只是修改了dired-get-filename一部分(dired-get-filename t t)以获取所有内容。
Tu Do

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的答案,它告诉你如何得到一个列表文件(目录)名称:

根据您的需要,您也可以使用dired-copy-filename-as-kill(绑定到w)代替dired-get-marked-files

它将文件名放入单个以空格分隔的字符串中,并将该字符串推入kill-ring

(当然,空格分隔意味着当某些文件名本身包含空格字符时,它没有太大帮助。;-))

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.