[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