summaryrefslogtreecommitdiff
path: root/elisp/geiser-doc.el
diff options
context:
space:
mode:
Diffstat (limited to 'elisp/geiser-doc.el')
-rw-r--r--elisp/geiser-doc.el69
1 files changed, 40 insertions, 29 deletions
diff --git a/elisp/geiser-doc.el b/elisp/geiser-doc.el
index 6d2eb40..af1e402 100644
--- a/elisp/geiser-doc.el
+++ b/elisp/geiser-doc.el
@@ -60,7 +60,7 @@
(car geiser-doc--history))
(defun geiser-doc--history-push (link)
- (unless (equal link (car geiser-doc--history))
+ (unless (or (null link) (equal link (car geiser-doc--history)))
(let ((next (geiser-doc--history-next)))
(unless (equal link next)
(when next (geiser-doc--history-previous))
@@ -80,13 +80,14 @@
(ring-insert (nth 2 geiser-doc--history) (car geiser-doc--history)))
(setcar geiser-doc--history (ring-remove (nth 1 geiser-doc--history) 0))))
-(defvar geiser-doc--history (geiser-doc--make-history))
+(defvar geiser-doc--history nil)
+(setq geiser-doc--history (geiser-doc--make-history))
;;; Links
-(defsubst geiser-doc--make-link (target module)
- (list target module))
+(defsubst geiser-doc--make-link (target module impl)
+ (list target module impl))
(defsubst geiser-doc--link-target (link)
(nth 0 link))
@@ -94,13 +95,19 @@
(defsubst geiser-doc--link-module (link)
(nth 1 link))
+(defsubst geiser-doc--link-impl (link)
+ (nth 2 link))
+
(defun geiser-doc--follow-link (link)
(let ((target (geiser-doc--link-target link))
- (module (geiser-doc--link-module link)))
- (when target
- (if (symbolp target)
- (geiser-doc-symbol target module)
- (geiser-doc-module (format "%s" target))))))
+ (module (geiser-doc--link-module link))
+ (impl (or (geiser-doc--link-impl link)
+ (geiser-impl--default-implementation))))
+ (when (and (or target module) impl)
+ (with--geiser-implementation impl
+ `(lambda () (if (null ',target)
+ (geiser-doc-module ',module ',impl)
+ (geiser-doc-symbol ',target ',module ',impl)))))))
(defun geiser-doc--button-action (button)
(let ((link (button-get button 'geiser-link)))
@@ -111,8 +118,8 @@
'face 'geiser-font-lock-doc-link
'follow-link t)
-(defun geiser-doc--insert-button (target module)
- (let ((link (geiser-doc--make-link target module))
+(defun geiser-doc--insert-button (target module impl)
+ (let ((link (geiser-doc--make-link target module impl))
(text (format "%s" target))
(help (if module (format "%s in module %s" target module) "")))
(insert-text-button text
@@ -134,13 +141,13 @@
(put-text-property p (point) 'face 'geiser-font-lock-doc-title)
(newline)))
-(defun geiser-doc--insert-list (title lst module)
+(defun geiser-doc--insert-list (title lst module impl)
(when lst
(geiser-doc--insert-title title)
(newline)
(dolist (w lst)
(insert (format "\t- "))
- (geiser-doc--insert-button w module)
+ (geiser-doc--insert-button w module impl)
(newline))
(newline)))
@@ -154,11 +161,11 @@
(geiser-eval--send/result `(:eval ((:ge symbol-documentation) ',symbol) ,module)))
(defun geiser-doc--get-module-children (module)
- (geiser-eval--send/result `(:eval ((:ge module-children) (quote (:scm ,module))))))
+ (geiser-eval--send/result `(:eval ((:ge module-children) (:module ,module)))))
-(defun geiser-doc-symbol (symbol &optional module)
- (let* ((module (or module
- (geiser-syntax--buffer-module)))
+(defun geiser-doc-symbol (symbol &optional module impl)
+ (let* ((module (or module (geiser-eval--get-module)))
+ (impl (or impl geiser-impl--implementation))
(ds (geiser-doc--get-docstring symbol module)))
(if (or (not ds) (not (listp ds)))
(message "No documentation available for '%s'" symbol)
@@ -167,9 +174,10 @@
(geiser-doc--insert-title (cdr (assoc 'signature ds)))
(newline)
(insert (or (cdr (assoc 'docstring ds)) ""))
- (goto-line (point-min)))
- (setq geiser-doc--buffer-link
- (geiser-doc--history-push (geiser-doc--make-link symbol module)))
+ (goto-line (point-min))
+ (setq geiser-doc--buffer-link
+ (geiser-doc--history-push
+ (geiser-doc--make-link symbol module impl))))
(geiser-doc--pop-to-buffer))))
(defun geiser-doc-symbol-at-point (&optional arg)
@@ -181,11 +189,11 @@ With prefix argument, ask for symbol (with completion)."
(when symbol (geiser-doc-symbol symbol))))
-(defun geiser-doc-module (module)
+(defun geiser-doc-module (module &optional impl)
"Display information about a given module."
(interactive (list (geiser-completion--read-module)))
(let ((children (geiser-doc--get-module-children module))
- (mod-sym (car (read-from-string module))))
+ (impl (or impl geiser-impl--implementation)))
(if (not children)
(message "No info available for %s" module)
(geiser-doc--with-buffer
@@ -194,17 +202,19 @@ With prefix argument, ask for symbol (with completion)."
(newline)
(geiser-doc--insert-list "Procedures:"
(cdr (assoc 'procs children))
- mod-sym)
+ module
+ impl)
(geiser-doc--insert-list "Variables:"
(cdr (assoc 'vars children))
- mod-sym)
+ module
+ impl)
(geiser-doc--insert-list "Submodules:"
(cdr (assoc 'modules children))
- mod-sym)
- (goto-char (point-min)))
- (setq geiser-doc--buffer-link
- (geiser-doc--history-push (geiser-doc--make-link (car (read-from-string module))
- nil)))
+ module
+ impl)
+ (goto-char (point-min))
+ (setq geiser-doc--buffer-link
+ (geiser-doc--history-push (geiser-doc--make-link nil module impl))))
(geiser-doc--pop-to-buffer))))
(defun geiser-doc-next (&optional forget-current)
@@ -279,6 +289,7 @@ With prefix, the current page is deleted from history."
(geiser-popup--define doc "*Geiser documentation*" geiser-doc-mode)
+
(provide 'geiser-doc)
;;; geiser-doc.el ends here