emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/sweeprolog 686db6f891 1/2: Support completion when reading


From: ELPA Syncer
Subject: [nongnu] elpa/sweeprolog 686db6f891 1/2: Support completion when reading a goal from the minibuffer
Date: Thu, 12 Jan 2023 07:59:57 -0500 (EST)

branch: elpa/sweeprolog
commit 686db6f891115e67a00f4776c18875751764876c
Author: Eshel Yaron <me@eshelyaron.com>
Commit: Eshel Yaron <me@eshelyaron.com>

    Support completion when reading a goal from the minibuffer
    
    * sweeprolog.el (sweeprolog-read-goal-map): new keymap, derived from
    sweeprolog-read-term-map.
    (sweeprolog-goals-at-point): new function, similar to
    sweeprolog-terms-at-point but only returns goal terms.
    (sweeprolog-read-goal): use them.
---
 sweeprolog.el | 37 ++++++++++++++++++++++++++++++++++---
 1 file changed, 34 insertions(+), 3 deletions(-)

diff --git a/sweeprolog.el b/sweeprolog.el
index d60a3d09e9..44c060246c 100644
--- a/sweeprolog.el
+++ b/sweeprolog.el
@@ -4732,6 +4732,13 @@ moving point."
     map)
   "Keymap used by `sweeprolog-read-term'.")
 
+(defvar sweeprolog-read-goal-map
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map sweeprolog-read-term-map)
+    (define-key map (kbd "C-i") #'completion-at-point)
+    map)
+  "Keymap used by `sweeprolog-goal-term'.")
+
 (defun sweeprolog-terms-at-point (&optional point)
   "Return boundarines of Prolog terms at POINT, innermost first."
   (setq point (or point (point)))
@@ -4754,6 +4761,23 @@ moving point."
                                         start
                                         (- point start))))))))
 
+(defun sweeprolog-goals-at-point (&optional point)
+  (when (derived-mode-p 'sweeprolog-mode 'sweeprolog-top-level-mode)
+    (setq point (or point (point)))
+    (save-excursion
+      (goto-char point)
+      (mapcar (lambda (beg-end)
+                (buffer-substring-no-properties (car beg-end)
+                                                (cdr beg-end)))
+              (let ((goals-at-point nil))
+                (sweeprolog-analyze-term-at-point
+                 (lambda (beg end arg)
+                   (when (<= beg point end)
+                     (pcase arg
+                       (`("goal_term" ,_ ,_ ,_)
+                        (push (cons beg end) goals-at-point))))))
+                goals-at-point)))))
+
 (defvar sweeprolog-read-term-history nil
   "History list for `sweeprolog-read-term'.")
 
@@ -4772,9 +4796,16 @@ moving point."
 (defun sweeprolog-read-goal (&optional prompt)
   "Read a Prolog goal prompting with PROMPT (default \"?- \")."
   (setq prompt (or prompt "?- "))
-  (read-from-minibuffer prompt nil
-                        sweeprolog-read-term-map nil
-                        'sweeprolog-read-goal-history))
+  (minibuffer-with-setup-hook
+      (lambda ()
+        (set-syntax-table sweeprolog-mode-syntax-table)
+        (dolist (capf sweeprolog-completion-at-point-functions)
+          (add-hook 'completion-at-point-functions capf nil t)))
+    (read-from-minibuffer prompt nil
+                          sweeprolog-read-goal-map nil
+                          'sweeprolog-read-goal-history
+                          (when (derived-mode-p 'sweeprolog-mode)
+                            (sweeprolog-goals-at-point)))))
 
 (defun sweeprolog-term-search-next (point overlays backward)
   "Return first overlay in OVERLAYS starting after POINT.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]