* lisp/isearch.el (word-search-regexp): Match whitespace if the search
authorJuri Linkov <juri@jurta.org>
Thu, 13 Jun 2013 21:49:10 +0000 (00:49 +0300)
committerJuri Linkov <juri@jurta.org>
Thu, 13 Jun 2013 21:49:10 +0000 (00:49 +0300)
string begins or ends in whitespace.  The LAX arg is applied to
both ends of the search string.  Use `regexp-quote' and explicit
\< and \> instead of \b.  Use \` and \' instead of ^ and $.
(isearch-symbol-regexp): Sync with `word-search-regexp' where word
boundaries are replaced with symbol boundaries, and characters
between symbols match non-word non-symbol syntax.

Fixes: debbugs:14602

etc/NEWS
lisp/ChangeLog
lisp/isearch.el

index 8bf1d17..44e4ada 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -300,6 +300,14 @@ Set `isearch-allow-prefix' to nil to restore old behavior.
 `isearch-printing-char', `isearch-quote-char', `isearch-yank-word',
 `isearch-yank-line'.
 
+*** Word search now matches whitespace at the beginning/end
+of the search string if it contains leading/trailing whitespace.
+In an incremental word search or when using a non-nil LAX argument
+of `word-search-regexp', the lax matching can also match part of
+the first word (in addition to the lax matching of the last word).
+The same rules are now applied to the symbol search with the difference
+that it matches symbols, and non-symbol characters between symbols.
+
 ** MH-E has been updated to MH-E version 8.5.
 See MH-E-NEWS for details.
 
index f21f6e4..5327ce1 100644 (file)
@@ -1,3 +1,13 @@
+2013-06-13  Juri Linkov  <juri@jurta.org>
+
+       * isearch.el (word-search-regexp): Match whitespace if the search
+       string begins or ends in whitespace.  The LAX arg is applied to
+       both ends of the search string.  Use `regexp-quote' and explicit
+       \< and \> instead of \b.  Use \` and \' instead of ^ and $.
+       (isearch-symbol-regexp): Sync with `word-search-regexp' where word
+       boundaries are replaced with symbol boundaries, and characters
+       between symbols match non-word non-symbol syntax.  (Bug#14602)
+
 2013-06-13  Juri Linkov  <juri@jurta.org>
 
        * isearch.el (isearch-del-char): Don't exceed the length of
index ddb5ba9..37070ba 100644 (file)
@@ -1540,17 +1540,22 @@ nil and a non-nil value of the option `search-invisible'
   "Return a regexp which matches words, ignoring punctuation.
 Given STRING, a string of words separated by word delimiters,
 compute a regexp that matches those exact words separated by
-arbitrary punctuation.  If LAX is non-nil, the end of the string
-need not match a word boundary unless it ends in whitespace.
+arbitrary punctuation.  If the string begins or ends in whitespace,
+the beginning or the end of the string matches arbitrary whitespace.
+Otherwise if LAX is non-nil, the beginning or the end of the string
+need not match a word boundary.
 
 Used in `word-search-forward', `word-search-backward',
 `word-search-forward-lax', `word-search-backward-lax'."
-  (if (string-match-p "^\\W*$" string)
-      ""
-    (concat
-     "\\b"
-     (mapconcat 'identity (split-string string "\\W+" t) "\\W+")
-     (if (or (not lax) (string-match-p "\\W$" string)) "\\b"))))
+  (cond
+   ((equal string "") "")
+   ((string-match-p "\\`\\W+\\'" string) "\\W+")
+   (t (concat
+       (if (string-match-p "\\`\\W" string) "\\W+"
+        (unless lax "\\<"))
+       (mapconcat 'regexp-quote (split-string string "\\W+" t) "\\W+")
+       (if (string-match-p "\\W\\'" string) "\\W+"
+        (unless lax "\\>"))))))
 
 (defun word-search-backward (string &optional bound noerror count)
   "Search backward from point for STRING, ignoring differences in punctuation.
@@ -1625,8 +1630,24 @@ to punctuation."
 (defun isearch-symbol-regexp (string &optional lax)
   "Return a regexp which matches STRING as a symbol.
 Creates a regexp where STRING is surrounded by symbol delimiters \\_< and \\_>.
-If LAX is non-nil, the end of the string need not match a symbol boundary."
-  (concat "\\_<" (regexp-quote string) (unless lax "\\_>")))
+If there are more than one symbol, then compute a regexp that matches
+those exact symbols separated by non-symbol characters.  If the string
+begins or ends in whitespace, the beginning or the end of the string
+matches arbitrary non-symbol whitespace.  Otherwise if LAX is non-nil,
+the beginning or the end of the string need not match a symbol boundary."
+  (let ((not-word-symbol-re
+        ;; This regexp matches all syntaxes except word and symbol syntax.
+        ;; FIXME: Replace it with something shorter if possible (bug#14602).
+        "\\(?:\\s-\\|\\s.\\|\\s(\\|\\s)\\|\\s\"\\|\\s\\\\|\\s/\\|\\s$\\|\\s'\\|\\s<\\|\\s>\\|\\s@\\|\\s!\\|\\s|\\)+"))
+    (cond
+     ((equal string "") "")
+     ((string-match-p (format "\\`%s\\'" not-word-symbol-re) string) not-word-symbol-re)
+     (t (concat
+        (if (string-match-p (format "\\`%s" not-word-symbol-re) string) not-word-symbol-re
+          (unless lax "\\_<"))
+        (mapconcat 'regexp-quote (split-string string not-word-symbol-re t) not-word-symbol-re)
+        (if (string-match-p (format "%s\\'" not-word-symbol-re) string) not-word-symbol-re
+          (unless lax "\\_>")))))))
 
 (put 'isearch-symbol-regexp 'isearch-message-prefix "symbol ")