summaryrefslogtreecommitdiff
path: root/elisp/geiser-edit.el
diff options
context:
space:
mode:
authorjao <jao@gnu.org>2022-10-12 03:37:56 +0100
committerjao <jao@gnu.org>2022-10-12 03:37:56 +0100
commita9b17f08a0c40d2b2ac5d3d130a8b40f5890ccfa (patch)
tree45e2cb79d34a1b7cdcc17ac6d63bfa8472597436 /elisp/geiser-edit.el
parentd836c0025f9e51689c4c078c57546c0870498137 (diff)
downloadgeiser-a9b17f08a0c40d2b2ac5d3d130a8b40f5890ccfa.tar.gz
geiser-a9b17f08a0c40d2b2ac5d3d130a8b40f5890ccfa.tar.bz2
imenu as a last resort for jumping to definition
... as well as a way of telling imenu to look for nested define forms, as the ones one finds for instance inside (library ...) or (module ...) sexps, or simply nested defines in function bodies. it's a crappy way of finding definitions, but it's better than nothing when it's all we have (e.g., R6RS libraries don't seem to provide an environment/namespace including their privates, which is a killjoy).
Diffstat (limited to 'elisp/geiser-edit.el')
-rw-r--r--elisp/geiser-edit.el22
1 files changed, 16 insertions, 6 deletions
diff --git a/elisp/geiser-edit.el b/elisp/geiser-edit.el
index 14c782c..bfb89d6 100644
--- a/elisp/geiser-edit.el
+++ b/elisp/geiser-edit.el
@@ -112,16 +112,25 @@ or following links in error buffers.")
(beginning-of-line)
(forward-char col)))
+(defun geiser-edit--try-imenu (symbol)
+ (let* ((s (format "%s" symbol))
+ (imenu-auto-rescan t)
+ (item (assoc s (imenu--make-index-alist t))))
+ (if item (imenu item) (error "Couldn't find location for '%s'" s))))
+
(defun geiser-edit--try-edit-location (symbol loc &optional method)
(let ((symbol (or (geiser-edit--location-name loc) symbol))
- (file (geiser-edit--location-file loc))
+ (file (or (geiser-edit--location-file loc)
+ (and geiser-mode (buffer-file-name))))
(line (geiser-edit--location-line loc))
(col (geiser-edit--location-column loc))
(pos (geiser-edit--location-char loc)))
- (unless file (error "Couldn't find edit location for %s" symbol))
+ (unless file (error "Couldn't find location for '%s'" symbol))
(unless (file-readable-p file) (error "%s is not readable" file))
(geiser-edit--visit-file file (or method geiser-edit-symbol-method))
- (geiser-edit--goto-location symbol line col pos)
+ (if (or line col pos)
+ (geiser-edit--goto-location symbol line col pos)
+ (geiser-edit--try-imenu symbol))
(cons (current-buffer) (point))))
(defsubst geiser-edit--try-edit (symbol ret &optional method)
@@ -242,9 +251,10 @@ With prefix, asks for the symbol to edit."
(let* ((symbol (or (and (not arg) (geiser--symbol-at-point))
(geiser-completion--read-symbol "Edit symbol: ")))
(cmd `(:eval (:ge symbol-location ',symbol)))
- (marker (point-marker)))
+ (marker (point-marker))
+ (ret (ignore-errors (geiser-eval--send/wait cmd))))
(condition-case-unless-debug sym-err
- (progn (geiser-edit--try-edit symbol (geiser-eval--send/wait cmd))
+ (progn (geiser-edit--try-edit symbol ret)
(when marker (xref-push-marker-stack marker)))
(error (condition-case-unless-debug mod-err
(geiser-edit-module-at-point)
@@ -258,7 +268,7 @@ With prefix, asks for the symbol to edit."
"Pop back to where \\[geiser-edit-symbol-at-point] was last invoked."
(interactive)
(condition-case nil
- (pop-tag-mark)
+ (xref-pop-marker-stack)
(error "No previous location for find symbol invocation")))
(defun geiser-edit-module (module &optional method)