Package: emacs;
Reported by: linuxfever <linuxfever <at> yahoo.gr>
Date: Sun, 26 Feb 2012 01:31:01 UTC
Severity: wishlist
Done: Juri Linkov <juri <at> jurta.org>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Juri Linkov <juri <at> jurta.org> To: 10885 <at> debbugs.gnu.org Subject: bug#10885: Replace expressions: enhance functionality when searching in filled paragraphs Date: Sun, 02 Sep 2012 14:32:33 +0300
> 1. Add a new defcustom like `case-replace' with a name e.g. > `replace-lax-whitespace' and use it in `perform-replace'. > When non-nil, spaces will match any whitespace in replacement. This is implemented in the following patch: === modified file 'lisp/replace.el' --- lisp/replace.el 2012-08-06 05:33:39 +0000 +++ lisp/replace.el 2012-09-02 11:27:15 +0000 @@ -33,6 +33,13 @@ (defcustom case-replace t :type 'boolean :group 'matching) +(defcustom replace-lax-whitespace nil + "Non-nil means `query-replace' matches a sequence of whitespace chars. +When you enter a space or spaces in the strings or regexps to be replaced, +it will match any sequence matched by the regexp `search-whitespace-regexp'." + :type 'boolean + :group 'matching) + (defvar query-replace-history nil "Default history list for query-replace commands. See `query-replace-from-history-variable' and @@ -226,6 +233,10 @@ (defun query-replace (from-string to-str matched is all caps, or capitalized, then its replacement is upcased or capitalized.) +If `replace-lax-whitespace' is non-nil, a space or spaces in the string +to be replaced will match a sequence of whitespace chars defined by the +regexp in `search-whitespace-regexp'. + Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace only matches surrounded by word boundaries. Fourth and fifth arg START and END specify the region to operate on. @@ -270,6 +281,10 @@ (defun query-replace-regexp (regexp to-s all caps, or capitalized, then its replacement is upcased or capitalized.) +If `replace-lax-whitespace' is non-nil, a space or spaces in the regexp +to be replaced will match a sequence of whitespace chars defined by the +regexp in `search-whitespace-regexp'. + Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace only matches surrounded by word boundaries. Fourth and fifth arg START and END specify the region to operate on. @@ -346,6 +361,10 @@ (defun query-replace-regexp-eval (regexp Preserves case in each replacement if `case-replace' and `case-fold-search' are non-nil and REGEXP has no uppercase letters. +If `replace-lax-whitespace' is non-nil, a space or spaces in the regexp +to be replaced will match a sequence of whitespace chars defined by the +regexp in `search-whitespace-regexp'. + Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace only matches that are surrounded by word boundaries. Fourth and fifth arg START and END specify the region to operate on." @@ -437,6 +456,10 @@ (defun replace-string (from-string to-st \(Preserving case means that if the string matched is all caps, or capitalized, then its replacement is upcased or capitalized.) +If `replace-lax-whitespace' is non-nil, a space or spaces in the string +to be replaced will match a sequence of whitespace chars defined by the +regexp in `search-whitespace-regexp'. + In Transient Mark mode, if the mark is active, operate on the contents of the region. Otherwise, operate from point to the end of the buffer. @@ -475,6 +498,10 @@ (defun replace-regexp (regexp to-string Preserve case in each match if `case-replace' and `case-fold-search' are non-nil and REGEXP has no uppercase letters. +If `replace-lax-whitespace' is non-nil, a space or spaces in the regexp +to be replaced will match a sequence of whitespace chars defined by the +regexp in `search-whitespace-regexp'. + In Transient Mark mode, if the mark is active, operate on the contents of the region. Otherwise, operate from point to the end of the buffer. @@ -1717,12 +1745,12 @@ (defun replace-match-maybe-edit (newtext (replace-match newtext fixedcase literal) noedit) -(defvar replace-search-function 'search-forward +(defvar replace-search-function nil "Function to use when searching for strings to replace. It is used by `query-replace' and `replace-string', and is called with three arguments, as if it were `search-forward'.") -(defvar replace-re-search-function 're-search-forward +(defvar replace-re-search-function nil "Function to use when searching for regexps to replace. It is used by `query-replace-regexp', `replace-regexp', `query-replace-regexp-eval', and `map-query-replace-regexp'. @@ -1755,9 +1783,16 @@ (defun perform-replace (from-string repl (nocasify (not (and case-replace case-fold-search))) (literal (or (not regexp-flag) (eq regexp-flag 'literal))) (search-function - (if regexp-flag - replace-re-search-function - replace-search-function)) + (or (if regexp-flag + replace-re-search-function + replace-search-function) + (if replace-lax-whitespace + (if regexp-flag + #'re-search-forward-lax-whitespace + #'search-forward-lax-whitespace) + (if regexp-flag + #'re-search-forward + #'search-forward)))) (search-string from-string) (real-match-data nil) ; The match data for the current match. (next-replacement nil) @@ -2120,7 +2156,10 @@ (defun replace-highlight (match-beg matc ;; Set isearch-word to nil because word-replace is regexp-based, ;; so `isearch-search-fun' should not use `word-search-forward'. (isearch-word nil) - (search-whitespace-regexp nil) + (isearch-lax-whitespace + (and replace-lax-whitespace (not regexp))) + (isearch-regexp-lax-whitespace + (and replace-lax-whitespace regexp)) (isearch-case-fold-search case-fold) (isearch-forward t) (isearch-error nil)) === modified file 'lisp/isearch.el' --- lisp/isearch.el 2012-09-02 09:31:45 +0000 +++ lisp/isearch.el 2012-09-02 11:27:15 +0000 @@ -1579,14 +1612,11 @@ (defun isearch-query-replace (&optional ;; set `search-upper-case' to nil to not call ;; `isearch-no-upper-case-p' in `perform-replace' (search-upper-case nil) - (replace-search-function - (if (and isearch-lax-whitespace (not regexp-flag)) - #'search-forward-lax-whitespace - replace-search-function)) - (replace-re-search-function - (if (and isearch-regexp-lax-whitespace regexp-flag) - #'re-search-forward-lax-whitespace - replace-re-search-function)) + (replace-lax-whitespace + (and search-whitespace-regexp + (if isearch-regexp + isearch-regexp-lax-whitespace + isearch-lax-whitespace))) ;; Set `isearch-recursive-edit' to nil to prevent calling ;; `exit-recursive-edit' in `isearch-done' that terminates ;; the execution of this command when it is non-nil. @@ -2956,6 +3045,10 @@ (defun isearch-lazy-highlight-search () (isearch-regexp isearch-lazy-highlight-regexp) (isearch-word isearch-lazy-highlight-word) (search-invisible nil) ; don't match invisible text + (isearch-lax-whitespace + isearch-lazy-highlight-lax-whitespace) + (isearch-regexp-lax-whitespace + isearch-lazy-highlight-regexp-lax-whitespace) (retry t) (success nil) (isearch-forward isearch-lazy-highlight-forward)
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.