]> code.delx.au - gnu-emacs/commitdiff
* lisp/hi-lock.el (hi-lock--regexps-at-point): Fix boundary case for
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 10 Dec 2012 21:26:13 +0000 (16:26 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 10 Dec 2012 21:26:13 +0000 (16:26 -0500)
font-lock as well as when there's no text-property.

lisp/ChangeLog
lisp/hi-lock.el

index c75a6a9719f3038c935eca6ab09ef0cd8d4ae97d..aa870591e23c2dd72c077dace5f553a18e458019 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-10  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * hi-lock.el (hi-lock--regexps-at-point): Fix boundary case for
+       font-lock as well as when there's no text-property.
+
 2012-12-10  Jambunathan K  <kjambunathan@gmail.com>
 
        * hi-lock.el: Refine the choice of default face.
index a6ad4dd26e0b9dcec98620e83abcb27de7649bff..2ae328a09e8c2cc5bd4d3413c1db427471fa18eb 100644 (file)
@@ -474,19 +474,33 @@ updated as you type."
     (let ((regexp (get-char-property (point) 'hi-lock-overlay-regexp)))
       (when regexp (push regexp regexps)))
     ;; With font-locking on, check if the cursor is on a highlighted text.
-    (and (memq (face-at-point)
-               (mapcar #'hi-lock-keyword->face hi-lock-interactive-patterns))
-        (let* ((hi-text
-                (buffer-substring-no-properties
-                 (previous-single-property-change (point) 'face)
-                 (next-single-property-change (point) 'face))))
-          ;; Compute hi-lock patterns that match the
-          ;; highlighted text at point.  Use this later in
-          ;; during completing-read.
-          (dolist (hi-lock-pattern hi-lock-interactive-patterns)
-            (let ((regexp (car hi-lock-pattern)))
-              (if (string-match regexp hi-text)
-                  (push regexp regexps))))))
+    (let ((face-after (get-text-property (point) 'face))
+          (face-before
+           (unless (bobp) (get-text-property (1- (point)) 'face)))
+          (faces (mapcar #'hi-lock-keyword->face
+                         hi-lock-interactive-patterns)))
+      (unless (memq face-before faces) (setq face-before nil))
+      (unless (memq face-after faces) (setq face-after nil))
+      (when (and face-before face-after (not (eq face-before face-after)))
+        (setq face-before nil))
+      (when (or face-after face-before)
+        (let* ((hi-text
+                (buffer-substring-no-properties
+                 (if face-before
+                     (or (previous-single-property-change (point) 'face)
+                         (point-min))
+                   (point))
+                 (if face-after
+                     (or (next-single-property-change (point) 'face)
+                         (point-max))
+                   (point)))))
+          ;; Compute hi-lock patterns that match the
+          ;; highlighted text at point.  Use this later in
+          ;; during completing-read.
+          (dolist (hi-lock-pattern hi-lock-interactive-patterns)
+            (let ((regexp (car hi-lock-pattern)))
+              (if (string-match regexp hi-text)
+                  (push regexp regexps)))))))
     regexps))
 
 (defvar-local hi-lock--unused-faces nil