"Find the function that KEY invokes. KEY is a string.
Point is saved if FUNCTION is in the current buffer."
(interactive "kFind function on key: ")
- (save-excursion
- (let* ((event (and (eventp key) (aref key 0))) ; Null event OK below.
- (start (event-start event))
- (modifiers (event-modifiers event))
- (window (and (or (memq 'click modifiers) (memq 'down modifiers)
- (memq 'drag modifiers))
- (posn-window start))))
- ;; For a mouse button event, go to the button it applies to
- ;; to get the right key bindings. And go to the right place
- ;; in case the keymap depends on where you clicked.
- (when (windowp window)
- (set-buffer (window-buffer window))
- (goto-char (posn-point start)))
- (let ((defn (key-binding key))
- (key-desc (key-description key)))
- (if (or (null defn) (integerp defn))
- (message "%s is unbound" key-desc)
- (if (consp defn)
- (message "%s runs %s" key-desc (prin1-to-string defn))
- (find-function-other-window defn)))))))
+ (let (defn)
+ (save-excursion
+ (let* ((event (and (eventp key) (aref key 0))) ; Null event OK below.
+ (start (event-start event))
+ (modifiers (event-modifiers event))
+ (window (and (or (memq 'click modifiers) (memq 'down modifiers)
+ (memq 'drag modifiers))
+ (posn-window start))))
+ ;; For a mouse button event, go to the button it applies to
+ ;; to get the right key bindings. And go to the right place
+ ;; in case the keymap depends on where you clicked.
+ (when (windowp window)
+ (set-buffer (window-buffer window))
+ (goto-char (posn-point start)))
+ (setq defn (key-binding key))))
+ (let ((key-desc (key-description key)))
+ (if (or (null defn) (integerp defn))
+ (message "%s is unbound" key-desc)
+ (if (consp defn)
+ (message "%s runs %s" key-desc (prin1-to-string defn))
+ (find-function-other-window defn))))))
;;;###autoload
(defun find-function-at-point ()