]> git.eshelyaron.com Git - sweep.git/commitdiff
Report correct predicate indicators in 'C-x 4 a'
authorEshel Yaron <me@eshelyaron.com>
Tue, 27 Jun 2023 17:04:46 +0000 (20:04 +0300)
committerEshel Yaron <me@eshelyaron.com>
Tue, 27 Jun 2023 17:04:46 +0000 (20:04 +0300)
* sweeprolog.el (sweeprolog-add-log-current-defun): New function.
(sweeprolog-mode): Set 'add-log-current-defun-function' to it.

* sweeprolog-tests.el: Test it.

sweeprolog-tests.el
sweeprolog.el

index a3edf682b0f6917dd4b156853b803fabc6ff4565..e074865e5a9b5ba1a479e6b35d0fc83ea78e9b3a 100644 (file)
@@ -1913,4 +1913,26 @@ head,
         (should (string= (buffer-string)
                          "% ?- true; false.\n% true\u0020\nfoo."))))))
 
+(ert-deftest add-log-current-defun ()
+  "Tests getting the predicate indicator at point."
+  (let ((temp (make-temp-file "sweeprolog-test"
+                              nil
+                              "pl"
+                              "
+foo(Bar) :-  baz(Bar).
+foo(Bar) --> baz(Bar).
+f:o(Bar) :-  baz(Bar).
+f:o(Bar) --> baz(Bar).")))
+    (find-file-literally temp)
+    (sweeprolog-mode)
+    (goto-char (point-min))
+    (forward-word)
+    (should (string= (add-log-current-defun) "foo/1"))
+    (forward-line)
+    (should (string= (add-log-current-defun) "foo//1"))
+    (forward-line)
+    (should (string= (add-log-current-defun) "f:o/1"))
+    (forward-line)
+    (should (string= (add-log-current-defun) "f:o//1"))))
+
 ;;; sweeprolog-tests.el ends here
index ae2cd48036aaf0cf731621db6104eb8901860bb8..fd13c27a368db8a1f2e1d267a7940d23539d586a 100644 (file)
@@ -4429,6 +4429,8 @@ certain contexts to maintain conventional Prolog layout."
   (setq-local adaptive-fill-regexp "[ \t]*")
   (setq-local fill-indent-according-to-mode t)
   (setq-local comment-multi-line t)
+  (setq-local add-log-current-defun-function
+              #'sweeprolog-add-log-current-defun)
   (setq-local mode-line-process
               '(:eval
                 (when (sweeprolog-buffer-loaded-since-last-modification-p)
@@ -6595,6 +6597,23 @@ as a comment in the source buffer at starting at POINT."
                               (format "`\\<sweeprolog-top-level-example-mode-map>\\[sweeprolog-top-level-example-done]' to quit and write contents as a comment in buffer %s" (buffer-name (marker-buffer marker)))))
     (sweeprolog-top-level-example-mode)))
 
+(defun sweeprolog-add-log-current-defun ()
+  "Return the indicator of the predicate defined at point, or nil.
+
+This function is used as a `add-log-current-defun-function' in
+`sweeprolog-mode' buffers."
+  (when-let ((def (sweeprolog-definition-at-point)))
+    (let ((fun  (nth 1 def))
+          (ari  (nth 2 def))
+          (neck (nth 4 def))
+          (ind  "/")
+          (mod (nth 5 def)))
+      (when (string= neck "-->")
+        (setq ari (- ari 2)
+              ind "//"))
+      (concat (when mod (concat mod ":"))
+              fun ind (number-to-string ari)))))
+
 ;;;; Footer
 
 (provide 'sweeprolog)