forked from colonelpanic/dotfiles
83 lines
2.5 KiB
EmacsLisp
83 lines
2.5 KiB
EmacsLisp
|
|
;;; elisp-slime-nav.el --- Make M-. and M-, work in elisp like they do in slime
|
|
;;
|
|
;; Author: Steve Purcell <steve@sanityinc.com>
|
|
;; Keywords: navigation slime elisp emacs-lisp
|
|
;; URL: https://github.com/purcell/elisp-slime-nav
|
|
;; Version: 0.3
|
|
;;
|
|
;;; Commentary
|
|
;;
|
|
;; This package provides Slime's convenient "M-." and "M-," navigation
|
|
;; in `emacs-lisp-mode'.
|
|
;;
|
|
;; Additionally, C-u M-. will prompt for the symbol to which to jump.
|
|
;;
|
|
;; Usage:
|
|
;;
|
|
;; (require 'elisp-slime-nav)
|
|
;; (add-hook 'emacs-lisp-mode-hook (lambda () (elisp-slime-nav-mode t)))
|
|
;;
|
|
;; Known issues:
|
|
;;
|
|
;; When navigating into Emacs' C source, "M-," will not be bound to
|
|
;; the same command, but "M-*" will typically do the trick.
|
|
;;
|
|
;;; Code
|
|
(defvar elisp-slime-nav-mode-map (make-keymap))
|
|
|
|
;;;###autoload
|
|
(define-minor-mode elisp-slime-nav-mode
|
|
"Enable Slime-style navigation of elisp symbols using M-. and M-,"
|
|
nil " SliNav" elisp-slime-nav-mode-map)
|
|
|
|
(eval-when-compile (require 'cl))
|
|
(require 'etags)
|
|
|
|
|
|
(defun elisp-slime-nav--all-navigable-symbol-names ()
|
|
"Return a list of strings for the symbols to which navigation is possible."
|
|
(loop for x being the symbols
|
|
if (or (fboundp x) (boundp x) (symbol-plist x) (facep x))
|
|
collect (symbol-name x)))
|
|
|
|
;;;###autoload
|
|
(defun elisp-slime-nav-find-elisp-thing-at-point (sym-name)
|
|
"Jump to the elisp thing at point, be it a function,variable, library or face.
|
|
|
|
With a prefix arg, prompt for the symbol to jump to.
|
|
|
|
Argument SYM-NAME thing to find."
|
|
(interactive
|
|
(list
|
|
(let* ((sym-at-point (symbol-at-point))
|
|
(at-point (and sym-at-point (symbol-name sym-at-point))))
|
|
(if current-prefix-arg
|
|
(completing-read "Symbol: "
|
|
(elisp-slime-nav--all-navigable-symbol-names)
|
|
nil t at-point)
|
|
at-point))))
|
|
(when sym-name
|
|
(let ((sym (intern sym-name)))
|
|
(message "search for %s" (pp-to-string sym))
|
|
(ring-insert find-tag-marker-ring (point-marker))
|
|
(cond
|
|
((fboundp sym) (find-function sym))
|
|
((boundp sym) (find-variable sym))
|
|
((or (featurep sym) (locate-library sym-name))
|
|
(find-library sym-name))
|
|
((facep sym)
|
|
(find-face-definition sym))
|
|
(:else
|
|
(progn
|
|
(pop-tag-mark)
|
|
(error "Don't know how to find '%s'" sym)))))))
|
|
|
|
|
|
(define-key elisp-slime-nav-mode-map (kbd "M-.") 'elisp-slime-nav-find-elisp-thing-at-point)
|
|
(define-key elisp-slime-nav-mode-map (kbd "M-,") 'pop-tag-mark)
|
|
|
|
|
|
(provide 'elisp-slime-nav)
|
|
;;; elisp-slime-nav.el ends here
|