From: Lennart Borgman <lennart.borgman@gmail.com>
To: Juri Linkov <juri@jurta.org>
Cc: 6227@debbugs.gnu.org
Subject: bug#6227: Color isearch regexp submatches differently
Date: Tue, 8 Jun 2010 15:37:50 +0200 [thread overview]
Message-ID: <AANLkTileYK0D0RTKAePLbax_9o9JbgNlpuNXbLBzBssY@mail.gmail.com> (raw)
In-Reply-To: <AANLkTilPUyzW5lCEdQv-WD6_0WdVbDiofmN34UHMVLNA@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1124 bytes --]
On Sun, May 23, 2010 at 6:40 PM, Lennart Borgman
<lennart.borgman@gmail.com> wrote:
> On Sun, May 23, 2010 at 6:12 PM, Juri Linkov <juri@jurta.org> wrote:
>>>> I think `reb-update-overlays' should be completely rewritten
>>>> for isearch.el.
>>>
>>> You surely know this things much better than me, but is there any
>>> reason to double the code?
>>
>> `reb-update-overlays' highlights all matches in the buffer.
>> This is like what lazy-highlighting does. But we agreed
>> that it should affect only the current isearch match,
>> not all lazy-highlighted matches.
>>
>>> If it is rewritten why not let re-builder share the same code?
>>
>> Yes, and query-replace highlighting could share it too.
>
>>>> The only thing we need from re-builder.el are faces
>>>> reb-match-1, reb-match-2, reb-match-3. We should try
>>>> using the existing faces for the same functionality.
Here is a patch for the submatches highlighting. (It includes a bug
fix for the prompt face too and a help window scrolling I think is
useful.)
The current faces does not look very well together so that must be fixed.
[-- Attachment #2: isearch-hisub-1.diff --]
[-- Type: text/x-patch, Size: 6077 bytes --]
=== modified file 'lisp/isearch.el'
--- trunk/lisp/isearch.el 2010-05-20 22:33:09 +0000
+++ patched/lisp/isearch.el 2010-06-08 13:28:37 +0000
@@ -223,6 +223,12 @@
:type 'boolean
:group 'isearch)
+(defcustom search-highlight-submatches t
+ "Non-nil means incremental search highlights submatches.
+This is only done for the current hit."
+ :type 'boolean
+ :group 'isearch)
+
(defface isearch
'((((class color) (min-colors 88) (background light))
;; The background must not be too dark, for that means
@@ -1911,6 +1917,18 @@
((eq search-exit-option 'edit)
(apply 'isearch-unread keylist)
(isearch-edit-string))
+ ;; Always scroll other window if help buffer
+ ((let ((binding (key-binding key))
+ other-buffer-is-help)
+ (when (or (eq binding 'scroll-other-window-down)
+ (eq binding 'scroll-other-window))
+ (save-selected-window
+ (other-window 1)
+ (setq other-buffer-is-help (equal (buffer-name) "*Help*")))
+ (when other-buffer-is-help
+ (command-execute binding)
+ (isearch-update)
+ t))))
;; Handle a scrolling function.
((and isearch-allow-scroll
(progn (setq key (isearch-reread-key-sequence-naturally keylist))
@@ -2182,9 +2200,12 @@
(if current-input-method
(concat " [" current-input-method-title "]: ")
": ")
- )))
- (propertize (concat (upcase (substring m 0 1)) (substring m 1))
- 'face 'minibuffer-prompt)))
+ ))
+ m2)
+ (setq m2 (apply 'propertize
+ (concat (upcase (substring m 0 1)) (substring m 1))
+ minibuffer-prompt-properties))
+ (propertize m2 'read-only nil)))
(defun isearch-message-suffix (&optional c-q-hack ellipsis)
(concat (if c-q-hack "^Q" "")
@@ -2526,9 +2547,80 @@
;; Highlighting
(defvar isearch-overlay nil)
+(defvar isearch-submatches-overlays nil)
+
+(defun isearch-count-subexps (re)
+ "Return max possible subexp number for the regexp RE."
+ (save-match-data
+ (let ((i 0) (beg 0) (max-n 0))
+ ;;(while (string-match "\\\\(" re beg)
+ ;; (string-match "\\\\(" "")
+ ;; (string-match "\\\\(\\(\?[0-9]+:\\)?" "")
+ ;; (string-match "\\\\(\\(\\?[0-9]+:\\)?" "")
+ ;; (string-match "\\\\(\\(\\?[0-9]+:\\)?" "\\(?9:\\)")
+ (while (string-match "\\\\(\\(\\?[0-9]+:\\)?" re beg)
+ (setq i (1+ (max max-n i)))
+ (setq beg (match-end 0))
+ (let ((sub (match-string-no-properties 1 re)))
+ (when sub
+ (setq sub (substring sub 1))
+ (setq max-n (max max-n (string-to-number sub))))))
+ (max max-n i))))
+
+(defun isearch-unhighlight-submatches ()
+ (dolist (subovl isearch-submatches-overlays)
+ (delete-overlay subovl)))
+
+(defvar isearch-submatch-count nil) ;; For rebuilder
+(defvar isearch-subexp-to-mark nil
+ "If non-nil mark only the corresponding submatch.
+This variable must be nil or a positive integer.")
+
+(defun isearch-highlight-submatches ()
+ (isearch-unhighlight-submatches)
+ (setq isearch-submatches-overlays nil)
+ (when search-highlight-submatches
+ (require 're-builder) ;; fix-me
+ (let ((subexps (isearch-count-subexps isearch-string))
+ (subexp isearch-subexp-to-mark)
+ (submatches 0)
+ (ii 1)
+ suffix max-suffix)
+ (while (<= ii subexps)
+ (when (and (or (not subexp) (= subexp ii))
+ (match-beginning ii))
+ (let ((overlay (make-overlay (match-beginning ii)
+ (match-end ii)))
+ ;; When we have exceeded the number of provided faces,
+ ;; cycle thru them where `max-suffix' denotes the maximum
+ ;; suffix for `reb-match-*' that has been defined and
+ ;; `suffix' the suffix calculated for the current match.
+ (face
+ (cond
+ (max-suffix
+ (if (= suffix max-suffix)
+ (setq suffix 1)
+ (setq suffix (1+ suffix)))
+ (intern-soft (format "reb-match-%d" suffix)))
+ ((intern-soft (format "reb-match-%d" ii)))
+ ((setq max-suffix (1- ii))
+ (setq suffix 1)
+ ;; `reb-match-1' must exist.
+ 'reb-match-1))))
+ ;; (unless firstmatch (setq firstmatch (match-data)))
+ ;; (unless firstmatch-after-here
+ ;; (when (> (point) here)
+ ;; (setq firstmatch-after-here (match-data))))
+ (setq isearch-submatches-overlays
+ (cons overlay isearch-submatches-overlays))
+ (setq submatches (1+ submatches))
+ (overlay-put overlay 'face face)
+ ;; Priority must be higher than isearch base overlay.
+ (overlay-put overlay 'priority (+ ii 1001))))
+ (setq ii (1+ ii))))))
(defun isearch-highlight (beg end)
- (if search-highlight
+ (when search-highlight
(if isearch-overlay
;; Overlay already exists, just move it.
(move-overlay isearch-overlay beg end (current-buffer))
@@ -2536,11 +2628,14 @@
(setq isearch-overlay (make-overlay beg end))
;; 1001 is higher than lazy's 1000 and ediff's 100+
(overlay-put isearch-overlay 'priority 1001)
- (overlay-put isearch-overlay 'face isearch))))
+ (overlay-put isearch-overlay 'face isearch))
+ (when isearch-regexp
+ (isearch-highlight-submatches))))
(defun isearch-dehighlight ()
(when isearch-overlay
- (delete-overlay isearch-overlay)))
+ (delete-overlay isearch-overlay))
+ (isearch-unhighlight-submatches))
\f
;; isearch-lazy-highlight feature
;; by Bob Glickstein <http://www.zanshin.com/~bobg/>
next prev parent reply other threads:[~2010-06-08 13:37 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-20 11:01 bug#6227: Color isearch regexp submatches differently Lennart Borgman
2010-05-20 13:21 ` Drew Adams
2010-05-20 13:28 ` Lennart Borgman
2010-05-20 13:33 ` Drew Adams
2010-05-20 15:02 ` Drew Adams
2010-05-21 0:07 ` Juri Linkov
2010-05-21 1:19 ` Lennart Borgman
2010-05-22 23:44 ` Juri Linkov
2010-05-23 0:51 ` Lennart Borgman
2010-05-23 0:54 ` Juri Linkov
2010-05-23 10:04 ` Lennart Borgman
2010-05-23 16:12 ` Juri Linkov
2010-05-23 16:40 ` Lennart Borgman
2010-06-08 13:37 ` Lennart Borgman [this message]
2010-06-09 8:36 ` Juri Linkov
2010-06-09 9:14 ` Lennart Borgman
2010-06-10 15:28 ` Juri Linkov
2010-06-10 15:52 ` Lennart Borgman
2010-06-10 20:52 ` Juri Linkov
2010-06-10 21:41 ` Lennart Borgman
2010-06-11 0:44 ` Stefan Monnier
2010-06-11 8:17 ` Juri Linkov
2020-09-19 21:29 ` Lars Ingebrigtsen
2020-09-19 22:19 ` Drew Adams
2020-09-20 5:39 ` Eli Zaretskii
2020-09-20 9:41 ` Lars Ingebrigtsen
2020-09-20 9:53 ` Eli Zaretskii
2020-09-20 10:04 ` Lars Ingebrigtsen
2020-09-20 13:47 ` Lars Ingebrigtsen
2020-09-20 14:18 ` Eli Zaretskii
2020-09-20 19:45 ` Lars Ingebrigtsen
2020-09-20 20:25 ` Drew Adams
2020-09-21 2:25 ` Eli Zaretskii
2020-09-21 13:48 ` Lars Ingebrigtsen
2020-09-20 16:41 ` Drew Adams
2020-09-20 16:45 ` Eli Zaretskii
[not found] <<AANLkTikUlBKGt388RPJkU8tM6A_fpMPsTkvo6cbI3D56@mail.gmail.com>
[not found] ` <<87bpca15ja.fsf@mail.jurta.org>
[not found] ` <<AANLkTilV0TlRQRCC7-uAuspGAwTYhMySTbh4dOjKIDM0@mail.gmail.com>
[not found] ` <<87wruv1ohr.fsf@mail.jurta.org>
[not found] ` <<AANLkTimRAHa4K6FlX_952j3s2saDmcXMIbDOYx9xk8Fh@mail.gmail.com>
[not found] ` <<877hmvtn9t.fsf@mail.jurta.org>
[not found] ` <<AANLkTiljPa2oALTtTabtFb3_KHhPB9NNqnKzXZWIh_v4@mail.gmail.com>
[not found] ` <<874ohyppfs.fsf@mail.jurta.org>
[not found] ` <<AANLkTilPUyzW5lCEdQv-WD6_0WdVbDiofmN34UHMVLNA@mail.gmail.com>
[not found] ` <<AANLkTileYK0D0RTKAePLbax_9o9JbgNlpuNXbLBzBssY@mail.gmail.com>
[not found] ` <<8739ww1tjp.fsf@mail.jurta.org>
[not found] ` <<AANLkTilwC3QBYmtzPg3zrDoD44deoBsD5rxxP-dNhxnH@mail.gmail.com>
[not found] ` <<87d3vyaodq.fsf@mail.jurta.org>
[not found] ` <<87hbla4nl4.fsf@mail.jurta.org>
[not found] ` <<87mu1llak3.fsf@gnus.org>
[not found] ` <<83lfh50zxa.fsf@gnu.org>
[not found] ` <<87eemwss3t.fsf@gnus.org>
[not found] ` <<834kns22q2.fsf@gnu.org>
[not found] ` <<87sgbcrcgd.fsf@gnus.org>
[not found] ` <<874knso90e.fsf@gnus.org>
[not found] ` <<83pn6gzg3j.fsf@gnu.org>
[not found] ` <<87363ckza5.fsf@gnus.org>
[not found] ` <<835z87zx16.fsf@gnu.org>
2020-09-21 4:49 ` Drew Adams
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=AANLkTileYK0D0RTKAePLbax_9o9JbgNlpuNXbLBzBssY@mail.gmail.com \
--to=lennart.borgman@gmail.com \
--cc=6227@debbugs.gnu.org \
--cc=juri@jurta.org \
/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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.