emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

search-whitespace-regexp


From: Chong Yidong
Subject: search-whitespace-regexp
Date: Fri, 4 Feb 2005 09:12:33 -0500 (EST)
User-agent: SquirrelMail/1.4.3a

CVS Emacs has a variable, search-whitespace-regexp, which is a regexp that
replaces any space or spaces entered into isearch-forward-regexp. Setting
this variable to "[ \t\r\n]+" provides incremental searching across line
breaks, which is a commonly requested feature. However, I believe that
using search-whitespace-regexp in isearch-forward-regexp is a misfeature.
It should instead be used for isearch-forward.

When a user calls isearch-forward-regexp, he probably knows the precise
expression he wants, and how to craft a regular expression to find it. In
certain situations, it might be a nuisance for Emacs to silently tamper
with the regular expression he supplies.

The search-whitespace-regexp feature is more appropriate for "casual"
incremental searching. New users, in particular, do not expect isearch to
be foiled by line breaks. However, telling them to set
search-whitespace-regexp and use isearch-forward-regexp instead is not a
good solution, because commonly-used characters such as "." have a special
meaning in regexps.

The solution is to apply the search-whitespace-regexp behavior to
isearch-forward, rather than isearch-forward-regexp. The following patch
accomplishes this

*** isearch.el~ Fri Feb  4 19:33:15 2005
--- isearch.el  Fri Feb  4 21:59:13 2005
***************
*** 109,120 ****
    :type 'boolean
    :group 'isearch)

! (defcustom search-whitespace-regexp "\\s-+"
    "*If non-nil, regular expression to match a sequence of whitespace chars.
! This applies to regular expression incremental search.
! When you put a space or spaces in the incremental regexp, it stands for
! this, unless it is inside of a regexp construct such as [...] or *, + or ?.
! You might want to use something like \"[ \\t\\r\\n]+\" instead.
  In the Customization buffer, that is `[' followed by a space,
  a tab, a carriage return (control-M), a newline, and `]+'."
    :type 'regexp
--- 109,119 ----
    :type 'boolean
    :group 'isearch)

! (defcustom search-whitespace-regexp nil
    "*If non-nil, regular expression to match a sequence of whitespace chars.
! This applies to incremental search. When you put a space or
! spaces in the incremental search string, it stands for this.
! You might want to use something like \"[ \\t\\r\\n]+\".
  In the Customization buffer, that is `[' followed by a space,
  a tab, a carriage return (control-M), a newline, and `]+'."
    :type 'regexp
***************
*** 573,584 ****
  Do incremental search forward for regular expression.
  With a prefix argument, do a regular string search instead.
  Like ordinary incremental search except that your input
! is treated as a regexp.  See \\[isearch-forward] for more info.
!
! In regexp incremental searches, a space or spaces normally matches
! any whitespace (the variable `search-whitespace-regexp' controls
! precisely what that means).  If you want to search for a literal space
! and nothing else, enter `[ ]'."
    (interactive "P\np")
    (isearch-mode t (null not-regexp) nil (not no-recursive-edit)))

--- 572,578 ----
  Do incremental search forward for regular expression.
  With a prefix argument, do a regular string search instead.
  Like ordinary incremental search except that your input
! is treated as a regexp.  See \\[isearch-forward] for more info."
    (interactive "P\np")
    (isearch-mode t (null not-regexp) nil (not no-recursive-edit)))

***************
*** 2029,2035 ****
       (isearch-regexp
        (if isearch-forward 're-search-forward 're-search-backward))
       (t
!       (if isearch-forward 'search-forward 'search-backward)))))

  (defun isearch-search ()
    ;; Do the search with the current search string.
--- 2023,2043 ----
       (isearch-regexp
        (if isearch-forward 're-search-forward 're-search-backward))
       (t
!       (if isearch-forward 'isearch-search-forward
'isearch-search-backward)))))
!
! (defun isearch-search-forward (string &optional bound noerror count)
!   (re-search-forward
!    (if search-whitespace-regexp
!        (replace-regexp-in-string " +" search-whitespace-regexp string)
!      string)
!    bound noerror count))
!
! (defun isearch-search-backward (string &optional bound noerror count)
!   (re-search-backward
!    (if search-whitespace-regexp
!        (replace-regexp-in-string " +" search-whitespace-regexp string)
!      string)
!    bound noerror count))

  (defun isearch-search ()
    ;; Do the search with the current search string.
***************
*** 2041,2047 ****
        (let ((inhibit-point-motion-hooks search-invisible)
            (inhibit-quit nil)
            (case-fold-search isearch-case-fold-search)
-           (search-spaces-regexp search-whitespace-regexp)
            (retry t))
        (if isearch-regexp (setq isearch-invalid-regexp nil))
        (setq isearch-within-brackets nil)
--- 2049,2054 ----
***************
*** 2377,2384 ****
  (defun isearch-lazy-highlight-search ()
    "Search ahead for the next or previous match, for lazy highlighting.
  Attempt to do the search exactly the way the pending isearch would."
!   (let ((case-fold-search isearch-case-fold-search)
!       (search-spaces-regexp search-whitespace-regexp))
      (funcall (isearch-search-fun)
               isearch-string
               (if isearch-forward
--- 2384,2390 ----
  (defun isearch-lazy-highlight-search ()
    "Search ahead for the next or previous match, for lazy highlighting.
  Attempt to do the search exactly the way the pending isearch would."
!   (let ((case-fold-search isearch-case-fold-search))
      (funcall (isearch-search-fun)
               isearch-string
               (if isearch-forward





reply via email to

[Prev in Thread] Current Thread [Next in Thread]