From: Juri Linkov <juri@linkov.net>
To: Augusto Stoffel <arstoffel@gmail.com>
Cc: Philip Kaludercic <philipk@posteo.net>,
emacs-devel@gnu.org, Manuel Uberti <manuel.uberti@inventati.org>,
Gregory Heytings <gregory@heytings.org>, Ergus <spacibba@aol.com>
Subject: Re: Simple isearch concerns
Date: Fri, 30 Apr 2021 19:41:25 +0300 [thread overview]
Message-ID: <87tunnzqci.fsf@mail.linkov.net> (raw)
In-Reply-To: <87bl9wcksv.fsf@gmail.com> (Augusto Stoffel's message of "Fri, 30 Apr 2021 09:07:28 +0200")
[-- Attachment #1: Type: text/plain, Size: 838 bytes --]
>> What would be good customization options for that? I imagine
>> a new boolean option 'isearch-buffer-local'. Maybe later
>> it would require a new value to support even multiple isearch
>> sessions in different buffers. In this case, all state variables
>> like isearch-cmds, isearch-lazy-highlight-overlays etc. could be made
>> buffer-local.
>
> I don't understand why `isearch-buffer-local' should be a user
> customization, since it doesn't change the external behavior of Isearch,
> but simply improves the implementation. It might break third-party code
> that hacks into isearch.el, though.
Indeed, we need to care about third-party code as well.
So we could add a new option, then ask the users to enable it
to see what effect it has on user customizations, then after
the next release its default could be changed to t:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: isearch-buffer-local.patch --]
[-- Type: text/x-diff, Size: 4920 bytes --]
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 9f3cfd70fb..5c71519054 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -195,6 +195,11 @@ isearch-repeat-on-direction-change
(const :tag "Move to another match" t))
:version "28.1")
+(defcustom isearch-buffer-local nil
+ "Whether isearch should be buffer-local."
+ :type 'boolean
+ :version "28.1")
+
(defvar isearch-mode-hook nil
"Function(s) to call after starting up an incremental search.")
@@ -1295,11 +1300,14 @@ isearch-mode
(setq isearch-mode " Isearch") ;; forward? regexp?
(force-mode-line-update)
- (setq overriding-terminal-local-map isearch-mode-map)
+ (if isearch-buffer-local
+ (add-to-list 'emulation-mode-map-alists `((isearch-mode . ,isearch-mode-map)))
+ (setq overriding-terminal-local-map isearch-mode-map))
(run-hooks 'isearch-mode-hook)
- ;; Remember the initial map possibly modified
- ;; by external packages in isearch-mode-hook. (Bug#16035)
- (setq isearch--saved-overriding-local-map overriding-terminal-local-map)
+ (unless isearch-buffer-local
+ ;; Remember the initial map possibly modified
+ ;; by external packages in isearch-mode-hook. (Bug#16035)
+ (setq isearch--saved-overriding-local-map overriding-terminal-local-map))
;; Pushing the initial state used to be before running isearch-mode-hook,
;; but a hook might set `isearch-push-state-function' used in
@@ -1308,10 +1316,10 @@ isearch-mode
(isearch-update)
- (add-hook 'pre-command-hook 'isearch-pre-command-hook)
- (add-hook 'post-command-hook 'isearch-post-command-hook)
- (add-hook 'mouse-leave-buffer-hook 'isearch-mouse-leave-buffer)
- (add-hook 'kbd-macro-termination-hook 'isearch-done)
+ (add-hook 'pre-command-hook 'isearch-pre-command-hook nil isearch-buffer-local)
+ (add-hook 'post-command-hook 'isearch-post-command-hook nil isearch-buffer-local)
+ (add-hook 'mouse-leave-buffer-hook 'isearch-mouse-leave-buffer nil isearch-buffer-local)
+ (add-hook 'kbd-macro-termination-hook 'isearch-done nil isearch-buffer-local)
;; isearch-mode can be made modal (in the sense of not returning to
;; the calling function until searching is completed) by entering
@@ -1406,10 +1414,11 @@ isearch-done
,isearch-message
',isearch-case-fold-search)))
- (remove-hook 'pre-command-hook 'isearch-pre-command-hook)
- (remove-hook 'post-command-hook 'isearch-post-command-hook)
- (remove-hook 'mouse-leave-buffer-hook 'isearch-mouse-leave-buffer)
- (remove-hook 'kbd-macro-termination-hook 'isearch-done)
+ (remove-hook 'pre-command-hook 'isearch-pre-command-hook isearch-buffer-local)
+ (remove-hook 'post-command-hook 'isearch-post-command-hook isearch-buffer-local)
+ (remove-hook 'mouse-leave-buffer-hook 'isearch-mouse-leave-buffer isearch-buffer-local)
+ (remove-hook 'kbd-macro-termination-hook 'isearch-done isearch-buffer-local)
+
(when (buffer-live-p isearch--current-buffer)
(with-current-buffer isearch--current-buffer
(setq isearch--current-buffer nil)
@@ -1630,12 +1639,19 @@ with-isearch-suspended
`isearch-new-string', `isearch-new-message', `isearch-new-forward',
`isearch-new-regexp-function', `isearch-new-case-fold',
`isearch-new-nonincremental'."
+ `(if isearch-buffer-local
+ (let ((isearch-new-string isearch-string)
+ (isearch-new-message isearch-message))
+ (progn ,@body)
+ (setq isearch-string isearch-new-string
+ isearch-message isearch-new-message)
+ (let ((isearch-yank-flag t)) (isearch-search-and-update)))
;; This code is very hairy for several reasons, explained in the code.
;; Mainly, isearch-mode must be terminated while editing and then restarted.
;; If there were a way to catch any change of buffer from the minibuffer,
;; this could be simplified greatly.
;; Editing doesn't back up the search point. Should it?
- `(condition-case nil
+ (condition-case nil
(progn
(let ((isearch-new-nonincremental isearch-nonincremental)
@@ -1779,7 +1795,7 @@ with-isearch-suspended
(quit ; handle abort-recursive-edit
(setq isearch-suspended nil)
(isearch-abort) ;; outside of let to restore outside global values
- )))
+ ))))
(defvar minibuffer-history-symbol) ;; from external package gmhist.el
@@ -3018,7 +3060,8 @@ isearch-pre-command-hook
(cond
;; Don't exit Isearch if we're in the middle of some
;; `set-transient-map' thingy like `universal-argument--mode'.
- ((not (eq overriding-terminal-local-map isearch--saved-overriding-local-map)))
+ ((unless isearch-buffer-local
+ (not (eq overriding-terminal-local-map isearch--saved-overriding-local-map))))
;; Don't exit Isearch for isearch key bindings.
((or (commandp (lookup-key isearch-mode-map key nil))
(commandp
[-- Attachment #3: Type: text/plain, Size: 287 bytes --]
And here is a patch for updating the search from the minibuffer. This allows
to implement https://lists.gnu.org/archive/html/emacs-devel/2020-01/msg00447.html
to control the search from the minibuffer. But I'm not sure if the same option
isearch-buffer-local should enable this mode:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: isearch-edit-string-after-change.patch --]
[-- Type: text/x-diff, Size: 3610 bytes --]
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 9f3cfd70fb..5c71519054 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -1803,21 +1819,33 @@ isearch-edit-string
(minibuffer-history-symbol)
;; Search string might have meta information on text properties.
(minibuffer-allow-text-properties t))
- (setq isearch-new-string
- (read-from-minibuffer
- (isearch-message-prefix nil isearch-nonincremental)
- (cons isearch-string (1+ (or (isearch-fail-pos)
- (length isearch-string))))
- minibuffer-local-isearch-map nil
- (if isearch-regexp
- (cons 'regexp-search-ring
- (1+ (or regexp-search-ring-yank-pointer -1)))
- (cons 'search-ring
- (1+ (or search-ring-yank-pointer -1))))
- nil t)
- isearch-new-message
- (mapconcat 'isearch-text-char-description
- isearch-new-string "")))))
+ (minibuffer-with-setup-hook
+ (lambda ()
+ (when isearch-buffer-local
+ (add-hook 'after-change-functions
+ (lambda (_ _ _)
+ (let ((new-string (minibuffer-contents)))
+ (with-minibuffer-selected-window
+ (setq isearch-string new-string
+ isearch-message (mapconcat 'isearch-text-char-description
+ isearch-string ""))
+ (let ((isearch-yank-flag t)) (isearch-search-and-update)))))
+ nil t)))
+ (setq isearch-new-string
+ (read-from-minibuffer
+ (isearch-message-prefix nil isearch-nonincremental)
+ (cons isearch-string (1+ (or (isearch-fail-pos)
+ (length isearch-string))))
+ minibuffer-local-isearch-map nil
+ (if isearch-regexp
+ (cons 'regexp-search-ring
+ (1+ (or regexp-search-ring-yank-pointer -1)))
+ (cons 'search-ring
+ (1+ (or search-ring-yank-pointer -1))))
+ nil t)
+ isearch-new-message
+ (mapconcat 'isearch-text-char-description
+ isearch-new-string ""))))))
(defun isearch-nonincremental-exit-minibuffer ()
(interactive)
@@ -1830,14 +1858,28 @@ isearch-nonincremental-exit-minibuffer
(defun isearch-forward-exit-minibuffer ()
"Resume isearching forward from the minibuffer that edits the search string."
(interactive)
- (setq isearch-new-forward t isearch-new-nonincremental nil)
- (exit-minibuffer))
+ (if isearch-buffer-local
+ (let ((new-string (minibuffer-contents)))
+ (with-minibuffer-selected-window
+ (setq isearch-string new-string
+ isearch-message (mapconcat 'isearch-text-char-description
+ isearch-string ""))
+ (isearch-repeat-forward)))
+ (setq isearch-new-forward t isearch-new-nonincremental nil)
+ (exit-minibuffer)))
(defun isearch-reverse-exit-minibuffer ()
"Resume isearching backward from the minibuffer that edits the search string."
(interactive)
- (setq isearch-new-forward nil isearch-new-nonincremental nil)
- (exit-minibuffer))
+ (if isearch-buffer-local
+ (let ((new-string (minibuffer-contents)))
+ (with-minibuffer-selected-window
+ (setq isearch-string new-string
+ isearch-message (mapconcat 'isearch-text-char-description
+ isearch-string ""))
+ (isearch-repeat-backward)))
+ (setq isearch-new-forward nil isearch-new-nonincremental nil)
+ (exit-minibuffer)))
(defun isearch-cancel ()
"Terminate the search and go back to the starting point."
next prev parent reply other threads:[~2021-04-30 16:41 UTC|newest]
Thread overview: 143+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20210403001539.x4rb55dvh46rmhb3.ref@Ergus>
2021-04-03 0:15 ` Simple isearch concerns Ergus
2021-04-03 5:56 ` Thierry Volpiatto
2021-04-03 6:33 ` Manuel Uberti
2021-04-03 10:37 ` Daniel Martín
2021-04-06 7:12 ` Zhiwei Chen
2021-04-06 13:04 ` Stefan Monnier
2021-04-06 13:18 ` Gregory Heytings
2021-04-06 14:17 ` Gregory Heytings
2021-04-06 18:56 ` Juri Linkov
2021-04-06 20:10 ` Gregory Heytings
2021-04-07 10:22 ` Gregory Heytings
2021-04-07 16:24 ` Juri Linkov
2021-04-07 17:03 ` Gregory Heytings
2021-04-08 19:08 ` Juri Linkov
2021-04-09 6:42 ` Zhiwei Chen
2021-04-21 17:51 ` Juri Linkov
2021-04-25 8:16 ` Zhiwei Chen
2021-04-03 11:28 ` Philip Kaludercic
2021-04-03 12:26 ` Gregory Heytings
2021-04-03 16:37 ` Philip Kaludercic
2021-04-03 17:31 ` Gregory Heytings
2021-04-03 18:36 ` Philip Kaludercic
2021-04-03 19:36 ` Dmitry Gutov
2021-04-05 2:18 ` Ergus
2021-04-05 8:39 ` Juri Linkov
2021-04-03 17:45 ` Ergus
2021-04-22 7:15 ` Augusto Stoffel
2021-04-22 22:24 ` Juri Linkov
2021-04-25 7:15 ` Augusto Stoffel
2021-04-25 17:24 ` Juri Linkov
2021-04-25 18:41 ` [External] : " Drew Adams
2021-04-26 5:39 ` Augusto Stoffel
2021-04-27 17:41 ` Juri Linkov
2021-04-29 16:29 ` Juri Linkov
2021-04-29 17:50 ` Augusto Stoffel
2021-04-29 23:00 ` Juri Linkov
2021-04-30 7:07 ` Augusto Stoffel
2021-04-30 16:41 ` Juri Linkov [this message]
2021-05-02 6:09 ` Augusto Stoffel
2021-05-02 22:18 ` Juri Linkov
2021-05-03 5:30 ` Augusto Stoffel
2021-05-03 16:51 ` Juri Linkov
2021-05-05 20:52 ` Juri Linkov
2021-05-07 17:14 ` Juri Linkov
2021-05-08 10:17 ` Augusto Stoffel
2021-05-09 19:12 ` Juri Linkov
2021-05-09 19:53 ` [External] : " Drew Adams
2021-05-10 21:11 ` Juri Linkov
2021-05-10 23:06 ` Drew Adams
2021-05-11 18:32 ` Juri Linkov
2021-05-11 20:01 ` Drew Adams
2021-05-11 6:20 ` Yuri Khan
2021-05-11 9:01 ` Augusto Stoffel
2021-05-11 18:37 ` Juri Linkov
2021-05-11 20:56 ` Juri Linkov
2021-04-03 12:29 ` Gregory Heytings
2021-04-03 13:02 ` Daniel Martín
2021-04-03 13:25 ` Gregory Heytings
2021-04-03 17:25 ` Ergus
2021-04-03 10:28 ` Daniel Martín
2021-04-04 22:48 ` Juri Linkov
2021-04-04 23:27 ` Stefan Monnier
2021-04-05 1:41 ` Ergus
2021-04-05 2:22 ` [External] : " Drew Adams
2021-04-05 8:34 ` Juri Linkov
2021-04-05 14:58 ` Drew Adams
2021-04-05 2:38 ` Stefan Monnier
2021-04-05 8:30 ` Juri Linkov
2021-04-05 9:52 ` Basil L. Contovounesios
2021-04-05 15:08 ` [External] : " Drew Adams
2021-04-05 2:08 ` Ergus
2021-04-05 20:37 ` Juri Linkov
2021-04-05 21:18 ` [External] : " Drew Adams
2021-04-05 21:35 ` Juri Linkov
2021-04-05 22:37 ` Ergus
2021-04-06 19:11 ` Juri Linkov
2021-04-06 19:30 ` Eli Zaretskii
2021-04-06 20:10 ` Gregory Heytings
2021-04-07 16:30 ` Juri Linkov
2021-04-07 17:14 ` Gregory Heytings
2021-04-07 20:12 ` Gregory Heytings
2021-04-05 23:06 ` Drew Adams
2021-04-05 22:16 ` Ergus
2021-04-06 19:17 ` Juri Linkov
2021-04-06 0:30 ` Gregory Heytings
2021-04-06 0:44 ` Gregory Heytings
2021-04-06 18:53 ` Juri Linkov
2021-04-06 20:10 ` Gregory Heytings
2021-04-07 16:36 ` Juri Linkov
2021-04-07 17:21 ` Gregory Heytings
2021-04-07 20:12 ` Juri Linkov
2021-04-07 21:09 ` Gregory Heytings
2021-04-08 8:08 ` Juri Linkov
2021-04-08 8:48 ` Gregory Heytings
2021-04-08 19:12 ` Juri Linkov
2021-04-08 19:27 ` Gregory Heytings
2021-04-08 20:05 ` Juri Linkov
2021-04-08 20:10 ` Gregory Heytings
2021-04-08 22:40 ` Gregory Heytings
2021-04-09 6:22 ` Eli Zaretskii
2021-04-09 7:20 ` Gregory Heytings
2021-04-09 8:37 ` Juri Linkov
2021-04-09 10:50 ` Eli Zaretskii
2021-04-09 16:49 ` Juri Linkov
2021-04-09 10:46 ` Eli Zaretskii
2021-04-09 11:27 ` Gregory Heytings
2021-04-09 12:45 ` Eli Zaretskii
2021-04-09 6:05 ` Eli Zaretskii
2021-04-09 8:39 ` Juri Linkov
2021-04-09 10:51 ` Eli Zaretskii
2021-04-09 11:48 ` Gregory Heytings
2021-04-09 12:48 ` Eli Zaretskii
2021-04-09 13:26 ` Gregory Heytings
2021-04-09 13:49 ` Eli Zaretskii
2021-04-09 14:36 ` Gregory Heytings
2021-04-09 14:56 ` Eli Zaretskii
2021-04-09 15:25 ` Gregory Heytings
2021-04-09 19:01 ` Eli Zaretskii
2021-04-09 19:04 ` [External] : " Drew Adams
2021-04-09 23:18 ` Gregory Heytings
2021-04-10 7:17 ` Eli Zaretskii
2021-04-10 10:36 ` Gregory Heytings
2021-04-10 10:46 ` Eli Zaretskii
2021-04-10 10:57 ` Gregory Heytings
2021-04-10 11:13 ` Eli Zaretskii
2021-04-10 19:02 ` Now branch isearch-vertical Ergus
2021-04-10 20:00 ` Gregory Heytings
2021-04-10 22:12 ` Simple isearch concerns Juri Linkov
2021-04-10 23:55 ` Gregory Heytings
2021-04-11 7:07 ` Eli Zaretskii
2021-04-11 8:49 ` Gregory Heytings
2021-04-11 10:16 ` Gregory Heytings
2021-04-11 22:09 ` Juri Linkov
2021-04-11 22:17 ` Juri Linkov
2021-04-11 23:06 ` Gregory Heytings
2021-04-11 22:05 ` Juri Linkov
2021-04-08 3:32 ` Ergus
2022-03-03 16:36 ` Augusto Stoffel
2022-03-03 17:50 ` Alan Mackenzie
2022-03-03 18:39 ` Augusto Stoffel
2022-03-03 18:46 ` Eli Zaretskii
2021-04-07 16:41 ` Howard Melman
2021-04-06 2:21 ` Ergus
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=87tunnzqci.fsf@mail.linkov.net \
--to=juri@linkov.net \
--cc=arstoffel@gmail.com \
--cc=emacs-devel@gnu.org \
--cc=gregory@heytings.org \
--cc=manuel.uberti@inventati.org \
--cc=philipk@posteo.net \
--cc=spacibba@aol.com \
/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).