[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#22479: 25.0.50; isearch and query-replace histories do not remember
From: |
Juri Linkov |
Subject: |
bug#22479: 25.0.50; isearch and query-replace histories do not remember if we were looking for symbols |
Date: |
Mon, 12 Mar 2018 23:43:54 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (x86_64-pc-linux-gnu) |
>> Yes, this is a harder problem. We have to remember meta-data for
>> every search history element. There are several possibilities:
>>
>> 4. Adding meta-data by text-properties to the strings in
>> ‘search-ring’ and ‘regexp-search-ring’ poses a problem of saving
>> the values in the desktop and restoring in another session.
>
> This feels like the best solution. I looked at desktop.el, and it
> doesn't save the properties, as you say. But it could be made to. Do you
> think some external packages would get broken by this change?
This seems to be the least radical change as concluded in
https://lists.gnu.org/archive/html/emacs-devel/2018-03/msg00296.html
The patch makes the search mode to be remembered in isearch as well as
in query-replace.
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 84b121a..56a44d8 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -1103,7 +1111,9 @@ isearch-done
(if (and (> (length isearch-string) 0) (not nopush))
;; Update the ring data.
- (isearch-update-ring isearch-string isearch-regexp))
+ (isearch-update-ring isearch-string isearch-regexp
+ `(regexp-function ,isearch-regexp-function
+ case-fold-search ,isearch-case-fold-search)))
(let ((isearch-mode-end-hook-quit (and nopush (not edit))))
(run-hooks 'isearch-mode-end-hook))
@@ -1119,13 +1129,14 @@ isearch-done
(and (not edit) isearch-recursive-edit (exit-recursive-edit)))
-(defun isearch-update-ring (string &optional regexp)
+(defun isearch-update-ring (string &optional regexp properties)
"Add STRING to the beginning of the search ring.
REGEXP if non-nil says use the regexp search ring."
(add-to-history
(if regexp 'regexp-search-ring 'search-ring)
- string
- (if regexp regexp-search-ring-max search-ring-max)))
+ (if properties (apply 'propertize string properties) string)
+ (if regexp regexp-search-ring-max search-ring-max)
+ t))
;; Switching buffers should first terminate isearch-mode.
;; ;; For Emacs 19, the frame switch event is handled.
@@ -1834,7 +1845,11 @@ isearch-query-replace
;; `exit-recursive-edit' in `isearch-done' that terminates
;; the execution of this command when it is non-nil.
;; We call `exit-recursive-edit' explicitly at the end below.
- (isearch-recursive-edit nil))
+ (isearch-recursive-edit nil)
+ (isearch-string-propertized
+ (propertize isearch-string
+ 'isearch-regexp-function isearch-regexp-function
+ 'isearch-case-fold-search isearch-case-fold-search)))
(isearch-done nil t)
(isearch-clean-overlays)
(if (and isearch-other-end
@@ -1847,12 +1862,12 @@ isearch-query-replace
(< (mark) (point))))))
(goto-char isearch-other-end))
(set query-replace-from-history-variable
- (cons isearch-string
+ (cons isearch-string-propertized
(symbol-value query-replace-from-history-variable)))
(perform-replace
- isearch-string
+ isearch-string-propertized
(query-replace-read-to
- isearch-string
+ isearch-string-propertized
(concat "Query replace"
(isearch--describe-regexp-mode (or delimited
isearch-regexp-function) t)
(if backward " backward" "")
@@ -2556,7 +2575,13 @@ isearch-ring-adjust1
length)))
(setq isearch-string (nth yank-pointer ring)
isearch-message (mapconcat 'isearch-text-char-description
- isearch-string "")))))
+ isearch-string ""))
+ (when (memq 'regexp-function (text-properties-at 0 isearch-string))
+ (setq isearch-regexp-function
+ (get-text-property 0 'regexp-function isearch-string)))
+ (when (memq 'case-fold-search (text-properties-at 0 isearch-string))
+ (setq isearch-case-fold-search
+ (get-text-property 0 'case-fold-search isearch-string))))))
(defun isearch-ring-adjust (advance)
;; Helper for isearch-ring-advance and isearch-ring-retreat
@@ -2772,11 +2797,16 @@ isearch-search-fun
(defun isearch--lax-regexp-function-p ()
"Non-nil if next regexp-function call should be lax."
+ ;; FIXME: maybe simpler to use this:
+ ;; (or (memq this-command '(isearch-printing-char isearch-del-char))
+ ;; isearch-yank-flag)
(not (or isearch-nonincremental
(null (car isearch-cmds))
(eq (length isearch-string)
(length (isearch--state-string
- (car isearch-cmds)))))))
+ (car isearch-cmds))))
+ ;; Search string comes from the history with text properties
+ (memq 'regexp-function (text-properties-at 0 isearch-string)))))
(defun isearch-search-fun-default ()
"Return default functions to use for the search."
diff --git a/lisp/replace.el b/lisp/replace.el
index c28c9b3..ac37bd7 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -301,7 +301,9 @@ query-replace-read-args
(to (if (consp from) (prog1 (cdr from) (setq from (car from)))
(query-replace-read-to from prompt regexp-flag))))
(list from to
- (and current-prefix-arg (not (eq current-prefix-arg '-)))
+ (or (and current-prefix-arg (not (eq current-prefix-arg '-)))
+ (and (memq 'isearch-regexp-function (text-properties-at 0 from))
+ (get-text-property 0 'isearch-regexp-function from)))
(and current-prefix-arg (eq current-prefix-arg '-)))))
(defun query-replace (from-string to-string &optional delimited start end
backward region-noncontiguous-p)
@@ -2361,8 +2363,17 @@ perform-replace
(message
(if query-flag
(apply 'propertize
- (substitute-command-keys
- "Query replacing %s with %s:
(\\<query-replace-map>\\[help] for help) ")
+ (concat "Query replacing "
+ (if backward "backward " "")
+ (if delimited-flag
+ (or (and (symbolp delimited-flag)
+ (get delimited-flag
+ 'isearch-message-prefix))
+ "word ") "")
+ (if regexp-flag "regexp " "")
+ "%s with %s: "
+ (substitute-command-keys
+ "(\\<query-replace-map>\\[help] for help) "))
minibuffer-prompt-properties))))
;; Unless a single contiguous chunk is selected, operate on multiple
chunks.
@@ -2580,13 +2591,13 @@ perform-replace
(with-output-to-temp-buffer "*Help*"
(princ
(concat "Query replacing "
+ (if backward "backward " "")
(if delimited-flag
(or (and (symbolp delimited-flag)
(get delimited-flag
'isearch-message-prefix))
"word ") "")
(if regexp-flag "regexp " "")
- (if backward "backward " "")
from-string " with "
next-replacement ".\n\n"
(substitute-command-keys
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- bug#22479: 25.0.50; isearch and query-replace histories do not remember if we were looking for symbols,
Juri Linkov <=