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

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

[nongnu] elpa/sweeprolog 2f6cbc5e8b 1/5: ADDED: completion-at-point for


From: ELPA Syncer
Subject: [nongnu] elpa/sweeprolog 2f6cbc5e8b 1/5: ADDED: completion-at-point for variable names
Date: Tue, 25 Oct 2022 13:59:16 -0400 (EDT)

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

    ADDED: completion-at-point for variable names
    
    * sweeprolog.el (sweeprolog-local-variables-collection,
    sweeprolog-variable-completion-at-point): new
    functions. (sweeprolog-mode): add to
    completion-at-point-functions. (sweeprolog-mode-syntax-table): update
    according to char_type(Char, prolog_symbol).
---
 README.org    |  6 +++---
 sweeprolog.el | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 58 insertions(+), 5 deletions(-)

diff --git a/README.org b/README.org
index 567a34a669..904fbf7dbb 100644
--- a/README.org
+++ b/README.org
@@ -1424,9 +1424,9 @@ there some further improvements that we want to pursue:
   predicates]]).
 
 - Add commands for narrowing and moving by predicate definitions :: 
~sweeprolog-mode~
-  should include commands moving point to the next/previous predicate
-  definition.  We already have commands for clause-based motion
-  (~C-M-a~, ~C-M-e~) but it would be useful to have predicate-based
+  should include commands for moving point to the next/previous
+  predicate definition.  We already have commands for clause-based
+  motion (~C-M-a~, ~C-M-e~) but it would be useful to have predicate-based
   variants as well.  These commands could then be bound to ~C-c C-n~ for
   moving to the next predicate definition and ~C-c C-p~ for moving to
   the previous.
diff --git a/sweeprolog.el b/sweeprolog.el
index a8778d994c..b0c4c07bbe 100644
--- a/sweeprolog.el
+++ b/sweeprolog.el
@@ -635,6 +635,49 @@ default."
     (when (sweeprolog-true-p sol)
       (cdr sol))))
 
+(defun sweeprolog-local-variables-collection (&rest exclude)
+  "Return a list of variable names that occur in the current clause.
+
+EXCLUDE is a list of variables name to be excluded from the
+resulting list even when found in the current clause."
+  (let* ((beg (save-mark-and-excursion
+                (unless (sweeprolog-at-beginning-of-top-term-p)
+                  (sweeprolog-beginning-of-top-term))
+                (max (1- (point)) (point-min))))
+         (end (save-mark-and-excursion
+                (sweeprolog-end-of-top-term)
+                (point)))
+         (vars nil))
+    (save-excursion
+      (goto-char beg)
+      (save-match-data
+        (while (search-forward-regexp (rx bow (or "_" upper)
+                                          (* alnum))
+                                      end t)
+          (unless (nth 8 (syntax-ppss))
+            (let ((match (match-string-no-properties 0)))
+              (unless (or (member match exclude)
+                          (member match vars))
+                (push (match-string-no-properties 0) vars)))))))
+    vars))
+
+
+(defun sweeprolog-variable-completion-at-point ()
+  "Prolog variable name completion backend for `completion-at-point'."
+  (when-let ((bounds (bounds-of-thing-at-point 'symbol))
+             (beg (car bounds))
+             (end (cdr bounds)))
+    (when (and (<= beg (point) end)
+               (let ((first (char-after beg)))
+                 (or (char-uppercase-p first)
+                     (= first ?_))))
+      (when-let ((col (sweeprolog-local-variables-collection
+                       (buffer-substring-no-properties beg end))))
+        (list beg end col
+              :exclusive 'no
+              :annotation-function
+              (lambda (_) " Var"))))))
+
 (defun sweeprolog-completion-at-point-function ()
   (when-let ((bounds (sweeprolog-predicate-prefix-boundaries)))
     (let ((start (car bounds))
@@ -2110,12 +2153,21 @@ of them signal success by returning non-nil."
 
 (defvar sweeprolog-mode-syntax-table
   (let ((table (make-syntax-table)))
-    (modify-syntax-entry ?_ "_" table)
+    (modify-syntax-entry ?# "." table)
+    (modify-syntax-entry ?$ "." table)
+    (modify-syntax-entry ?& "." table)
     (modify-syntax-entry ?+ "." table)
     (modify-syntax-entry ?- "." table)
-    (modify-syntax-entry ?= "." table)
+    (modify-syntax-entry ?. "." table)
+    (modify-syntax-entry ?: "." table)
     (modify-syntax-entry ?< "." table)
+    (modify-syntax-entry ?= "." table)
     (modify-syntax-entry ?> "." table)
+    (modify-syntax-entry ?? "." table)
+    (modify-syntax-entry ?@ "." table)
+    (modify-syntax-entry ?^ "." table)
+    (modify-syntax-entry ?~ "." table)
+    (modify-syntax-entry ?_ "_" table)
     (modify-syntax-entry ?| "." table)
     (modify-syntax-entry ?\' "\"" table)
     (modify-syntax-entry ?` "\"" table)
@@ -3034,6 +3086,7 @@ if-then-else constructs in SWI-Prolog."
   (add-hook 'xref-backend-functions #'sweeprolog--xref-backend nil t)
   (add-hook 'file-name-at-point-functions #'sweeprolog-file-at-point nil t)
   (add-hook 'completion-at-point-functions 
#'sweeprolog-completion-at-point-function nil t)
+  (add-hook 'completion-at-point-functions 
#'sweeprolog-variable-completion-at-point nil t)
   (when sweeprolog-colourise-buffer-on-idle
     (setq sweeprolog--timer
           (run-with-idle-timer



reply via email to

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