[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/el-search 108466e 061/332: Support highlighting of all
From: |
Stefan Monnier |
Subject: |
[elpa] externals/el-search 108466e 061/332: Support highlighting of all visible matches |
Date: |
Tue, 1 Dec 2020 15:48:11 -0500 (EST) |
branch: externals/el-search
commit 108466ebdeba4da28e530838ae376aaaddaf6bdf
Author: Michael Heerdegen <michael_heerdegen@web.de>
Commit: Michael Heerdegen <michael_heerdegen@web.de>
Support highlighting of all visible matches
---
el-search.el | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 59 insertions(+), 7 deletions(-)
diff --git a/el-search.el b/el-search.el
index 4157887..f6c8c48 100644
--- a/el-search.el
+++ b/el-search.el
@@ -202,8 +202,6 @@
;;
;; - detect infloops when replacing automatically (e.g. for 1 -> '(1))
;;
-;; - highlight matches around point in a timer
-;;
;; - implement backward searching
;;
;; - improve docstrings
@@ -244,9 +242,13 @@ prompt to refer to the value of the currently tested
expression."
:type 'symbol)
(defface el-search-match '((((background dark)) (:background "#0000A0"))
- (t (:background "DarkSlateGray1")))
+ (t (:background "DarkSlateGray3")))
"Face for highlighting the current match.")
+(defface el-search-other-match '((((background dark)) (:background "#202060"))
+ (t (:background
"DarkSlateGray1")))
+ "Face for highlighting the other matches.")
+
;;;; Helpers
@@ -717,6 +719,8 @@ could use this pattern:
(defvar-local el-search-hl-overlay nil)
+(defvar-local el-search-hl-other-overlays '())
+
(defvar el-search-keep-hl nil)
(defun el-search-hl-sexp (&optional bounds)
@@ -725,12 +729,55 @@ could use this pattern:
(if (overlayp el-search-hl-overlay)
(apply #'move-overlay el-search-hl-overlay bounds)
(overlay-put (setq el-search-hl-overlay (apply #'make-overlay bounds))
- 'face 'el-search-match)))
+ 'face 'el-search-match))
+ (overlay-put el-search-hl-overlay 'priority 1002))
(add-hook 'post-command-hook #'el-search-hl-post-command-fun t t))
+(defun el-search--hl-other-matches-1 (pattern from to)
+ (mapc #'delete-overlay el-search-hl-other-overlays)
+ (setq el-search-hl-other-overlays '())
+ (let ((matcher (el-search--matcher pattern))
+ this-match-beg this-match-end
+ (done nil))
+ (save-excursion
+ (goto-char from)
+ (while (not done)
+ (setq this-match-beg (el-search--search-pattern-1 matcher t))
+ (if (not this-match-beg)
+ (setq done t)
+ (goto-char this-match-beg)
+ (setq this-match-end (el-search--end-of-sexp))
+ (let ((ov (make-overlay this-match-beg this-match-end)))
+ (overlay-put ov 'face 'el-search-other-match)
+ (overlay-put ov 'priority 1001)
+ (push ov el-search-hl-other-overlays)
+ (goto-char this-match-end)
+ (when (>= (point) to) (setq done t))))))))
+
+(defun el-search-hl-other-matches (pattern)
+ "Highlight all matches visible in the selected window."
+ (el-search--hl-other-matches-1 pattern
+ (save-excursion
+ (goto-char (window-start))
+ (beginning-of-defun-raw)
+ (point))
+ (window-end))
+ (add-hook 'window-scroll-functions #'el-search--after-scroll t t))
+
+(defun el-search--after-scroll (_win start)
+ (el-search--hl-other-matches-1 el-search-current-pattern
+ (save-excursion
+ (goto-char start)
+ (beginning-of-defun-raw)
+ (point))
+ (window-end nil t)))
+
(defun el-search-hl-remove ()
(when (overlayp el-search-hl-overlay)
- (delete-overlay el-search-hl-overlay)))
+ (delete-overlay el-search-hl-overlay))
+ (remove-hook 'window-scroll-functions #'el-search--after-scroll t)
+ (mapc #'delete-overlay el-search-hl-other-overlays)
+ (setq el-search-hl-other-overlays '()))
(defun el-search-hl-post-command-fun ()
(unless (or el-search-keep-hl
@@ -789,7 +836,9 @@ The following additional pattern types are currently
defined:"
(ding)
nil))
(setq el-search-success t)
- (el-search-hl-sexp))))
+ (el-search-hl-sexp)
+ (unless (eq this-command last-command)
+ (el-search-hl-other-matches pattern)))))
(defvar el-search-search-and-replace-help-string
"\
@@ -814,7 +863,10 @@ Hit any key to proceed."
(unwind-protect
(while (and (not done) (el-search--search-pattern pattern t))
(setq opoint (point))
- (unless replace-all (el-search-hl-sexp))
+ (unless replace-all
+ (el-search-hl-sexp)
+ (unless (eq this-command last-command)
+ (el-search-hl-other-matches pattern)))
(let* ((read-mapping (el-search--create-read-map))
(region (list (point) (el-search--end-of-sexp)))
(substring (apply #'buffer-substring-no-properties region))
- [elpa] externals/el-search bff759c 047/332: el-search-query-replace: add s (toggle splicing) and ? (help) keys, (continued)
- [elpa] externals/el-search bff759c 047/332: el-search-query-replace: add s (toggle splicing) and ? (help) keys, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 0e71413 049/332: el-search--matcher: refine when to warn or error, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search aa4bd02 051/332: el-search: new pattern type `append', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search d97f8fe 052/332: remove example using `message' in a guard, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search e81afef 054/332: factor out `el-search--search-pattern-1', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 2b4c194 055/332: remove annoying message on how to repeat el-search, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 30fef15 056/332: use more newlines in `el-search--make-docstring', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search c090afe 057/332: el-search: new pattern type `contains', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 7e13746 058/332: When coming from isearch, don't move to other end, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 5837187 059/332: el-search: bump version to 0.1.3, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 108466e 061/332: Support highlighting of all visible matches,
Stefan Monnier <=
- [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, 2020/12/01