From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Juri Linkov Newsgroups: gmane.emacs.bugs Subject: bug#11381: 23.3; isearch-search-and-update issue? Date: Sun, 27 May 2012 12:43:37 +0300 Organization: JURTA Message-ID: <87mx4u0xiu.fsf@mail.jurta.org> References: <4F9DC154.2000605@groveronline.com> <87ipgggtmw.fsf@mail.jurta.org> <878vhcc4nl.fsf@mail.jurta.org> <87vcjxdt5p.fsf@mail.jurta.org> <87vcjvwtxa.fsf@mail.jurta.org> <87r4ufhfmi.fsf@mail.jurta.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: dough.gmane.org 1338112562 15549 80.91.229.3 (27 May 2012 09:56:02 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Sun, 27 May 2012 09:56:02 +0000 (UTC) Cc: 11381@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun May 27 11:56:01 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1SYaCf-0001ON-BA for geb-bug-gnu-emacs@m.gmane.org; Sun, 27 May 2012 11:56:01 +0200 Original-Received: from localhost ([::1]:50873 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SYaCf-0007sj-4m for geb-bug-gnu-emacs@m.gmane.org; Sun, 27 May 2012 05:56:01 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:58924) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SYaCY-0007jg-TO for bug-gnu-emacs@gnu.org; Sun, 27 May 2012 05:55:58 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SYaCV-0007hI-Vb for bug-gnu-emacs@gnu.org; Sun, 27 May 2012 05:55:54 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:35714) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SYaCV-0007h4-Oq for bug-gnu-emacs@gnu.org; Sun, 27 May 2012 05:55:51 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1SYaDe-0007nb-Br for bug-gnu-emacs@gnu.org; Sun, 27 May 2012 05:57:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Juri Linkov Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 27 May 2012 09:57:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 11381 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 11381-submit@debbugs.gnu.org id=B11381.133811261829963 (code B ref 11381); Sun, 27 May 2012 09:57:02 +0000 Original-Received: (at 11381) by debbugs.gnu.org; 27 May 2012 09:56:58 +0000 Original-Received: from localhost ([127.0.0.1]:45259 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1SYaDZ-0007n9-ID for submit@debbugs.gnu.org; Sun, 27 May 2012 05:56:58 -0400 Original-Received: from ps18281.dreamhost.com ([69.163.218.105]:45712 helo=ps18281.dreamhostps.com) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1SYaDD-0007mR-RB for 11381@debbugs.gnu.org; Sun, 27 May 2012 05:56:55 -0400 Original-Received: from localhost (ps18281.dreamhostps.com [69.163.218.105]) by ps18281.dreamhostps.com (Postfix) with ESMTP id 3DBAE451CA52; Sun, 27 May 2012 02:55:23 -0700 (PDT) In-Reply-To: (Stefan Monnier's message of "Sun, 20 May 2012 22:23:31 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1.50 (x86_64-pc-linux-gnu) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:60389 Archived-At: >>> @@ -1425,7 +1445,11 @@ (defun word-search-backward (string &opt >>> of words in STRING to a regexp used to search words without regard >>> to punctuation." >>> (interactive "sWord search backward: ") >>> - (re-search-backward (word-search-regexp string nil) bound noerror count)) >>> + (re-search-backward >>> + (if (functionp isearch-word) >>> + (funcall isearch-word string nil) >>> + (word-search-regexp string nil)) >>> + bound noerror count)) >> This doesn't sound right. > > I guess I was a bit terse here: what I meant is that changing the > behavior depending on isearch-* variables is OK for a function named > isearch-foo but not word-search-*ward. Agreed. This patch adds 4 new functions `isearch-word-search-*'. Also it splits the standard default part of `isearch-search-fun' into a separate function `isearch-search-fun-default' that can be used to obtain the default search function in any special search function that overrides `isearch-search-fun' like is is demonstrated in the second patch for `minibuffer-history-isearch-search' below. Additionally it enables the word search in the minibuffer with no effort (the key clash with `M-s w' in the minibuffer is another issue). I'll also go through other search functions and enable word/symbol search in them as well. === modified file 'lisp/isearch.el' --- lisp/isearch.el 2012-05-17 00:03:49 +0000 +++ lisp/isearch.el 2012-05-27 09:43:07 +0000 @@ -1468,6 +1500,62 @@ (defun word-search-forward-lax (string & (interactive "sWord search: ") (re-search-forward (word-search-regexp string t) bound noerror count)) +;; General word-like regexp-based search. + +(defun isearch-word-search-backward (string &optional bound noerror count) + "Search backward from point for STRING, converted to regexp. +Like `word-search-backward', but uses a function from the variable +`isearch-word' to convert STRING to the regexp." + (re-search-backward + (if (functionp isearch-word) + (funcall isearch-word string nil) + (word-search-regexp string nil)) + bound noerror count)) + +(defun isearch-word-search-forward (string &optional bound noerror count) + "Search forward from point for STRING, converted to regexp. +Like `word-search-forward', but uses a function from the variable +`isearch-word' to convert STRING to the regexp." + (re-search-forward + (if (functionp isearch-word) + (funcall isearch-word string nil) + (word-search-regexp string nil)) + bound noerror count)) + +(defun isearch-word-search-backward-lax (string &optional bound noerror count) + "Search backward from point for STRING, converted to regexp. +Like `word-search-backward-lax', but uses a function from the variable +`isearch-word' to convert STRING to the regexp." + (re-search-backward + (if (functionp isearch-word) + (funcall isearch-word string t) + (word-search-regexp string t)) + bound noerror count)) + +(defun isearch-word-search-forward-lax (string &optional bound noerror count) + "Search forward from point for STRING, converted to regexp. +Like `word-search-forward-lax', but uses a function from the variable +`isearch-word' to convert STRING to the regexp." + (re-search-forward + (if (functionp isearch-word) + (funcall isearch-word string t) + (word-search-regexp string t)) + bound noerror count)) + +;; Symbol search + +(defun symbol-search-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 unless it ends in whitespace." + (concat + "\\_<" + (regexp-quote string) + (if (or (not lax) (string-match-p "\\W$" string)) "\\_>"))) + +(put 'symbol-search-regexp 'isearch-message-prefix "symbol ") + (defun isearch-query-replace (&optional delimited regexp-flag) "Start `query-replace' with string to replace from last search string. @@ -2370,20 +2473,23 @@ (defun isearch-search-fun () Can be changed via `isearch-search-fun-function' for special needs." (if isearch-search-fun-function (funcall isearch-search-fun-function) - (cond - (isearch-word - ;; Use lax versions to not fail at the end of the word while - ;; the user adds and removes characters in the search string - ;; (or when using nonincremental word isearch) - (if (or isearch-nonincremental - (eq (length isearch-string) - (length (isearch-string-state (car isearch-cmds))))) - (if isearch-forward 'word-search-forward 'word-search-backward) - (if isearch-forward 'word-search-forward-lax 'word-search-backward-lax))) - (isearch-regexp - (if isearch-forward 're-search-forward 're-search-backward)) - (t - (if isearch-forward 'search-forward 'search-backward))))) + (isearch-search-fun-default))) + +(defun isearch-search-fun-default () + (cond + (isearch-word + ;; Use lax versions to not fail at the end of the word while + ;; the user adds and removes characters in the search string + ;; (or when using nonincremental word isearch) + (if (or isearch-nonincremental + (eq (length isearch-string) + (length (isearch-string-state (car isearch-cmds))))) + (if isearch-forward 'isearch-word-search-forward 'isearch-word-search-backward) + (if isearch-forward 'isearch-word-search-forward-lax 'isearch-word-search-backward-lax))) + (isearch-regexp + (if isearch-forward 're-search-forward 're-search-backward)) + (t + (if isearch-forward 'search-forward 'search-backward)))) (defun isearch-search-string (string bound noerror) "Search for the first occurrence of STRING or its translation. === modified file 'lisp/simple.el' --- lisp/simple.el 2012-05-12 21:11:21 +0000 +++ lisp/simple.el 2012-05-27 09:43:19 +0000 @@ -1771,18 +1771,10 @@ (defun minibuffer-history-isearch-end () (defun minibuffer-history-isearch-search () "Return the proper search function, for isearch in minibuffer history." - (cond - (isearch-word - (if isearch-forward 'word-search-forward 'word-search-backward)) - (t (lambda (string bound noerror) (let ((search-fun ;; Use standard functions to search within minibuffer text - (cond - (isearch-regexp - (if isearch-forward 're-search-forward 're-search-backward)) - (t - (if isearch-forward 'search-forward 'search-backward)))) + (isearch-search-fun-default)) found) ;; Avoid lazy-highlighting matches in the minibuffer prompt when ;; searching forward. Lazy-highlight calls this lambda with the @@ -1822,7 +1814,7 @@ (defun minibuffer-history-isearch-search ;; Return point of the new search result (point)) ;; Return nil when next(prev)-history-element fails - (error nil))))))))) + (error nil))))))) (defun minibuffer-history-isearch-message (&optional c-q-hack ellipsis) "Display the minibuffer history search prompt.