From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.bugs Subject: bug#17453: Isearch doesn't work properly with Follow Mode. Date: Mon, 2 Nov 2015 22:09:27 +0000 Message-ID: <20151102220927.GA2118@acm.fritz.box> References: <87h9l6627a.fsf@mail.linkov.net> <20151031235651.GE1853@acm.fritz.box> <87bnbddzpk.fsf@mail.linkov.net> <20151102092853.GA11804@acm.fritz.box> <20151102123512.GB11804@acm.fritz.box> <20151102154445.GD11804@acm.fritz.box> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1446502107 11173 80.91.229.3 (2 Nov 2015 22:08:27 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 2 Nov 2015 22:08:27 +0000 (UTC) Cc: 17453@debbugs.gnu.org, Juri Linkov To: Artur Malabarba Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Nov 02 23:08:16 2015 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 1ZtNGv-00051Q-AV for geb-bug-gnu-emacs@m.gmane.org; Mon, 02 Nov 2015 23:08:13 +0100 Original-Received: from localhost ([::1]:44479 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZtNGu-0003ax-RX for geb-bug-gnu-emacs@m.gmane.org; Mon, 02 Nov 2015 17:08:12 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:37363) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZtNGq-0003ab-7a for bug-gnu-emacs@gnu.org; Mon, 02 Nov 2015 17:08:09 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZtNGl-0005O3-4o for bug-gnu-emacs@gnu.org; Mon, 02 Nov 2015 17:08:08 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:59358) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZtNGl-0005Nz-0c for bug-gnu-emacs@gnu.org; Mon, 02 Nov 2015 17:08:03 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1ZtNGk-0002yp-HP for bug-gnu-emacs@gnu.org; Mon, 02 Nov 2015 17:08:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Alan Mackenzie Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 02 Nov 2015 22:08:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 17453 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 17453-submit@debbugs.gnu.org id=B17453.144650208111448 (code B ref 17453); Mon, 02 Nov 2015 22:08:02 +0000 Original-Received: (at 17453) by debbugs.gnu.org; 2 Nov 2015 22:08:01 +0000 Original-Received: from localhost ([127.0.0.1]:50066 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ZtNGi-0002yZ-9l for submit@debbugs.gnu.org; Mon, 02 Nov 2015 17:08:00 -0500 Original-Received: from mail.muc.de ([193.149.48.3]:50860) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1ZtNGN-0002y8-Mi for 17453@debbugs.gnu.org; Mon, 02 Nov 2015 17:07:59 -0500 Original-Received: (qmail 93978 invoked by uid 3782); 2 Nov 2015 22:07:38 -0000 Original-Received: from acm.muc.de (p5B147B71.dip0.t-ipconnect.de [91.20.123.113]) by colin.muc.de (tmda-ofmipd) with ESMTP; Mon, 02 Nov 2015 23:07:37 +0100 Original-Received: (qmail 12338 invoked by uid 1000); 2 Nov 2015 22:09:27 -0000 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Delivery-Agent: TMDA/1.1.12 (Macallan) X-Primary-Address: acm@muc.de X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 208.118.235.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:108324 Archived-At: Hello again, Artur. On Mon, Nov 02, 2015 at 04:26:23PM +0000, Artur Malabarba wrote: > Hi Alan, > 2015-11-02 15:44 GMT+00:00 Alan Mackenzie : > > So how about us just moving all these checks to where they really > > belong, in isearch-lazy-highlight-update? I've a feeling that if we do > > this, then your function follow--search-function becomes unneeded. > Yes, I think this might work too. And I like the idea of eliminating a > redisplay inside the command-loop. > Could you test it? Of course, nothing is ever that simple. ;-). I've got a working version which doesn't use "(sit-for 0)", thus allowing point to move properly over Follow Mode windows. However, this meant the "old" highlighting not being erased until the 0.25 seconds had passed. So I tried testing the conditions for a new lazy-highlight loop (apart from window-start/end changing) in the command loop bit. This doesn't work brilliantly well when a C-s causes a half-screen forward scroll: the "upper" lazy highlighting remains there, and 0.25s later the "lower" lazy H. appears. It struck me that instead of all this rigmarole, and instead of the "(sit-for 0)", we could test whether or not a scroll is about to take place. The obvious candidate for this is `pos-visible-in-window-p' - if this returns nil, obviously a scroll is about to happen. Unfortunately, even if p-v-i-w-p returns t, a scroll might still happen because of `scroll-margin', and the like. What we could do with is an interface which will tell us whether or not redisplay would scroll if invoked immediately, with the current value of point, window-start, etc. Obviously it would be simple, but messy to hack a lisp function together to do this, but a more general purpose function might be apposite here. Eli, what do you think? All this is, just for the moment, disregarding any enhancements needed to support Follow Mode properly. Just for the moment, that is. If you're interested, here is a (still scrappy) patch of where I am at the moment. diff --git a/lisp/isearch.el b/lisp/isearch.el index b762884..b59a224 100644 --- a/lisp/isearch.el +++ b/lisp/isearch.el @@ -3012,13 +3012,52 @@ 'isearch-lazy-highlight-cleanup "22.1") (defun isearch-lazy-highlight-new-loop (&optional beg end) - "Cleanup any previous `lazy-highlight' loop and begin a new one. -BEG and END specify the bounds within which highlighting should occur. -This is called when `isearch-update' is invoked (which can cause the -search string to change or the window to scroll). It is also used -by other Emacs features." + "Set an idle timer, which will trigger a new `lazy-highlight' loop. +BEG and END specify the bounds within which highlighting should +occur. This is called when `isearch-update' is invoked (which +can cause the search string to change or the window(s) to +scroll). It is also used by other Emacs features." + (setq isearch-lazy-highlight-start-limit beg + isearch-lazy-highlight-end-limit end) + (when (null executing-kbd-macro) + (when (or (not (equal isearch-string + isearch-lazy-highlight-last-string)) + (not (eq (selected-window) + isearch-lazy-highlight-window)) + (not (eq isearch-lazy-highlight-case-fold-search + isearch-case-fold-search)) + (not (eq isearch-lazy-highlight-regexp + isearch-regexp)) + (not (eq isearch-lazy-highlight-regexp-function + isearch-regexp-function)) + (not (eq isearch-lazy-highlight-lax-whitespace + isearch-lax-whitespace)) + (not (eq isearch-lazy-highlight-regexp-lax-whitespace + isearch-regexp-lax-whitespace)) + ;; (not (= (window-start) + ;; isearch-lazy-highlight-window-start)) + ;; (not (= (window-end) ; Window may have been split/joined. + ;; isearch-lazy-highlight-window-end)) + (not (eq isearch-forward + isearch-lazy-highlight-forward)) + ;; In case we are recovering from an error. + (not (equal isearch-error + isearch-lazy-highlight-error))) + (lazy-highlight-cleanup t)) ;kill old loop & remove overlays. + (setq isearch-lazy-highlight-timer + (run-with-idle-timer lazy-highlight-initial-delay nil + 'isearch-lazy-highlight-maybe-new-loop)))) + +(defun isearch-lazy-highlight-maybe-new-loop () + "If needed, cleanup the previous `lazy-highlight' loop and begin a new one. +Return t if we begin a loop, nil otherwise." +;; " Cleanup any previous `lazy-highlight' loop and begin a new one. +;; BEG and END specify the bounds within which highlighting should occur. +;; This is called when `isearch-update' is invoked (which can cause the +;; search string to change or the window to scroll). It is also used +;; by other Emacs features." (when (and (null executing-kbd-macro) - (sit-for 0) ;make sure (window-start) is credible + ;; (sit-for 0) ;make sure (window-start) is credible (or (not (equal isearch-string isearch-lazy-highlight-last-string)) (not (eq (selected-window) @@ -3048,8 +3087,8 @@ isearch-lazy-highlight-new-loop ;; It used to check for `(not isearch-error)' here, but actually ;; lazy-highlighting might find matches to highlight even when ;; `isearch-error' is non-nil. (Bug#9918) - (setq isearch-lazy-highlight-start-limit beg - isearch-lazy-highlight-end-limit end) + ;; (setq isearch-lazy-highlight-start-limit beg + ;; isearch-lazy-highlight-end-limit end) (setq isearch-lazy-highlight-window (selected-window) isearch-lazy-highlight-window-start (window-start) isearch-lazy-highlight-window-end (window-end) @@ -3070,10 +3109,12 @@ isearch-lazy-highlight-new-loop isearch-lazy-highlight-regexp-lax-whitespace isearch-regexp-lax-whitespace isearch-lazy-highlight-regexp-function isearch-regexp-function isearch-lazy-highlight-forward isearch-forward) - (unless (equal isearch-string "") - (setq isearch-lazy-highlight-timer - (run-with-idle-timer lazy-highlight-initial-delay nil - 'isearch-lazy-highlight-update))))) + ;; (unless (equal isearch-string "") + ;; (setq isearch-lazy-highlight-timer + ;; (run-with-idle-timer lazy-highlight-initial-delay nil + ;; 'isearch-lazy-highlight-update))) + (unless (equal isearch-string "") + (isearch-lazy-highlight-update)))) (defun isearch-lazy-highlight-search () "Search ahead for the next or previous match, for lazy highlighting. -- Alan Mackenzie (Nuremberg, Germany).