]> git.eshelyaron.com Git - emacs.git/commitdiff
Keep face available if there are no matches
authorTino Calancha <tino.calancha@gmail.com>
Thu, 24 Aug 2017 15:00:20 +0000 (00:00 +0900)
committerTino Calancha <tino.calancha@gmail.com>
Thu, 24 Aug 2017 15:09:50 +0000 (00:09 +0900)
If font-lock-mode is disabled in the current buffer, and
there are no matches for REGEXP, then keep FACE available
for a next search.
* lisp/hi-lock.el (hi-lock-set-pattern): Add FACE into
hi-lock--unused-faces if font-lock-mode is disabled and
there are no matches.
* test/lisp/hi-lock-tests.el (hi-lock-test-set-pattern): Add test.

lisp/hi-lock.el
test/lisp/hi-lock-tests.el

index 5139e01fa8483c7f82898c7b3ea1a14361d5c3d9..34300212f02d01711938e30078786d7b7dea5b9d 100644 (file)
@@ -693,7 +693,8 @@ with completion and history."
   "Highlight REGEXP with face FACE."
   ;; Hashcons the regexp, so it can be passed to remove-overlays later.
   (setq regexp (hi-lock--hashcons regexp))
-  (let ((pattern (list regexp (list 0 (list 'quote face) 'prepend))))
+  (let ((pattern (list regexp (list 0 (list 'quote face) 'prepend)))
+        (no-matches t))
     ;; Refuse to highlight a text that is already highlighted.
     (if (assoc regexp hi-lock-interactive-patterns)
         (add-to-list 'hi-lock--unused-faces (face-name face))
@@ -713,11 +714,14 @@ with completion and history."
           (save-excursion
             (goto-char search-start)
             (while (re-search-forward regexp search-end t)
+              (when no-matches (setq no-matches nil))
               (let ((overlay (make-overlay (match-beginning 0) (match-end 0))))
                 (overlay-put overlay 'hi-lock-overlay t)
                 (overlay-put overlay 'hi-lock-overlay-regexp regexp)
                 (overlay-put overlay 'face face))
-              (goto-char (match-end 0)))))))))
+              (goto-char (match-end 0)))
+            (when no-matches
+              (add-to-list 'hi-lock--unused-faces (face-name face)))))))))
 
 (defun hi-lock-set-file-patterns (patterns)
   "Replace file patterns list with PATTERNS and refontify."
index 2cb662cfaca06be0480c950ed420175a391c17c1..9e2401979b0c3604ac7bf4157b1494a241933177 100644 (file)
             (hi-lock-set-pattern "a" face))))
       (should (equal hi-lock--unused-faces (cdr faces))))))
 
+(ert-deftest hi-lock-test-set-pattern ()
+  (let ((faces hi-lock-face-defaults))
+    (with-temp-buffer
+      (insert "foo bar")
+      (cl-letf (((symbol-function 'completing-read)
+                 (lambda (prompt coll x y z hist defaults)
+                   (car defaults))))
+        (hi-lock-set-pattern "9999" (hi-lock-read-face-name)) ; No match
+        (hi-lock-set-pattern "foo" (hi-lock-read-face-name)))
+      ;; Only one match, then we have used just 1 face
+      (should (equal hi-lock--unused-faces (cdr faces))))))
+
 (provide 'hi-lock-tests)
 ;;; hi-lock-tests.el ends here