summaryrefslogtreecommitdiff
path: root/elisp/geiser-syntax.el
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@gnu.org>2009-08-17 04:18:02 +0200
committerJose Antonio Ortega Ruiz <jao@gnu.org>2009-08-17 04:18:02 +0200
commit283e6f040449bb4f740991956007332c48308b38 (patch)
treea33bb00a155f11149b361f97aeebe2c0a1cc05ae /elisp/geiser-syntax.el
parent9d64bcb33f7ac1b3a06220842d04ce3c0534948e (diff)
downloadgeiser-guile-283e6f040449bb4f740991956007332c48308b38.tar.gz
geiser-guile-283e6f040449bb4f740991956007332c48308b38.tar.bz2
Simpler, more correct and efficient autodoc implementation.
Not that it was difficult: it's replacing an ugly kludge.
Diffstat (limited to 'elisp/geiser-syntax.el')
-rw-r--r--elisp/geiser-syntax.el27
1 files changed, 27 insertions, 0 deletions
diff --git a/elisp/geiser-syntax.el b/elisp/geiser-syntax.el
index db1c842..475a556 100644
--- a/elisp/geiser-syntax.el
+++ b/elisp/geiser-syntax.el
@@ -94,6 +94,33 @@
(defsubst geiser-syntax--beginning-of-form ()
(memq (char-after (point)) '(?\" ?\()))
+(defun geiser-syntax--scan-sexp ()
+ (let ((p (point))
+ (n -1)
+ prev
+ head)
+ (ignore-errors
+ (backward-up-list)
+ (save-excursion
+ (forward-char)
+ (skip-syntax-forward "^_w" p)
+ (when (setq head (symbol-at-point))
+ (while (< (point) p)
+ (setq n (1+ n))
+ (setq prev (symbol-at-point))
+ (forward-sexp))))
+ (if head (list head n prev) 'skip))))
+
+(defun geiser-syntax--scan-sexps ()
+ (save-excursion
+ (goto-char (or (nth 8 (syntax-ppss)) (point)))
+ (let* ((sap (symbol-at-point))
+ (path (and sap `((,sap 0))))
+ s)
+ (while (setq s (geiser-syntax--scan-sexp))
+ (when (listp s) (push s path)))
+ path)))
+
(defun geiser-syntax--complete-partial-sexp (buffer begin end)
(geiser-syntax--with-buffer
(erase-buffer)