Use find -exec with '+' for grep-find if supported.
authorGlenn Morris <rgm@gnu.org>
Sat, 2 Apr 2011 18:52:08 +0000 (11:52 -0700)
committerGlenn Morris <rgm@gnu.org>
Sat, 2 Apr 2011 18:52:08 +0000 (11:52 -0700)
* lisp/progmodes/grep.el (grep-find-use-xargs): Doc fix.
(grep-compute-defaults): Check for `-exec COMMAND +' support.
Set grep-find-use-xargs, grep-find-command, and grep-find-template
accordingly.  Don't add the null-device if not needed.

lisp/ChangeLog
lisp/progmodes/grep.el

index ba9532f..006d0aa 100644 (file)
@@ -1,5 +1,10 @@
 2011-04-02  Glenn Morris  <rgm@gnu.org>
 
+       * progmodes/grep.el (grep-find-use-xargs): Doc fix.
+       (grep-compute-defaults): Check for `-exec COMMAND +' support.
+       Set grep-find-use-xargs, grep-find-command, and grep-find-template
+       accordingly.  Don't add the null-device if not needed.
+
        * files.el (save-some-buffers): Doc fix.
 
 2011-04-02  Eli Zaretskii  <eliz@gnu.org>
index a4c9b7f..58f2ee9 100644 (file)
@@ -440,10 +440,11 @@ This variable's value takes effect when `grep-compute-defaults' is called.")
 
 ;;;###autoload
 (defvar grep-find-use-xargs nil
-  "Non-nil means that `grep-find' uses the `xargs' utility by default.
-If `exec', use `find -exec'.
+  "How to invoke find and grep.
+If `exec', use `find -exec {} ;'.
+If `exec-plus' use `find -exec {} +'.
 If `gnu', use `find -print0' and `xargs -0'.
-Any other non-nil value means to use `find -print' and `xargs'.
+Any other value means to use `find -print' and `xargs'.
 
 This variable's value takes effect when `grep-compute-defaults' is called.")
 
@@ -561,6 +562,10 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'."
        (unless grep-find-use-xargs
          (setq grep-find-use-xargs
                (cond
+                ((grep-probe find-program
+                             `(nil nil nil ,null-device "-exec" "echo"
+                                   "{}" "+"))
+                 'exec-plus)
                 ((and
                   (grep-probe find-program `(nil nil nil ,null-device "-print0"))
                   (grep-probe xargs-program `(nil nil nil "-0" "-e" "echo")))
@@ -575,13 +580,17 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'."
                       ;; forward slashes as directory separators.
                       (format "%s . -type f -print0 | \"%s\" -0 -e %s"
                               find-program xargs-program grep-command))
-                     ((eq grep-find-use-xargs 'exec)
+                     ((memq grep-find-use-xargs '(exec exec-plus))
                       (let ((cmd0 (format "%s . -type f -exec %s"
-                                          find-program grep-command)))
+                                          find-program grep-command))
+                            (null (if grep-use-null-device
+                                      (format "%s " null-device)
+                                    "")))
                         (cons
-                         (format "%s {} %s %s"
-                                 cmd0 null-device
-                                 (shell-quote-argument ";"))
+                         (if (eq grep-find-use-xargs 'exec-plus)
+                             (format "%s %s{} +" cmd0 null)
+                           (format "%s {} %s%s" cmd0 null
+                                   (shell-quote-argument ";")))
                          (1+ (length cmd0)))))
                      (t
                       (format "%s . -type f -print | \"%s\" %s"
@@ -589,14 +598,20 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'."
        (unless grep-find-template
          (setq grep-find-template
                (let ((gcmd (format "%s <C> %s <R>"
-                                   grep-program grep-options)))
+                                   grep-program grep-options))
+                     (null (if grep-use-null-device
+                               (format "%s " null-device)
+                             "")))
                  (cond ((eq grep-find-use-xargs 'gnu)
                         (format "%s . <X> -type f <F> -print0 | \"%s\" -0 -e %s"
                                 find-program xargs-program gcmd))
                        ((eq grep-find-use-xargs 'exec)
-                        (format "%s . <X> -type f <F> -exec %s {} %s %s"
-                                find-program gcmd null-device
+                        (format "%s . <X> -type f <F> -exec %s {} %s%s"
+                                find-program gcmd null
                                 (shell-quote-argument ";")))
+                       ((eq grep-find-use-xargs 'exec-plus)
+                        (format "%s . <X> -type f <F> -exec %s %s{} +"
+                                find-program gcmd null))
                        (t
                         (format "%s . <X> -type f <F> -print | \"%s\" %s"
                                 find-program xargs-program gcmd))))))))