summaryrefslogtreecommitdiff
path: root/elisp/geiser-edit.el
diff options
context:
space:
mode:
authorjao <jao@gnu.org>2022-10-15 16:58:18 +0100
committerjao <jao@gnu.org>2022-10-15 17:01:04 +0100
commitb64ee5b8a984e06aae29b8a92362a6db03cfed3b (patch)
tree0137967f5dd95a7716b35497c897f493219a7c9a /elisp/geiser-edit.el
parentaf81e4fb1088d9ccbd36dcd541e29eb2770e4d87 (diff)
downloadgeiser-b64ee5b8a984e06aae29b8a92362a6db03cfed3b.tar.gz
geiser-b64ee5b8a984e06aae29b8a92362a6db03cfed3b.tar.bz2
local definition discovery sans imenu
we already had our own lighter mechanism, just needed to use it better. it will also allow guessing local signatures, quite useful in chezzy (or more generally r6rs-librarish) schemes.
Diffstat (limited to 'elisp/geiser-edit.el')
-rw-r--r--elisp/geiser-edit.el33
1 files changed, 14 insertions, 19 deletions
diff --git a/elisp/geiser-edit.el b/elisp/geiser-edit.el
index 750ccef..165e0fc 100644
--- a/elisp/geiser-edit.el
+++ b/elisp/geiser-edit.el
@@ -97,32 +97,28 @@ or following links in error buffers.")
geiser-edit--def-re*
(regexp-quote (format "%s" thing))))
+(defun geiser-edit--find-def (symbol)
+ (save-excursion
+ (goto-char (point-min))
+ (when (or (re-search-forward (geiser-edit--def-re symbol) nil t)
+ (re-search-forward (geiser-edit--def-re* symbol) nil t))
+ (cons (match-beginning 0) (match-string-no-properties 0)))))
+
(defsubst geiser-edit--symbol-re (thing)
(format "\\_<%s\\_>" (regexp-quote (format "%s" thing))))
(defun geiser-edit--goto-location (symbol line col pos)
- (goto-char (point-min))
- (cond ((numberp line) (forward-line (max 0 (1- line))))
+ (cond ((numberp line)
+ (goto-char (point-min))
+ (forward-line (max 0 (1- line))))
((numberp pos) (goto-char pos)))
(if (not col)
- (when (or (re-search-forward (geiser-edit--def-re symbol) nil t)
- (re-search-forward (geiser-edit--def-re* symbol) nil t)
- (re-search-forward (geiser-edit--symbol-re symbol) nil t))
- (goto-char (match-beginning 0)))
+ (when-let (pos (car (geiser-edit--find-def symbol)))
+ (goto-char pos))
(beginning-of-line)
(forward-char col)
(cons (current-buffer) (point))))
-(defun geiser-edit--try-imenu (symbol no-error)
- (let* ((s (format "%s" symbol))
- (imenu-auto-rescan t)
- (item (assoc s (imenu--make-index-alist t))))
- (unless (or item no-error)
- (error "Couldn't find location for '%s'" s))
- (when item
- (imenu item)
- (cons (current-buffer) (point)))))
-
(defun geiser-edit--try-edit-location (symbol loc &optional method no-error)
(let ((symbol (or (geiser-edit--location-name loc) symbol))
(file (geiser-edit--location-file loc))
@@ -131,9 +127,8 @@ or following links in error buffers.")
(pos (geiser-edit--location-char loc)))
(when file
(geiser-edit--visit-file file (or method geiser-edit-symbol-method)))
- (if (or file line col pos)
- (geiser-edit--goto-location symbol line col pos)
- (geiser-edit--try-imenu symbol no-error))))
+ (or (geiser-edit--goto-location symbol line col pos)
+ (error "Couldn't find location for symbol at point"))))
(defsubst geiser-edit--try-edit (symbol ret &optional method no-error)
(geiser-edit--try-edit-location symbol