[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [patch] Re: regexp repacement, how to present replacement to user?
From: |
Paul Pogonyshev |
Subject: |
Re: [patch] Re: regexp repacement, how to present replacement to user? |
Date: |
Fri, 2 Nov 2007 22:58:54 +0200 |
User-agent: |
KMail/1.7.2 |
Richard Stallman wrote:
> * replace.el (query-replace-substitute-replacement): New
> defcustom.
>
> That name is rather long, so please call it
> `query-replace-show-replacement'. (That is also a clearer
> description of what the feature does.)
>
> Other than that, it looks good to me. But please write the
> changes for NEWS and the manuals before installing this.
Here is a patch. I don't have CVS write access, so I'd be grateful
if someone installs this.
Paul
/etc/NEWS:
** C-M-% now shows replacement as it would look in the buffer, with
`\N' and `\&' substituted according to the match. Old behavior can be
restored by customizing `query-replace-show-replacement'.
** New function `match-substitute-replacement' returns the result of
`replace-match' without actually using it in the buffer.
doc/lispref/ChangeLog:
2007-11-02 Paul Pogonyshev <address@hidden>
* searching.texi (Replacing Match): Describe new
`match-substitute-replacement' and
`match-substitute-replacement-no-properties'.
doc/emacs/ChangeLog:
2007-11-02 Paul Pogonyshev <address@hidden>
* search.texi (Query Replace): Mention
`query-replace-show-replacement'.
lisp/ChangeLog:
2007-11-02 Paul Pogonyshev <address@hidden>
* replace.el (query-replace-show-replacement): New defcustom.
(perform-replace): Use `match-substitute-replacement' if
`query-replace-show-replacement' is non-nil.
2007-11-02 David Kastrup <address@hidden>
* subr.el (match-substitute-replacement): New functions.
Index: doc/lispref/searching.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/doc/lispref/searching.texi,v
retrieving revision 1.2
diff -u -r1.2 searching.texi
--- doc/lispref/searching.texi 6 Sep 2007 04:27:40 -0000 1.2
+++ doc/lispref/searching.texi 2 Nov 2007 20:32:36 -0000
@@ -1260,6 +1260,16 @@
just the text that matched @samp{\(ba*r\)}.
@end defun
address@hidden match-substitute-replacement replacement &optional fixedcase
literal string subexp
+This function returns the text that would be inserted into the buffer
+by @code{replace-match}, but without modifying the buffer. It is
+useful if you want to present the user with actual replacement result,
+with constructs like @address@hidden or @samp{\&} substituted with
+matched groups. Arguments @var{replacement} and optional
address@hidden, @var{literal}, @var{string} and @var{subexp} have the
+same meaning as for @code{replace-match}.
address@hidden defun
+
@node Simple Match Data
@subsection Simple Match Data Access
Index: doc/emacs/search.texi
===================================================================
RCS file: /cvsroot/emacs/emacs/doc/emacs/search.texi,v
retrieving revision 1.1
diff -u -r1.1 search.texi
--- doc/emacs/search.texi 6 Sep 2007 04:48:32 -0000 1.1
+++ doc/emacs/search.texi 2 Nov 2007 20:32:36 -0000
@@ -1172,7 +1172,11 @@
These commands highlight the current match using the face
@code{query-replace}. They highlight other matches using
@code{lazy-highlight} just like incremental search (@pxref{Incremental
-Search}).
+Search}). By default, @code{query-replace-regexp} will show
+substituted replacement string for the current match in the
+minibuffer. If you want to keep special sequences @samp{\&} and
address@hidden@var{n}} unexpanded, customize
address@hidden variable.
The characters you can type when you are shown a match for the string
or regexp are:
Index: lisp/replace.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/replace.el,v
retrieving revision 1.259
diff -u -r1.259 replace.el
--- lisp/replace.el 26 Jul 2007 05:26:32 -0000 1.259
+++ lisp/replace.el 2 Nov 2007 20:32:36 -0000
@@ -69,6 +69,12 @@
:group 'matching
:version "22.1")
+(defcustom query-replace-show-replacement t
+ "*Non-nil means to show what actual replacement text will be."
+ :type 'boolean
+ :group 'matching
+ :version "23.1")
+
(defcustom query-replace-highlight t
"*Non-nil means to highlight matches during query replacement."
:type 'boolean
@@ -1570,10 +1576,17 @@
(or delimited-flag regexp-flag) case-fold-search)
;; Bind message-log-max so we don't fill up the message log
;; with a bunch of identical messages.
- (let ((message-log-max nil))
+ (let ((message-log-max nil)
+ (replacement-presentation
+ (if query-replace-show-replacement
+ (save-match-data
+ (set-match-data real-match-data)
+ (match-substitute-replacement next-replacement
+ nocasify literal))
+ next-replacement)))
(message message
(query-replace-descr from-string)
- (query-replace-descr next-replacement)))
+ (query-replace-descr replacement-presentation)))
(setq key (read-event))
;; Necessary in case something happens during read-event
;; that clobbers the match data.
Index: lisp/subr.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/subr.el,v
retrieving revision 1.565
diff -u -r1.565 subr.el
--- lisp/subr.el 27 Oct 2007 09:07:15 -0000 1.565
+++ lisp/subr.el 2 Nov 2007 20:32:39 -0000
@@ -2709,6 +2709,24 @@
(buffer-substring-no-properties (match-beginning num)
(match-end num)))))
+
+(defun match-substitute-replacement (replacement
+ &optional fixedcase literal string subexp)
+ "Return REPLACEMENT as it will be inserted by `replace-match'.
+In other words, all back-references in the form `\\&' and `\\N'
+are substituted with actual strings matched by the last search.
+Optional FIXEDCASE, LITERAL, STRING and SUBEXP have the same
+meaning as for `replace-match'."
+ (let ((match (match-string 0 string)))
+ (save-match-data
+ (set-match-data (mapcar (lambda (x)
+ (if (numberp x)
+ (- x (match-beginning 0))
+ x))
+ (match-data t)))
+ (replace-match replacement fixedcase literal match subexp))))
+
+
(defun looking-back (regexp &optional limit greedy)
"Return non-nil if text before point matches regular expression REGEXP.
Like `looking-at' except matches before point, and is slower.