diff options
-rw-r--r-- | elisp/geiser-completion.el | 3 | ||||
-rw-r--r-- | elisp/geiser-syntax.el | 48 |
2 files changed, 49 insertions, 2 deletions
diff --git a/elisp/geiser-completion.el b/elisp/geiser-completion.el index fd22044..accbd3d 100644 --- a/elisp/geiser-completion.el +++ b/elisp/geiser-completion.el @@ -155,7 +155,8 @@ terminates a current completion." (defun geiser-completion--complete (prefix modules) (let* ((symbols (if modules (geiser-completion--module-list) - (geiser-completion--symbol-list prefix))) + (append (geiser-syntax--local-bindings) + (geiser-completion--symbol-list prefix)))) (completions (all-completions prefix symbols)) (partial (try-completion prefix symbols)) (partial (if (eq partial t) prefix partial))) diff --git a/elisp/geiser-syntax.el b/elisp/geiser-syntax.el index 2c69a5c..2025f3d 100644 --- a/elisp/geiser-syntax.el +++ b/elisp/geiser-syntax.el @@ -53,6 +53,53 @@ ;;; Code parsing: +(geiser-popup--define syntax " *geiser syntax analyst*" scheme-mode) + +(defun geiser-syntax--complete-partial-sexp (buffer begin end) + (set-buffer buffer) + (let ((inhibit-read-only t)) + (copy-to-buffer (geiser-syntax--buffer) begin end)) + (geiser-syntax--with-buffer + (goto-char (point-max)) + (skip-syntax-backward "-") + (let ((pps (parse-partial-sexp (point-min) (point)))) + (cond ((nth 8 pps) ;; inside a comment or string + (delete-region (nth 8 pps) (point-max))) + ((nth 5 pps) (delete-char -1))) ;; after a quote + (let ((depth (nth 0 pps))) + (unless (zerop depth) (insert (make-string depth ?\))))) + (geiser-syntax--prepare-scheme-for-elisp-reader) + (read (current-buffer))))) + +(defsubst geiser-syntax--get-partial-sexp () + (save-excursion + (let* ((begin (point)) + (end (progn (beginning-of-defun) (point)))) + (geiser-syntax--complete-partial-sexp (current-buffer) begin end)))) + +(defun geiser-syntax--collect-local-symbols (sexp acc) + (cond ((or (null sexp) (not (listp sexp))) acc) + ((listp (car sexp)) + (geiser-syntax--collect-local-symbols + (cdr sexp) + (geiser-syntax--collect-local-symbols (car sexp) acc))) + ((memq (car sexp) '(define define*)) + (let* ((name (cadr sexp)) + (name (if (symbolp name) name (car name))) + (acc (if (symbolp name) (cons name acc) acc))) + (geiser-syntax--collect-local-symbols (cddr sexp) acc))) + ((memq (car sexp) '(let let* letrec)) + (let* ((n (if (listp (nth 1 sexp)) 1 2)) + (syms (mapcar 'car (nth n sexp))) + (rest (if (= 1 n) (cddr sexp) (cdr (cddr sexp))))) + (geiser-syntax--collect-local-symbols rest (append syms acc)))) + (t (geiser-syntax--collect-local-symbols (cdr sexp) acc)))) + +(defsubst geiser-syntax--local-bindings () + (ignore-errors + (mapcar 'symbol-name + (geiser-syntax--collect-local-symbols (geiser-syntax--get-partial-sexp) '())))) + (defsubst geiser-syntax--end-of-thing () (let ((sc (or (syntax-class (syntax-after (point))) 0))) (when (= sc 7) (forward-char)) @@ -69,7 +116,6 @@ (let* ((p (geiser-syntax--end-of-thing)) (current (cons (symbol-at-point) 0)) (data)) -;; (data (when (car current) (list current)))) (ignore-errors (while (not (bobp)) (backward-up-list) |