Answers:
操纵标记似乎不必要,甚至有问题。
显然,内部存在执行这种事情的功能(尽管没有充分记录)。这是一个简单的方法:
;; 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-flet
只是定义一个函数。它使代码更简洁,但它仍然只是一个函数,因此请定义一个。或根本不使用dired-map-dired-file-lines
,而是根据需要复制和修改其代码。
dired-get-filename
一部分(dired-get-filename t t)
以获取所有内容。
directory-files
。