One thing Emacs users deal all the time is looking for the source of various libraries and function or variable definitions. Typically this involves the use of commands like C-h f (describe-function), C-h v (describe-variable) and C-h k (describe-key) and jumping to the source from the help buffer those commands produce. Let’s see if we can improve upon this workflow.


Enter the built-in Emacs library find-func. It provides a myriad of useful commands to help us quickly locate sources. Let’s take a brief look at some of them.

  • You can find the source of a library with M-x find-library. If you want to find the source of ido you can do so like this:
M-x find-library RET ido RET

I’d suggest binding the command to C-h C-l for quick access:

(define-key 'help-command (kbd "C-l") 'find-library)
  • You can find the source of a function definition with M-x find-function. Here’s an example:
M-x find-function RET find-function RET

I’d suggest binding the command to C-h C-f for quick access:

(define-key 'help-command (kbd "C-f") 'find-function)

We can actually do one better - we can directly jump to a command definition using a keybinding of the command with M-x find-function-on-key. Here’s how we can find the source the command bound to C-a (beginning-of-line):

M-x find-function-on-key RET C-a

I’d suggest binding the command to C-h C-k for quick access:

(define-key 'help-command (kbd "C-k") 'find-function-on-key)
  • You can find the source of a variable definition with M-x find-variable. Here’s an example:
M-x find-variable RET large-file-warning-threshold RET

I’d suggest binding the command to C-h C-v for quick access:

(define-key 'help-command (kbd "C-v") 'find-variable)

The library provides other useful commands as well - like find-function-at-point and find-variable-at-point.

If you don’t like the keybindings I suggested you can use find-function-setup-keys instead. This will give you keybindings like C-x F, C-x V, C-f K (plus a few extra for commands like find-funtion-other-window).


Another really cool way to browse Elisp sources (and documentation) is the third-party package elisp-slime-nav. Assuming you’ve installed it already you can enabled it like this:

(require 'elisp-slime-nav)
(dolist (hook '(emacs-lisp-mode-hook ielm-mode-hook))
(add-hook hook 'elisp-slime-nav-mode))

Once this is done you’ll be able to jump to the source of the Emacs Lisp object at point (function or variable) with M-. (as in SLIME and CIDER for Common Lisp and Clojure respectively) and jump back with M-,. You can also see the description of the object at point using C-c C-d (or C-c C-d d).

That’s all for today, folks!


All the suggested keybindings are present out-of-the-box in Prelude. elisp-slime-nav is also enabled out-of-the box in Prelude.