Files
sydnix/users/crumb/programs/emacs/lib/syd-strategies-lookup.el
Madeleine Sydney a0495c6df3 wip(emacs): Abstract strategy-running
- Show docs and goto def are confirmed working
2025-02-16 17:22:37 -07:00

71 lines
2.9 KiB
EmacsLisp

;; syd-strategies-lookup.el -*- lexical-binding: t; -*-
(require 'syd-strategies)
(use-package better-jumper)
(require 'better-jumper)
(defun syd-strat--run-lookup-strategy (strategy identifier origin)
"Safely call a lookup STRATEGY. A lookup strategy, if it is not an
interactive command, will be called with the lone argument IDENTIFIER.
Interactive or not, the procedure is expected to return nil on failure. Returns
a marker if STRATEGY returns a buffer or marker, or nil on failure.
Modifications to the window configuration will be discarded if STRATEGY fails to
return a buffer or marker."
(condition-case-unless-debug e
(let ((wconf (current-window-configuration))
(result (condition-case-unless-debug e
(if (commandp strategy)
(call-interactively strategy)
(funcall strategy identifier))
(error
(message "Lookup strategy %S threw an error: %s" strategy e)
'fail))))
(cond ((eq result 'fail)
(set-window-configuration wconf)
nil)
((bufferp result)
(with-current-buffer result
(point-marker)))
((or result
(null origin)
(/= (point-marker) origin))
(prog1 (point-marker)
(set-window-configuration wconf)))))
((error user-error)
(message "Lookup strategy %S: %s" strategy e)
nil)))
(cl-defun syd-strat--lookup-and-jump-to
(strategy-category identifier &key (display-fn #'switch-to-buffer))
(let* ((origin (point-marker))
(strategies (alist-get strategy-category syd-strat--strategies))
;; TODO: If called with a prefix argument, prompt the user to select a
;; strategy.
(result (syd-strat-try-functions-wrapped
#'syd-strat--run-lookup-strategy
strategies identifier origin)))
(unwind-protect
(when (cond ((null result)
(message "No lookup strategy could find %S" identifier)
nil)
((markerp result)
(funcall display-fn (marker-buffer result))
(goto-char result)
result)
(result))
(with-current-buffer (marker-buffer origin)
(better-jumper-set-jump (marker-position origin)))
result))
(set-marker origin nil)))
(defun syd-strat-lookup-documentation (identifier)
(interactive (list (syd-thing-at-point-or-region)))
(syd-strat--lookup-and-jump-to :documentation identifier
:display-fn #'pop-to-buffer))
(defun syd-strat-lookup-definition (identifier)
(interactive (list (syd-thing-at-point-or-region)))
(syd-strat--lookup-and-jump-to :definition identifier))
(provide 'syd-strategies-lookup)