unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Alan Mackenzie <acm@muc.de>
To: emacs-devel@gnu.org
Subject: Irritation in C-u M-x grep, caused by overprotectiveness
Date: Sun, 29 Jul 2007 11:09:10 +0000	[thread overview]
Message-ID: <20070729110910.GA1955@muc.de> (raw)

Hi, Emacs!

On the command line, do this:

    $ CC_FILESEL=cc-{align,awk,bytecomp,cmds,compat,defs,engine,fonts,langs,menus,mode,styles,subword,vars}.el
    $ export CC_FILESEL

, and start (or return) to an emacs session.  Load a file from
.../lisp/progmodes, for example:

    C-x C-f ...../lisp/progmodes/cc-mode.el

.  This establishes the current directory.  With this as the current
buffer, do:

    M-x grep

, which prompts with "Run grep (like this): grep -nH -e " in the
mini-buffer.  Fill in the minibuffer like this:

    Run grep (like this): grep -nH -e kwd-clause-end $CC_FILESEL

, and start the grep with <CR>.  This will bring up, inter alia,
cc-engine.el.  Put point on a symbol in this file and do this:

    C-u M-x grep <CR>

.  Emacs 21 returns this prompt in the minibuffer:

    grep -n c-keyword-member $CC_FILESEL
                             ^^^^^^^^^^^

, which is better than what Emacs 22 currently returns:

    grep -nH c-keyword-member *.el
                              ^^^^

If I give an environment variable as "filename", the chances are I'll
want to use it in subsequent greps.  I think the current behaviour is a
bug, a regression, albeit a small one.  However, it's been irritating
me, water torture style (drip, drip, drip, drip, drip, ......), ever
since the release of Emacs 22 to the point where I just can't take it
any more.

#########################################################################

This manipulation is done in `grep-default-command' in
.../progmodes/grep.el.  In the following patch, I simply add a check for
the first character of "the filename" being ?$.  This doesn't seem very
satisfactory because it might not be portable enough.  There doesn't
seem to be a function `env-variable-name-p' which would be useful here.
    
I've also answered RMS's RFC from V1.65 from a year and 9 hours ago.  In
the process I've renamed `sh-arg-re' to `pattern-re' to make the code
more understandable.


2007-07-29  Alan Mackenzie  <acm@muc.de>

	* progmodes/grep.el (grep-default-command): Add comments.  Rename
	`sh-arg-re' to `pattern-re'.  Don't splat the filename from the
	history if it is an environment variable.


Index: grep.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/grep.el,v
retrieving revision 1.76
diff -c -r1.76 grep.el
*** grep.el	26 Jul 2007 05:27:27 -0000	1.76
--- grep.el	29 Jul 2007 10:44:14 -0000
***************
*** 537,550 ****
  (defun grep-default-command ()
    "Compute the default grep command for C-u M-x grep to offer."
    (let ((tag-default (shell-quote-argument (grep-tag-default)))
! 	;; This a regexp to match single shell arguments.
! 	;; Could someone please add comments explaining it?
! 	(sh-arg-re "\\(\\(?:\"\\(?:[^\"]\\|\\\\\"\\)+\"\\|'[^']+'\\|[^\"' \t\n]\\)+\\)")
  	(grep-default (or (car grep-history) grep-command)))
      ;; In the default command, find the arg that specifies the pattern.
      (when (or (string-match
! 	       (concat "[^ ]+\\s +\\(?:-[^ ]+\\s +\\)*"
! 		       sh-arg-re "\\(\\s +\\(\\S +\\)\\)?")
  	       grep-default)
  	      ;; If the string is not yet complete.
  	      (string-match "\\(\\)\\'" grep-default))
--- 537,551 ----
  (defun grep-default-command ()
    "Compute the default grep command for C-u M-x grep to offer."
    (let ((tag-default (shell-quote-argument (grep-tag-default)))
! 	;; pattern-re is a regexp to match a grep pattern; that's a sequence
! 	;; of single or double quoted strings and non-WS characters.  It
! 	;; doesn't try to handle backslashes properly; maybe it should.
! 	(pattern-re "\\(\\(?:\"\\(?:[^\"]\\|\\\\\"\\)+\"\\|'[^']+'\\|[^\"' \t\n]\\)+\\)")
  	(grep-default (or (car grep-history) grep-command)))
      ;; In the default command, find the arg that specifies the pattern.
      (when (or (string-match
! 	       (concat "[^ ]+\\s +\\(?:-[^ ]+\\s +\\)*" ; (POSIX) command with options
! 		       pattern-re "\\(\\s +\\(\\S +\\)\\)?") ; pattern + optional filename
  	       grep-default)
  	      ;; If the string is not yet complete.
  	      (string-match "\\(\\)\\'" grep-default))
***************
*** 552,564 ****
        ;; But first, maybe replace the file name pattern.
        (condition-case nil
  	  (unless (or (not (stringp buffer-file-name))
! 		      (when (match-beginning 2)
! 			(save-match-data
! 			  (string-match
! 			   (wildcard-to-regexp
! 			    (file-name-nondirectory
! 			     (match-string 3 grep-default)))
! 			   (file-name-nondirectory buffer-file-name)))))
  	    (setq grep-default (concat (substring grep-default
  						  0 (match-beginning 2))
  				       " *."
--- 553,566 ----
        ;; But first, maybe replace the file name pattern.
        (condition-case nil
  	  (unless (or (not (stringp buffer-file-name))
! 		      (when (match-beginning 3) ; "filename"(s) in grep-default?
! 			(or (save-match-data
! 			      (string-match
! 			       (wildcard-to-regexp
! 				(file-name-nondirectory
! 				 (match-string 3 grep-default)))
! 			       (file-name-nondirectory buffer-file-name)))
! 			    (eq (aref grep-default (match-beginning 3)) ?$))))
  	    (setq grep-default (concat (substring grep-default
  						  0 (match-beginning 2))
  				       " *."



-- 
Alan Mackenzie (Ittersbach, Germany).

             reply	other threads:[~2007-07-29 11:09 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-29 11:09 Alan Mackenzie [this message]
2007-07-29 13:49 ` Irritation in C-u M-x grep, caused by overprotectiveness Stefan Monnier
2007-07-29 15:30   ` Alan Mackenzie
2007-07-29 17:33     ` Stefan Monnier
     [not found] ` <E1IFYM6-000453-N8@fencepost.gnu.org>
2007-07-31 21:07   ` Alan Mackenzie
2007-08-01 14:07     ` Stefan Monnier
2007-08-01 14:30     ` Richard Stallman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070729110910.GA1955@muc.de \
    --to=acm@muc.de \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).