Das Manipulieren von Markierungen erscheint unnötig und möglicherweise problematisch.
Offensichtlich gibt es Funktionen, die dazu bestimmt sind (wenn auch nicht gut dokumentiert). Hier ist ein einfacher Ansatz:
;; 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)))
Bearbeiten:
In den Kommentaren möchten Sie, dass die resultierende Liste sowohl die Verzeichnispfade als auch die Dateipfade enthält.
dired-map-dired-file-lines
schließt Verzeichnisse ausdrücklich aus, und es gibt keine Möglichkeit, sie einzuschließen. Es ist jedoch einfach, eine Funktion zu definieren, die dies tut, indem Sie einfach das Original kopieren und den unerwünschten Test weglassen:
(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)))))
Verwenden Sie dies einfach anstelle dired-map-dired-file-lines
der ursprünglichen Funktion. Sie können den declare-function
Anruf dann auch ausschließen .
Sie können diese neue Funktion natürlich weiter modifizieren, um die gewünschte Liste direkt zu erstellen, anstatt eine Funktion aufzurufen, um dies zu tun. Ich bin der Meinung, dass der allgemeinere Ansatz in der Praxis in Ordnung ist, aber Sie könnten die Idee bevorzugen, alles in eine einzige Funktion zu packen.
directory-files
.