[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/el-search a61e0eb 079/332: Handle replacements containi
From: |
Stefan Monnier |
Subject: |
[elpa] externals/el-search a61e0eb 079/332: Handle replacements containing another match |
Date: |
Tue, 1 Dec 2020 15:48:15 -0500 (EST) |
branch: externals/el-search
commit a61e0ebafcb0e0261c007f23003125931fbf413f
Author: Michael Heerdegen <michael_heerdegen@web.de>
Commit: Michael Heerdegen <michael_heerdegen@web.de>
Handle replacements containing another match
---
el-search.el | 37 ++++++++++++++++++++++++++++++++-----
1 file changed, 32 insertions(+), 5 deletions(-)
diff --git a/el-search.el b/el-search.el
index f0d7416..1a4ca5a 100644
--- a/el-search.el
+++ b/el-search.el
@@ -196,9 +196,6 @@
;;
;; TODO:
;;
-;; - detect infloops when replacing automatically (e.g. for 1 -> '(1))
-;; Should we just fall back to interactive mode?
-;;
;; - implement backward searching
;;
;; - Make `el-search-pattern' accept an &optional limit, at least for
@@ -953,7 +950,8 @@ Hit any key to proceed."
(defun el-search-search-and-replace-pattern (pattern replacement &optional
splice to-input-string)
(let ((replace-all nil) (nbr-replaced 0) (nbr-skipped 0) (done nil)
(el-search-keep-hl t) (opoint (point))
- (get-replacement (el-search--matcher pattern replacement)))
+ (get-replacement (el-search--matcher pattern replacement))
+ (skip-matches-in-replacement 'ask))
(unwind-protect
(while (and (not done) (el-search--search-pattern pattern t))
(setq opoint (point))
@@ -969,6 +967,16 @@ Hit any key to proceed."
(get-replacement-string
(lambda () (el-search--format-replacement new-expr substring
to-input-string splice)))
(to-insert (funcall get-replacement-string))
+ (replacement-contains-another-match
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert to-insert)
+ (goto-char 1)
+ (el-search--skip-expression new-expr)
+ (condition-case nil
+ (progn (el-search--ensure-sexp-start)
+ (el-search--search-pattern pattern t))
+ (end-of-buffer nil))))
(do-replace (lambda ()
(atomic-change-group
(apply #'delete-region region)
@@ -1013,7 +1021,26 @@ Hit any key to proceed."
t)
(?? (ignore (read-char
el-search-search-and-replace-help-string))
nil)))))
- (unless (or done (eobp)) (el-search--skip-expression nil t)))))
+ (unless (or done (eobp))
+ (cond
+ ((not (and replaced-this replacement-contains-another-match))
+ (el-search--skip-expression nil t))
+ ((eq skip-matches-in-replacement 'ask)
+ (if (setq skip-matches-in-replacement
+ (yes-or-no-p "Match in replacement - always skip? "))
+ (forward-sexp)
+ (el-search--skip-expression nil t)
+ (when replace-all
+ (setq replace-all nil)
+ (message "Falling back to interactive mode")
+ (sit-for 3.))))
+ (skip-matches-in-replacement (forward-sexp))
+ (t
+ (el-search--skip-expression nil t)
+ (message "Replacement contains another match%s"
+ (if replace-all " - falling back to interactive mode"
""))
+ (setq replace-all nil)
+ (sit-for 3.)))))))
(el-search-hl-remove)
(goto-char opoint)
(message "Replaced %d matches%s"
- [elpa] externals/el-search 108466e 061/332: Support highlighting of all visible matches, (continued)
- [elpa] externals/el-search 108466e 061/332: Support highlighting of all visible matches, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 177d82e 063/332: use uninterned symbol in `el-search--matcher', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 5517384 065/332: Improve doc of el-search-this-expression-identifier., Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 1e97c09 069/332: Fix for non-interactive calls of el-search-pattern, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search c0efb8d 067/332: New user option: el-search-smart-case-fold-search, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 9f8b3d2 071/332: New function el-search--macroexpand-1 for debugging, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 975e2e5 073/332: Rewrite `string' pattern definition, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 2dc14bb 075/332: Rewrite replacement layout restoration, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 14c7cf9 074/332: el-search--check-pattern-args: make arg TYPE a string, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search fc46701 076/332: Replacing: make C-g an alternative key for quitting, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search a61e0eb 079/332: Handle replacements containing another match,
Stefan Monnier <=
- [elpa] externals/el-search 4325b91 080/332: Rename two functions, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search ba17f50 086/332: Give el-search--s a more meaningful name, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search d25f4d8 082/332: Address compiler warnings, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 2358b72 088/332: Small fix in el-search--setup-minibuffer, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 75b5849 083/332: Clarify the operation scope of replacing, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search e1797d3 087/332: Use `pp-to-string' to print replacement expression, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search ef5faf2 095/332: Improve history handling, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 4d6b361 097/332: el-search--ensure-sexp-start: don't assume point-min==1, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search e38bea8 106/332: Add calling convention to el-search-defpattern's docstring, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search e54336d 104/332: Fix el-search-query-replace reindent wrongly in narrowed buffer, Stefan Monnier, 2020/12/01