diff options
author | jao <jao@gnu.org> | 2022-10-12 03:37:56 +0100 |
---|---|---|
committer | jao <jao@gnu.org> | 2022-10-12 03:37:56 +0100 |
commit | a9b17f08a0c40d2b2ac5d3d130a8b40f5890ccfa (patch) | |
tree | 45e2cb79d34a1b7cdcc17ac6d63bfa8472597436 /elisp | |
parent | d836c0025f9e51689c4c078c57546c0870498137 (diff) | |
download | geiser-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')
-rw-r--r-- | elisp/geiser-edit.el | 22 | ||||
-rw-r--r-- | elisp/geiser-imenu.el | 43 | ||||
-rw-r--r-- | elisp/geiser-mode.el | 6 | ||||
-rw-r--r-- | elisp/geiser-reload.el | 3 |
4 files changed, 65 insertions, 9 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) diff --git a/elisp/geiser-imenu.el b/elisp/geiser-imenu.el new file mode 100644 index 0000000..9573a6b --- /dev/null +++ b/elisp/geiser-imenu.el @@ -0,0 +1,43 @@ +;;; geiser-imenu.el -- Tweaks to imenu configuration -*- lexical-binding: t; -*- + +;; Copyright (c) 2022 Jose Antonio Ortega Ruiz + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the Modified BSD License. You should +;; have received a copy of the license along with this program. If +;; not, see <http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5>. + +;; Start date: Wed Oct 12, 2022 01:43 + + +(require 'geiser-impl) + +(require 'imenu) +(require 'scheme) + +(defvar geiser-imenu-generic-expression + (mapcar (lambda (e) + `(,(car e) + ,(concat "^\\(?: *\\)" (substring (cadr e) 1)) + ,@(cddr e))) + scheme-imenu-generic-expression)) + +(defvar geiser-imenu--nested-defs nil) +(geiser-impl--register-local-variable + 'geiser-imenu--nested-defs 'nested-definitions nil + "A flag indicating whether this implementation accepts nested definitions. +For instance, R6%S library forms will contain them.") + +(defun geiser-imenu-declare-nested-definitions (impl) + "Declare IMPL as one that accepts nested definitions." + (add-to-list 'geiser-imenu--nested-definition-impls impl)) + +(defun geiser-imenu-setup (activate) + "Adjust imenu for the current implementation." + (setq-local imenu-generic-expression + (if (and activate geiser-imenu--nested-defs) + geiser-imenu-generic-expression + scheme-imenu-generic-expression))) + +(provide 'geiser-imenu) +;;; geiser-imenu.el ends here diff --git a/elisp/geiser-mode.el b/elisp/geiser-mode.el index 24b0512..1bfe98d 100644 --- a/elisp/geiser-mode.el +++ b/elisp/geiser-mode.el @@ -1,6 +1,6 @@ -;;; geiser-mode.el -- minor mode for scheme buffers +;;; geiser-mode.el -- minor mode for scheme buffers -*- lexical-binding: t; -*- -;; Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2020, 2022 Jose Antonio Ortega Ruiz +;; Copyright (C) 2009-2017, 2020, 2022 Jose Antonio Ortega Ruiz ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the Modified BSD License. You should @@ -14,6 +14,7 @@ (require 'geiser-repl) (require 'geiser-capf) +(require 'geiser-imenu) (require 'geiser-menu) (require 'geiser-doc) (require 'geiser-compile) @@ -387,6 +388,7 @@ interacting with the Geiser REPL is at your disposal. (setq geiser-autodoc-mode-string "/A") (setq geiser-smart-tab-mode-string "/T") (geiser-capf-setup geiser-mode) + (geiser-imenu-setup geiser-mode) (when geiser-mode-autodoc-p (geiser-autodoc-mode (if geiser-mode 1 -1))) (when geiser-mode-smart-tab-p diff --git a/elisp/geiser-reload.el b/elisp/geiser-reload.el index 0cd3b51..431304c 100644 --- a/elisp/geiser-reload.el +++ b/elisp/geiser-reload.el @@ -1,4 +1,4 @@ -;;; geiser-reload.el -- unload/load geiser packages +;;; geiser-reload.el -- unload/load geiser packages -*- lexical-binding: t; -*- ;; Copyright (C) 2009, 2010, 2012, 2020, 2021, 2022 Jose Antonio Ortega Ruiz @@ -24,6 +24,7 @@ (defmacro geiser--features-list () (quote '( geiser-mode + geiser-imenu geiser-repl geiser-capf geiser-doc |