Subject: bug#4301 closed by Juri Linkov <[email-masked]> (Re: bug#4301: rgrep/lgrep defaults)

From: [email-masked] (Emacs bug Tracking System)
Date: Mon, 07 Dec 2009 17:45:07 +0000

This is an automatic notification regarding your bug report
which was filed against the emacs package:

#4301: rgrep/lgrep defaults

It has been closed by Juri Linkov <[email-masked]>.

Their explanation is attached below along with your original report.
If this explanation is unsatisfactory and you have not received a
better one in a separate message then please contact Juri Linkov <[email-masked]> by
replying to this email.

-- 
4301: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=4301
Emacs Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#4301: rgrep/lgrep defaults
From: Juri Linkov <[email-masked]>
To: [email-masked]
Date: Mon, 07 Dec 2009 19:36:30 +0200

> Currently reading a file name pattern in rgep/lgrep provides no completion.
> I think it would be better to provide file completion for the case when
> the user wants to limit the search to one particular file in the current
> directory, or to build a file name pattern based on the file in the
> current directory.

Done.

-- 
Juri Linkov
http://www.jurta.org/emacs/

Subject: rgrep/lgrep defaults
From: Juri Linkov <[email-masked]>
To: [email-masked]
Date: Mon, 31 Aug 2009 22:59:02 +0300

Currently rgep/lgrep proposes to search in C files by default.
This default value assumes that majority of Emacs users prefer searching
only in C files.  This can't be true.  So the current default value is
useless.  I think a better default value is to search _all_ files, where
all includes hidden dot files as well.  rgrep already searches in dot
files, but lgrep doesn't.  To remove this inconsistency we could bind
"all" to "* .*" in `grep-files-aliases'.  Placing it first makes it the
default value which reads clear and understandable in the default prompt as:

  Search for "text" in files (default all):

instead of the current:

  Search for "text" in files (default ch):

"asm" could be moved to the bottom of the list of default values
in `grep-files-aliases', so this less frequent alias comes last
when retrieving via M-n.  Also this requires removing ("ch" "el")
from the pre-defined default of `grep-files-history' and moving
("ch" "el") higher in `grep-files-aliases'.

Another inconsistency is that rgrep provides the default command that
ignores vcs directories, but doesn't ignore vcs files like ".v",
backup files "~" "\\`#" "\\`.#" and other ignorable files from
`completion-ignored-extensions'.  This can be improved by adding
new customizable variable `grep-find-ignored-files' where the nil
option disables it easily.  The same nil option is also useful for
`grep-find-ignored-directories' to disable it at once than deleting
every value from the default list one by one.

For rgrep, `grep-find-ignored-files' means mapping its list to
something like

  \(-name .\#\* -o -name \*\~ -o -name \*.o -o ... \) -prune -o

For lgrep, `grep-find-ignored-files' means mapping its list to
something like

  grep --exclude=.\#\* --exclude=\*\~ --exclude=\*.o ...

Below is a patch that implements this:

Index: lisp/progmodes/grep.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/progmodes/grep.el,v
retrieving revision 1.106
diff -c -w -b -r1.106 grep.el
*** lisp/progmodes/grep.el	30 Aug 2009 23:46:09 -0000	1.106
--- lisp/progmodes/grep.el	31 Aug 2009 19:54:27 -0000
***************
*** 176,193 ****
    :group 'grep)
  
  (defcustom grep-files-aliases
!   '(("asm" .    "*.[sS]")
      ("c" .     "*.c")
      ("cc" .    "*.cc *.cxx *.cpp *.C *.CC *.c++")
      ("cchh" .    "*.cc *.[ch]xx *.[ch]pp *.[CHh] *.CC *.HH *.[ch]++")
      ("hh" .    "*.hxx *.hpp *.[Hh] *.HH *.h++")
-     ("ch" .    "*.[ch]")
-     ("el" .    "*.el")
      ("h" .     "*.h")
      ("l" .      "[Cc]hange[Ll]og*")
      ("m" .     "[Mm]akefile*")
      ("tex" .    "*.tex")
!     ("texi" .   "*.texi"))
    "*Alist of aliases for the FILES argument to `lgrep' and `rgrep'."
    :type 'alist
    :group 'grep)
--- 176,194 ----
    :group 'grep)
  
  (defcustom grep-files-aliases
!   '(("all" .   "* .*")
!     ("el" .    "*.el")
!     ("ch" .    "*.[ch]")
      ("c" .     "*.c")
      ("cc" .    "*.cc *.cxx *.cpp *.C *.CC *.c++")
      ("cchh" .  "*.cc *.[ch]xx *.[ch]pp *.[CHh] *.CC *.HH *.[ch]++")
      ("hh" .    "*.hxx *.hpp *.[Hh] *.HH *.h++")
      ("h" .     "*.h")
      ("l" .     "[Cc]hange[Ll]og*")
      ("m" .     "[Mm]akefile*")
      ("tex" .   "*.tex")
!     ("texi" .  "*.texi")
!     ("asm" .   "*.[sS]"))
    "*Alist of aliases for the FILES argument to `lgrep' and `rgrep'."
    :type 'alist
    :group 'grep)
***************
*** 197,203 ****
    "*List of names of sub-directories which `rgrep' shall not recurse into.
  If an element is a cons cell, the car is called on the search directory
  to determine whether cdr should not be recursed into."
!   :type '(repeat string)
    :group 'grep)
  
  (defcustom grep-error-screen-columns nil
--- 198,217 ----
    "*List of names of sub-directories which `rgrep' shall not recurse into.
  If an element is a cons cell, the car is called on the search directory
  to determine whether cdr should not be recursed into."
!   :type '(choice (repeat :tag "Ignored directories" string)
! 		 (const :tag "No ignored directories" nil))
!   :group 'grep)
! 
! (defcustom grep-find-ignored-files
!   (cons ".#*" (delq nil (mapcar (lambda (s)
! 				  (unless (string-match-p "/\\'" s)
! 				    (concat "*" s)))
! 				completion-ignored-extensions)))
!   "*List of names of file names which `rgrep' and `lgrep' shall exclude.
! If an element is a cons cell, the car is called on the search directory
! to determine whether cdr should not be excluded."
!   :type '(choice (repeat :tag "Ignored file" string)
! 		 (const :tag "No ignored files" nil))
    :group 'grep)
  
  (defcustom grep-error-screen-columns nil
***************
*** 421,427 ****
  
  ;; History of lgrep and rgrep regexp and files args.
  (defvar grep-regexp-history nil)
! (defvar grep-files-history '("ch" "el"))
  
  ;;;###autoload
  (defun grep-process-setup ()
--- 435,441 ----
  
  ;; History of lgrep and rgrep regexp and files args.
  (defvar grep-regexp-history nil)
! (defvar grep-files-history nil)
  
  ;;;###autoload
  (defun grep-process-setup ()
***************
*** 524,530 ****
  		(format "%s %s " grep-program grep-options)))
  	(unless grep-template
  	  (setq grep-template
! 		(format "%s <C> %s <R> <F>" grep-program grep-options)))
  	(unless grep-find-use-xargs
  	  (setq grep-find-use-xargs
  		(cond
--- 538,544 ----
  		(format "%s %s " grep-program grep-options)))
  	(unless grep-template
  	  (setq grep-template
! 		(format "%s <X> <C> %s <R> <F>" grep-program grep-options)))
  	(unless grep-find-use-xargs
  	  (setq grep-find-use-xargs
  		(cond
***************
*** 753,760 ****
  	 (fn (and bn
  		  (stringp bn)
  		  (file-name-nondirectory bn)))
! 	 (default
! 	   (or (and fn
  		    (let ((aliases grep-files-aliases)
  			  alias)
  		      (while aliases
--- 767,774 ----
  	 (fn (and bn
  		  (stringp bn)
  		  (file-name-nondirectory bn)))
! 	 (default-alias
! 	   (and fn
  		(let ((aliases grep-files-aliases)
  		      alias)
  		  (while aliases
***************
*** 763,772 ****
  			(if (string-match (wildcard-to-regexp (cdr alias)) fn)
  			    (setq aliases nil)
  			  (setq alias nil)))
! 		      (cdr alias)))
  	       (and fn
  		    (let ((ext (file-name-extension fn)))
! 		      (and ext (concat "*." ext))))
  	       (car grep-files-history)
  	       (car (car grep-files-aliases))))
  	 (files (read-string
--- 777,790 ----
  		    (if (string-match (wildcard-to-regexp (cdr alias)) fn)
  			(setq aliases nil)
  		      (setq alias nil)))
! 		  (cdr alias))))
! 	 (default-extension
  	   (and fn
  		(let ((ext (file-name-extension fn)))
! 		  (and ext (concat "*." ext)))))
! 	 (default
! 	   (or default-alias
! 	       default-extension
  	       (car grep-files-history)
  	       (car (car grep-files-aliases))))
  	 (files (read-string
***************
*** 774,780 ****
  			 "\" in files"
  			 (if default (concat " (default " default ")"))
  			 ": ")
! 		 nil 'grep-files-history default)))
      (and files
  	 (or (cdr (assoc files grep-files-aliases))
  	     files))))
--- 792,801 ----
  			 "\" in files"
  			 (if default (concat " (default " default ")"))
  			 ": ")
! 		 nil 'grep-files-history
! 		 (delete-dups
! 		  (delq nil (append (list default default-alias default-extension)
! 				    (mapcar 'car grep-files-aliases)))))))
      (and files
  	 (or (cdr (assoc files grep-files-aliases))
  	     files))))
***************
*** 822,828 ****
  	(setq command (grep-expand-template
  		       grep-template
  		       regexp
! 		       files))
  	(when command
  	  (if confirm
  	      (setq command
--- 843,862 ----
  	(setq command (grep-expand-template
  		       grep-template
  		       regexp
! 		       files
! 		       nil
! 		       (and grep-find-ignored-files
! 			    (concat " --exclude="
! 				    (mapconcat
! 				     #'(lambda (ignore)
! 					 (cond ((stringp ignore)
! 						(shell-quote-argument ignore))
! 					       ((consp ignore)
! 						(and (funcall (car ignore) dir)
! 						     (shell-quote-argument
! 						      (cdr ignore))))))
! 				     grep-find-ignored-files
! 				     " --exclude=")))))
  	(when command
  	  (if confirm
  	      (setq command
***************
*** 893,898 ****
--- 927,933 ----
  			      " "
  			      (shell-quote-argument ")"))
  		      dir
+ 		      (concat
  		       (and grep-find-ignored-directories
  			    (concat (shell-quote-argument "(")
  				    ;; we should use shell-quote-argument here
***************
*** 911,917 ****
                                       " -o -path ")
  				    " "
  				    (shell-quote-argument ")")
! 				    " -prune -o ")))))
  	(when command
  	  (if confirm
  	      (setq command
--- 946,969 ----
  				     " -o -path ")
  				    " "
  				    (shell-quote-argument ")")
! 				    " -prune -o "))
! 		       (and grep-find-ignored-files
! 			    (concat (shell-quote-argument "(")
! 				    ;; we should use shell-quote-argument here
! 				    " -name "
! 				    (mapconcat
! 				     #'(lambda (ignore)
! 					 (cond ((stringp ignore)
! 						(shell-quote-argument ignore))
! 					       ((consp ignore)
! 						(and (funcall (car ignore) dir)
! 						     (shell-quote-argument
! 						      (cdr ignore))))))
! 				     grep-find-ignored-files
! 				     " -o -name ")
! 				    " "
! 				    (shell-quote-argument ")")
! 				    " -prune -o "))))))
  	(when command
  	  (if confirm
  	      (setq command

-- 
Juri Linkov
http://www.jurta.org/emacs/