Commit 249902d5 authored by Roland Winkler's avatar Roland Winkler

Allow refining the *Find* buffer of find-dired. (Bug#29513)

* find-dired.el (find-dired-refine-function): New user variable.
(find-dired-sentinel): Use it.  Simplify.
(find-dired-sort-by-filename): New function.
parent e92dac34
Pipeline #1998 failed with stage
in 3 seconds
...@@ -580,6 +580,11 @@ remapped to these, respectively. ...@@ -580,6 +580,11 @@ remapped to these, respectively.
+++ +++
*** New command 'dired-create-empty-file'. *** New command 'dired-create-empty-file'.
** Find-Dired
*** New customizable variable 'find-dired-refine-function'.
The default value is 'find-dired-sort-by-filename'.
** Change Logs and VC ** Change Logs and VC
*** Recording ChangeLog entries doesn't require an actual file. *** Recording ChangeLog entries doesn't require an actual file.
......
...@@ -117,6 +117,14 @@ find also ignores case. Otherwise, -name is used." ...@@ -117,6 +117,14 @@ find also ignores case. Otherwise, -name is used."
:group 'find-dired :group 'find-dired
:version "22.2") :version "22.2")
(defcustom find-dired-refine-function #'find-dired-sort-by-filename
"If non-nil, a function for refining the *Find* buffer of `find-dired'.
This function takes no arguments. The *Find* buffer is narrowed to the
output of `find' (one file per line) when this function is called."
:version "27.1"
:group 'find-dired
:type 'function)
(defvar find-args nil (defvar find-args nil
"Last arguments given to `find' by \\[find-dired].") "Last arguments given to `find' by \\[find-dired].")
...@@ -334,28 +342,43 @@ specifies what to use in place of \"-ls\" as the final argument." ...@@ -334,28 +342,43 @@ specifies what to use in place of \"-ls\" as the final argument."
(delete-process proc)))) (delete-process proc))))
(defun find-dired-sentinel (proc state) (defun find-dired-sentinel (proc state)
;; Sentinel for \\[find-dired] processes. "Sentinel for \\[find-dired] processes."
(let ((buf (process-buffer proc)) (let ((buf (process-buffer proc)))
(inhibit-read-only t))
(if (buffer-name buf) (if (buffer-name buf)
(with-current-buffer buf (with-current-buffer buf
(let ((buffer-read-only nil)) (let ((inhibit-read-only t))
(save-excursion (save-excursion
(goto-char (point-max)) (save-restriction
(let ((point (point))) (widen)
(insert "\n find " state) (when (boundp 'find-dired-refine-function)
(forward-char -1) ;Back up before \n at end of STATE. ;; `find-dired-filter' puts two whitespace characters
(insert " at " (substring (current-time-string) 0 19)) ;; at the beginning of every line.
(dired-insert-set-properties point (point))) (narrow-to-region (point) (- (point-max) 2))
(setq mode-line-process (funcall find-dired-refine-function)
(concat ":" (widen))
(symbol-name (process-status proc)))) (let ((point (point-max)))
(goto-char point)
(insert "\n find "
(substring state 0 -1) ; omit \n at end of STATE.
" at " (substring (current-time-string) 0 19))
(dired-insert-set-properties point (point))))
(setq mode-line-process
(format ":%s" (process-status proc)))
;; Since the buffer and mode line will show that the ;; Since the buffer and mode line will show that the
;; process is dead, we can delete it now. Otherwise it ;; process is dead, we can delete it now. Otherwise it
;; will stay around until M-x list-processes. ;; will stay around until M-x `list-processes'.
(delete-process proc) (delete-process proc)
(force-mode-line-update))) (force-mode-line-update))))
(message "find-dired %s finished." (current-buffer)))))) (message "find-dired %s finished." buf))))
(defun find-dired-sort-by-filename ()
"Sort entries in *Find* buffer by file name lexicographically."
(sort-subr nil 'forward-line 'end-of-line
(lambda ()
(buffer-substring-no-properties
(next-single-property-change
(point) 'dired-filename)
(line-end-position)))))
(provide 'find-dired) (provide 'find-dired)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment