;;; find-dired.el --- run a `find' command and dired the output
-;; Copyright (C) 1992, 1994, 1995, 2000, 2002 Free Software Foundation, Inc.
+;; Copyright (C) 1992, 1994, 1995, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: Roland McGrath <roland@gnu.org>,
;; Sebastian Kremer <sk@thp.uni-koeln.de>
;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
:group 'dired
:prefix "find-")
-(defcustom find-dired-find-program "find"
- "Program used to find files."
- :group 'dired
- :type 'file)
-
;; find's -ls corresponds to these switches.
;; Note -b, at least GNU find quotes spaces etc. in filenames
;;;###autoload
:type 'string
:group 'find-dired)
+;;;###autoload
+(defcustom find-name-arg
+ (if read-file-name-completion-ignore-case
+ "-iname"
+ "-name")
+ "*Argument used to specify file name pattern.
+If `read-file-name-completion-ignore-case' is non-nil, -iname is used so that
+find also ignores case. Otherwise, -name is used."
+ :type 'string
+ :group 'find-dired
+ :version "22.2")
+
(defvar find-args nil
"Last arguments given to `find' by \\[find-dired].")
(erase-buffer)
(setq default-directory dir
find-args args ; save for next interactive call
- args (concat find-dired-find-program " . "
+ args (concat find-program " . "
(if (string= args "")
""
- (concat "\\( " args " \\) "))
- (car find-ls-option)))
+ (concat
+ (shell-quote-argument "(")
+ " " args " "
+ (shell-quote-argument ")")
+ " "))
+ (if (equal (car find-ls-option) "-exec ls -ld {} \\;")
+ (concat "-exec ls -ld "
+ (shell-quote-argument "{}")
+ " "
+ (shell-quote-argument ";"))
+ (car find-ls-option))))
;; Start the find process.
(shell-command (concat args "&") (current-buffer))
;; The next statement will bomb in classic dired (no optional arg allowed)
find . -name 'PATTERN' -ls"
(interactive
"DFind-name (directory): \nsFind-name (filename wildcard): ")
- (find-dired dir (concat "-name " (shell-quote-argument pattern))))
+ (find-dired dir (concat find-name-arg " " (shell-quote-argument pattern))))
;; This functionality suggested by
;; From: oblanc@watcgl.waterloo.edu (Olivier Blanc)
;; by FIFOs and devices. I'm not sure what's best to do
;; about symlinks, so as far as I know this is not wrong.
(find-dired dir
- (concat "-type f -exec grep " find-grep-options " -e "
+ (concat "-type f -exec " grep-program " " find-grep-options " -e "
(shell-quote-argument regexp)
- " {} \\\; ")))
+ " "
+ (shell-quote-argument "{}")
+ " "
+ (shell-quote-argument ";"))))
(defun find-dired-filter (proc string)
;; Filter for \\[find-dired] processes.
(let ((buf (process-buffer proc))
(inhibit-read-only t))
- (if (buffer-name buf) ; not killed?
- (save-excursion
- (set-buffer buf)
+ (if (buffer-name buf)
+ (with-current-buffer buf
(save-restriction
(widen)
- (save-excursion
- (let ((buffer-read-only nil)
- (end (point-max)))
- (goto-char end)
- (insert string)
- (goto-char end)
- (or (looking-at "^")
- (forward-line 1))
- (while (looking-at "^")
- (insert " ")
+ (let ((buffer-read-only nil)
+ (beg (point-max))
+ (l-opt (and (consp find-ls-option)
+ (string-match "l" (cdr find-ls-option))))
+ (ls-regexp (concat "^ +[^ \t\r\n]+\\( +[^ \t\r\n]+\\) +"
+ "[^ \t\r\n]+ +[^ \t\r\n]+\\( +[0-9]+\\)")))
+ (goto-char beg)
+ (insert string)
+ (goto-char beg)
+ (or (looking-at "^")
(forward-line 1))
- ;; Convert ` ./FILE' to ` FILE'
- ;; This would lose if the current chunk of output
- ;; starts or ends within the ` ./', so back up a bit:
- (goto-char (- end 3)) ; no error if < 0
- (while (search-forward " ./" nil t)
- (delete-region (point) (- (point) 2)))
- ;; Find all the complete lines in the unprocessed
- ;; output and process it to add text properties.
- (goto-char end)
- (if (search-backward "\n" (process-mark proc) t)
- (progn
- (dired-insert-set-properties (process-mark proc)
- (1+ (point)))
- (move-marker (process-mark proc) (1+ (point)))))
- ))))
+ (while (looking-at "^")
+ (insert " ")
+ (forward-line 1))
+ ;; Convert ` ./FILE' to ` FILE'
+ ;; This would lose if the current chunk of output
+ ;; starts or ends within the ` ./', so back up a bit:
+ (goto-char (- beg 3)) ; no error if < 0
+ (while (search-forward " ./" nil t)
+ (delete-region (point) (- (point) 2)))
+ ;; Pad the number of links and file size. This is a
+ ;; quick and dirty way of getting the columns to line up
+ ;; most of the time, but it's not foolproof.
+ (when l-opt
+ (goto-char beg)
+ (goto-char (line-beginning-position))
+ (while (re-search-forward ls-regexp nil t)
+ (replace-match (format "%4s" (match-string 1))
+ nil nil nil 1)
+ (replace-match (format "%9s" (match-string 2))
+ nil nil nil 2)
+ (forward-line 1)))
+ ;; Find all the complete lines in the unprocessed
+ ;; output and process it to add text properties.
+ (goto-char (point-max))
+ (if (search-backward "\n" (process-mark proc) t)
+ (progn
+ (dired-insert-set-properties (process-mark proc)
+ (1+ (point)))
+ (move-marker (process-mark proc) (1+ (point))))))))
;; The buffer has been killed.
(delete-process proc))))
\f
(provide 'find-dired)
-;;; arch-tag: 8edece95-af00-4221-bc74-a4bd2f75f9b0
+;; arch-tag: 8edece95-af00-4221-bc74-a4bd2f75f9b0
;;; find-dired.el ends here