From a22289f7ab658767b2f586aa1f1f794b1470df95 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Fri, 14 Jun 2013 00:49:10 +0300 Subject: [PATCH] * lisp/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. Fixes: debbugs:14602 --- etc/NEWS | 8 ++++++++ lisp/ChangeLog | 10 ++++++++++ lisp/isearch.el | 41 +++++++++++++++++++++++++++++++---------- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 8bf1d17005..44e4ada50c 100644 --- 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. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f21f6e4b06..5327ce12e7 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,13 @@ +2013-06-13 Juri Linkov + + * 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 * isearch.el (isearch-del-char): Don't exceed the length of diff --git a/lisp/isearch.el b/lisp/isearch.el index ddb5ba9331..37070ba6f5 100644 --- a/lisp/isearch.el +++ b/lisp/isearch.el @@ -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 ") -- 2.20.1