unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Augusto Stoffel <arstoffel@gmail.com>
To: Juri Linkov <juri@linkov.net>
Cc: emacs-devel@gnu.org
Subject: Re: [ELPA?] Controlling Isearch from the minibuffer
Date: Sun, 16 May 2021 13:00:48 +0200	[thread overview]
Message-ID: <877djzymcf.fsf@gmail.com> (raw)
In-Reply-To: <87im3l5g9y.fsf@mail.linkov.net> (Juri Linkov's message of "Fri,  14 May 2021 21:20:09 +0300")

[-- Attachment #1: Type: text/plain, Size: 1271 bytes --]

On Fri, 14 May 2021 at 21:20, Juri Linkov <juri@linkov.net> wrote:

> Do you see the correct lazy-count values in the minibuffer and comint
> after removing `(null isearch-message-function)'?
>
>> -          (funcall (or isearch-message-function #'isearch-message)))
>> +          (isearch-message))

I would see the number of matches in the current line, which is only
logical.  But the relevant information here would be number of
candidates in the minibuffer/comint history that match the string, as
opposed to the total number of matches among those candidates.  So I
believe these modes should implement their own lazy count.  I just
disabled the count in the new patch below.

>
> What do you think about adding `isearch-message' as the default value
> of isearch-message-function?  E.g.
>
> #+begin_src diff
> -(defvar isearch-message-function nil
> +(defvar isearch-message-function #'isearch-message
> #+end_src

Yes, this is nicer, assuming no one relies on this variable usually
being nil up to now.

Now, I took a closer look at the history of changes around lazy
highlight and the interactions with other features seems very tricky.
I'm not super confident about the patch I'm attaching, but if you are
willing to review it and test a bit, I hope it helps.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Don-t-give-special-treatment-to-the-isearch-message-.patch --]
[-- Type: text/x-patch, Size: 10233 bytes --]

From 98226106351e2edba99ea647abf1fcd059e2e79d Mon Sep 17 00:00:00 2001
From: Augusto Stoffel <arstoffel@gmail.com>
Date: Fri, 14 May 2021 11:58:35 +0200
Subject: [PATCH] Don't give special treatment to the isearch-message function

* lisp/isearch.el (isearch-message-function): new default value.
(isearch-message): just defer to isearch-message-function, if non-nil.
(isearch-standard-message): new function, corresponds to the old
`isearch-message'.
(isearch-mode-end-hook-quit, isearch-update, with-isearch-suspended,
isearch-del-char, isearch-search-and-update, isearch-ring-adjust,
isearch-lazy-highlight-new-loop,
isearch-lazy-highlight-buffer-update):  just call `isearch-message',
no need to check isearch-message-function anymore.
* lisp/comint.el (comint-history-isearch-setup): disable lazy count,
since this only counts matches in the current line.
(comint-history-isearch-end): kill local variables instead of setting
them to the presumed previous value.
(comint-history-isearch-message): call isearch-standard-message
explicitly where needed.
* lisp/simple.el (minibuffer-history-isearch-setup): disable lazy count,
since this only counts matches in the current line.
(minibuffer-history-isearch-message): call `isearch-standard-message'
explicitly where needed.
---
 lisp/comint.el  | 18 ++++++++++--------
 lisp/isearch.el | 30 +++++++++++++++++-------------
 lisp/simple.el  |  5 +++--
 3 files changed, 30 insertions(+), 23 deletions(-)

diff --git a/lisp/comint.el b/lisp/comint.el
index ef34174305..cc062e3e5a 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -1487,7 +1487,7 @@ comint-history-isearch-setup
 	     (and (eq comint-history-isearch 'dwim)
 		  ;; Point is at command line.
 		  (comint-after-pmark-p))))
-    (setq isearch-message-prefix-add "history ")
+    (setq-local isearch-message-prefix-add "history ")
     (setq-local isearch-search-fun-function
                 #'comint-history-isearch-search)
     (setq-local isearch-message-function
@@ -1496,17 +1496,19 @@ comint-history-isearch-setup
                 #'comint-history-isearch-wrap)
     (setq-local isearch-push-state-function
                 #'comint-history-isearch-push-state)
+    (setq-local isearch-lazy-count nil)
     (add-hook 'isearch-mode-end-hook 'comint-history-isearch-end nil t)))
 
 (defun comint-history-isearch-end ()
   "Clean up the comint after terminating Isearch in comint."
   (if comint-history-isearch-message-overlay
       (delete-overlay comint-history-isearch-message-overlay))
-  (setq isearch-message-prefix-add nil)
-  (setq isearch-search-fun-function 'isearch-search-fun-default)
-  (setq isearch-message-function nil)
-  (setq isearch-wrap-function nil)
-  (setq isearch-push-state-function nil)
+  (kill-local-variable 'isearch-message-prefix-add)
+  (kill-local-variable 'isearch-search-fun-function)
+  (kill-local-variable 'isearch-message-function)
+  (kill-local-variable 'isearch-wrap-function)
+  (kill-local-variable 'isearch-push-state-function)
+  (kill-local-variable 'isearch-lazy-count)
   (remove-hook 'isearch-mode-end-hook 'comint-history-isearch-end t)
   (unless isearch-suspended
     (custom-reevaluate-setting 'comint-history-isearch)))
@@ -1588,11 +1590,11 @@ comint-history-isearch-message
 Otherwise, it displays the standard Isearch message returned from
 the function `isearch-message'."
   (if (not (and isearch-success (not isearch-error)))
-      ;; Use standard function `isearch-message' when not in comint prompt,
+      ;; Use `isearch-standard-message' when not in comint prompt,
       ;; or search fails, or has an error (like incomplete regexp).
       ;; This function displays isearch message in the echo area,
       ;; so it's possible to see what is wrong in the search string.
-      (isearch-message c-q-hack ellipsis)
+      (isearch-standard-message c-q-hack ellipsis)
     ;; Otherwise, put the overlay with the standard isearch prompt over
     ;; the initial comint prompt.
     (if (overlayp comint-history-isearch-message-overlay)
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 536c76ea5d..f545bf5558 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -209,9 +209,10 @@ isearch-mode-end-hook
 (defvar isearch-mode-end-hook-quit nil
   "Non-nil while running `isearch-mode-end-hook' if the user quits the search.")
 
-(defvar isearch-message-function nil
-  "Function to call to display the search prompt.
-If nil, use function `isearch-message'.")
+(defvar isearch-message-function #'isearch-standard-message
+  "Function called by `isearch-message' to display the search prompt.
+This should be nil to supress printing messages, or a function
+taking the same arguments as `isearch-standard-message'.")
 
 (defvar isearch-wrap-function nil
   "Function to call to wrap the search when search is failed.
@@ -1343,7 +1344,7 @@ isearch-update
 	   (null executing-kbd-macro))
       (progn
         (if (not (input-pending-p))
-          (funcall (or isearch-message-function #'isearch-message)))
+          (isearch-message))
         (if (and isearch-slow-terminal-mode
                  (not (or isearch-small-window
                           (pos-visible-in-window-group-p))))
@@ -1731,7 +1732,7 @@ with-isearch-suspended
             (isearch-update-from-string-properties isearch-string)
 
 	    ;; Restore the minibuffer message before moving point.
-            (funcall (or isearch-message-function #'isearch-message) nil t)
+            (isearch-message nil t)
 
 	    ;; Set point at the start (end) of old match if forward (backward),
 	    ;; so after exiting minibuffer isearch resumes at the start (end)
@@ -2504,7 +2505,7 @@ isearch-del-char
           isearch-message (mapconcat 'isearch-text-char-description
                                      isearch-string "")))
   ;; Do the following before moving point.
-  (funcall (or isearch-message-function #'isearch-message) nil t)
+  (isearch-message nil t)
   ;; Use the isearch-other-end as new starting point to be able
   ;; to find the remaining part of the search string again.
   ;; This is like what `isearch-search-and-update' does,
@@ -2765,7 +2766,7 @@ isearch-search-and-update
 		    (isearch-no-upper-case-p isearch-string isearch-regexp))))
       ;; Not regexp, not reverse, or no match at point.
       ;; Do the following before moving point.
-      (funcall (or isearch-message-function #'isearch-message) nil t)
+      (isearch-message nil t)
       (if (and isearch-other-end (not isearch-adjusted))
 	  (goto-char (if isearch-forward isearch-other-end
 		       (min isearch-opoint
@@ -3187,7 +3188,7 @@ isearch-ring-adjust
   (isearch-ring-adjust1 advance)
   (if search-ring-update
       (progn
-        (funcall (or isearch-message-function #'isearch-message) nil t)
+        (isearch-message nil t)
 	(isearch-search)
 	(isearch-push-state)
 	(isearch-update))
@@ -3260,6 +3261,11 @@ isearch-complete-edit
 
 (defun isearch-message (&optional c-q-hack ellipsis)
   "Generate and print the message string."
+  (when isearch-message-function
+    (funcall isearch-message-function c-q-hack ellipsis)))
+
+(defun isearch-standard-message (&optional c-q-hack ellipsis)
+  "Generate and print the standard Isearch message string."
 
   ;; N.B.: This function should always be called with point at the
   ;; search point, because in certain (rare) circumstances, undesired
@@ -3940,7 +3946,7 @@ isearch-lazy-highlight-new-loop
 			         isearch-lazy-highlight-window-end))))))
     ;; something important did indeed change
     (lazy-highlight-cleanup t (not (equal isearch-string ""))) ;stop old timer
-    (when (and isearch-lazy-count isearch-mode (null isearch-message-function))
+    (when isearch-lazy-count
       (when (or (equal isearch-string "")
                 ;; Check if this place was reached by a condition above
                 ;; other than changed window boundaries (that shouldn't
@@ -4010,9 +4016,7 @@ isearch-lazy-highlight-new-loop
                                    lazy-highlight-initial-delay)
                                  nil
                                  'isearch-lazy-highlight-start))))
-  ;; Update the current match number only in isearch-mode and
-  ;; unless isearch-mode is used specially with isearch-message-function
-  (when (and isearch-lazy-count isearch-mode (null isearch-message-function))
+  (when isearch-lazy-count
     ;; Update isearch-lazy-count-current only when it was already set
     ;; at the end of isearch-lazy-highlight-buffer-update
     (when isearch-lazy-count-current
@@ -4220,7 +4224,7 @@ isearch-lazy-highlight-buffer-update
 		    (setq looping nil
 			  nomore  t))))
 	    (if nomore
-		(when (and isearch-lazy-count isearch-mode (null isearch-message-function))
+		(when isearch-lazy-count
 		  (unless isearch-lazy-count-total
 		    (setq isearch-lazy-count-total 0))
 		  (setq isearch-lazy-count-current
diff --git a/lisp/simple.el b/lisp/simple.el
index 0255f69e42..8deb07b31a 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -2733,6 +2733,7 @@ minibuffer-history-isearch-setup
               #'minibuffer-history-isearch-wrap)
   (setq-local isearch-push-state-function
               #'minibuffer-history-isearch-push-state)
+  (setq-local isearch-lazy-count nil)
   (add-hook 'isearch-mode-end-hook 'minibuffer-history-isearch-end nil t))
 
 (defun minibuffer-history-isearch-end ()
@@ -2794,11 +2795,11 @@ minibuffer-history-isearch-message
 Otherwise, it displays the standard isearch message returned from
 the function `isearch-message'."
   (if (not (and (minibufferp) isearch-success (not isearch-error)))
-      ;; Use standard function `isearch-message' when not in the minibuffer,
+      ;; Use `isearch-standard-message' when not in the minibuffer,
       ;; or search fails, or has an error (like incomplete regexp).
       ;; This function overwrites minibuffer text with isearch message,
       ;; so it's possible to see what is wrong in the search string.
-      (isearch-message c-q-hack ellipsis)
+      (isearch-standard-message c-q-hack ellipsis)
     ;; Otherwise, put the overlay with the standard isearch prompt over
     ;; the initial minibuffer prompt.
     (if (overlayp minibuffer-history-isearch-message-overlay)
-- 
2.31.1


  reply	other threads:[~2021-05-16 11:00 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-08 10:13 [WIP PATCH] Controlling Isearch from the minibuffer Augusto Stoffel
2021-05-09 13:36 ` Alan Mackenzie
2021-05-09 17:58   ` Augusto Stoffel
2021-05-10 19:51     ` Alan Mackenzie
2021-05-11  9:00       ` Augusto Stoffel
2021-05-11 15:34         ` [External] : " Drew Adams
2021-05-11 18:31           ` Juri Linkov
2021-05-11 19:38             ` Drew Adams
2021-05-12  6:45           ` Augusto Stoffel
2021-05-12 12:44             ` Stefan Monnier
2021-05-12 15:31               ` Drew Adams
2021-05-12 22:17                 ` Kévin Le Gouguec
2021-05-12 23:07                   ` Drew Adams
2021-05-13 15:12                     ` Kévin Le Gouguec
2021-05-12 21:09               ` Augusto Stoffel
2021-05-12 15:30             ` Drew Adams
2021-05-09 19:09   ` Juri Linkov
2021-05-09 19:05 ` Juri Linkov
2021-05-10 20:24   ` Augusto Stoffel
2021-05-10 21:17     ` Juri Linkov
2021-05-12  6:40       ` Augusto Stoffel
2021-05-12 17:13         ` Juri Linkov
2021-05-12 20:52           ` Augusto Stoffel
2021-05-13 16:31             ` Juri Linkov
2021-05-13 20:12               ` [ELPA?] " Augusto Stoffel
2021-05-14  1:17                 ` Jean Louis
2021-05-14  8:36                   ` Augusto Stoffel
2021-05-14 17:30                 ` Augusto Stoffel
2021-05-14 18:20                   ` Juri Linkov
2021-05-16 11:00                     ` Augusto Stoffel [this message]
2021-05-16 18:19                       ` Juri Linkov
2021-05-25 20:50                         ` Juri Linkov
2021-05-29 11:48                           ` Augusto Stoffel
2021-05-14 18:18                 ` Juri Linkov
2021-05-16 18:12                   ` Juri Linkov
2021-05-16 18:49                     ` Augusto Stoffel
2021-05-21  9:09                       ` Augusto Stoffel
2021-05-21 10:25                         ` Eli Zaretskii
2021-05-21 11:56                           ` Augusto Stoffel
2021-05-21 12:31                             ` Eli Zaretskii
2021-05-21 12:49                               ` Augusto Stoffel
2021-05-21 15:05                               ` Stefan Monnier
2021-05-21 15:09                                 ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=877djzymcf.fsf@gmail.com \
    --to=arstoffel@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=juri@linkov.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).