Commit bc3b20b4 authored by Allen Li's avatar Allen Li Committed by Lars Ingebrigtsen
Browse files

find-dired: Add find-dired-with-command

Add a command that runs and sets up the find-dired buffer with an
arbitrary find command.  Also rewrite the existing find-dired commands
using it.

The set of commands possible with find-dired is limited; the new
command allows users to run the full set of commands, but also leaves
the responsibility to the user to construct the command manually.

* lisp/find-dired.el (find-command-history): New var.
(find-dired-with-command): New command.
(find-dired): Rewritten with new command.
parent 995fb167
Pipeline #18824 failed with stages
in 191 minutes and 28 seconds
......@@ -1381,6 +1381,13 @@ doesn't work on other systems. Also see etc/PROBLEMS.
These are used to alter an URL before using it. By default it removes
the common "utm_" trackers from URLs.
** Find-Dired
*** New command 'find-dired-with-command'.
This enables users to run 'find-dired' with an arbitrary command,
enabling running commands previously unsupported and also enabling new
commands to be built on top.
** Gnus
......@@ -154,6 +154,9 @@ output of `find' (one file per line) when this function is called."
;; History of find-args values entered in the minibuffer.
(defvar find-args-history nil)
(defvar find-command-history nil
"History of commands passed interactively to `find-dired-with-command'.")
(defvar dired-sort-inhibit)
......@@ -171,6 +174,38 @@ it finishes, type \\[kill-find]."
(interactive (list (read-directory-name "Run find in directory: " nil "" t)
(read-string "Run find (with args): " find-args
'(find-args-history . 1))))
(setq find-args args ; save for next interactive call
args (concat find-program " . "
(if (string= args "")
(shell-quote-argument "(")
" " args " "
(shell-quote-argument ")")
" "))
(find-dired-with-command dir args))
(defun find-dired-with-command (dir command)
"Run `find' and go into Dired mode on a buffer of the output.
The user-supplied COMMAND is run after changing into DIR and should look like
find . GLOBALARGS \\( ARGS \\) -ls
The car of the variable `find-ls-option' specifies what to
use in place of \"-ls\" as the starting input.
Collect output in the \"*Find*\" buffer. To kill the job before
it finishes, type \\[kill-find]."
(list (read-directory-name "Run find in directory: " nil "" t)
(read-string "Run find command: "
(cons (concat find-program
" . \\( \\) "
(+ 1 (length find-program) (length " . \\( ")))
(let ((dired-buffers dired-buffers))
;; Expand DIR ("" means default-directory), and make sure it has a
;; trailing slash.
......@@ -199,19 +234,9 @@ it finishes, type \\[kill-find]."
(setq buffer-read-only nil)
(setq default-directory dir
find-args args ; save for next interactive call
args (concat find-program " . "
(if (string= args "")
(shell-quote-argument "(")
" " args " "
(shell-quote-argument ")")
" "))
(setq default-directory dir)
;; Start the find process.
(shell-command (concat args "&") (current-buffer))
(shell-command (concat command "&") (current-buffer))
(dired-mode dir (cdr find-ls-option))
(let ((map (make-sparse-keymap)))
(set-keymap-parent map (current-local-map))
......@@ -220,7 +245,7 @@ it finishes, type \\[kill-find]."
(setq-local dired-sort-inhibit t)
(setq-local revert-buffer-function
(lambda (_ignore-auto _noconfirm)
(find-dired dir find-args)))
(find-dired-with-command dir command)))
;; Set subdir-alist so that Tree Dired will work:
(if (fboundp 'dired-simple-subdir-alist)
;; will work even with nested dired format (dired-nstd.el,v 1.15
......@@ -240,7 +265,7 @@ it finishes, type \\[kill-find]."
;; Make second line a ``find'' line in analogy to the ``total'' or
;; ``wildcard'' line.
(let ((point (point)))
(insert " " args "\n")
(insert " " command "\n")
(dired-insert-set-properties point (point)))
(setq buffer-read-only t)
(let ((proc (get-buffer-process (current-buffer))))
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