]> git.eshelyaron.com Git - dict.git/commitdiff
ENHANCED: underline occurrences of the variable at point
authorEshel Yaron <me@eshelyaron.com>
Thu, 29 Sep 2022 18:49:25 +0000 (21:49 +0300)
committerEshel Yaron <me@eshelyaron.com>
Thu, 29 Sep 2022 19:06:24 +0000 (22:06 +0300)
sweeprolog.el

index 2e9d322956368bde978d1c8995d2c842bfbc4ae6..937e62164c7fd5d2c000bd301ed497d43e1dae54 100644 (file)
@@ -992,6 +992,13 @@ module name, F is a functor name and N is its arity."
   (:inherit font-lock-keyword-face)
   "The empty list.")
 
+(sweeprolog-defface
+  variable-at-point
+  (:underline t)
+  (:underline t)
+  (:underline t)
+  "Variables.")
+
 (sweeprolog-defface
   variable
   (:inherit font-lock-variable-name-face)
@@ -1111,6 +1118,8 @@ module name, F is a functor name and N is its arity."
   (:inherit font-lock-doc-face :foreground "green")
   "Structured comments.")
 
+(defvar-local sweeprolog--variable-at-point nil)
+
 (defun sweeprolog--colour-term-to-faces (beg end arg)
   (pcase arg
     (`("comment" . "structured")
@@ -1202,7 +1211,14 @@ module name, F is a functor name and N is its arity."
     ("control"
      (list (list beg end (sweeprolog-control-face))))
     ("var"
-     (list (list beg end (sweeprolog-variable-face))))
+     (let ((var (buffer-substring-no-properties beg end)))
+       (with-silent-modifications
+         (put-text-property beg end 'cursor-sensor-functions
+                            (sweeprolog-cursor-sensor-functions var)))
+       (cons (list beg end (sweeprolog-variable-face))
+             (and sweeprolog--variable-at-point
+                  (string= sweeprolog--variable-at-point var)
+                  (list (list beg end (sweeprolog-variable-at-point-face)))))))
     ("fullstop"
      (list (list beg end (sweeprolog-fullstop-face))))
     ("functor"
@@ -1296,11 +1312,11 @@ module name, F is a functor name and N is its arity."
     (with-silent-modifications
       (font-lock-unfontify-region beg end))
     (sweeprolog-open-query "user"
-                      "sweep"
-                      "sweep_colourise_some_terms"
-                      (list contents
-                            (buffer-file-name)
-                            beg))
+                           "sweep"
+                           "sweep_colourise_some_terms"
+                           (list contents
+                                 (buffer-file-name)
+                                 beg))
     (let ((sol (sweeprolog-next-solution)))
       (sweeprolog-close-query)
       (when (sweeprolog-true-p sol)
@@ -2166,6 +2182,15 @@ Interactively, POINT is set to the current point."
                   (cancel-timer sweeprolog--timer))))))
 
 
+(defun sweeprolog-cursor-sensor-functions (var)
+  (list
+   (lambda (_win old dir)
+     (if (eq dir 'entered)
+         (let ((sweeprolog--variable-at-point var))
+           (font-lock-fontify-region (point) (point)))
+       (let ((sweeprolog--variable-at-point nil))
+         (font-lock-fontify-region old old))))))
+
 (provide 'sweeprolog)
 
 ;;; sweeprolog.el ends here