Emacs Carnival: Useful built-ins: The describe family of commands

*
planted: 30/06/2026last tended: 30/06/2026

The Emacs Carnival for June 2026 is on underappreciated Emacs built-ins, hosted by Ross Baker.

I like the prompts that Ross has given to get you thinking about this, e.g. reading the manual (conveniently built-in to Emacs), or looking at the list of packages that come built into Emacs. It's good to get under the hood and see what comes in the box.

My choice of built-ins to talk about are: the describe-* family of commands. I don't know if they are particularly underappreciated - maybe everyone knows about them already! But still, worth a quick shout-out to them. I personally use them a lot. And I think that they fall into a really nice part of the overall Emacs ethos - that you can inspect how every part of Emacs works, from inside Emacs. It's one of the things that makes Emacs a convivial tool. And we should Use Convivial Tools.

They mostly live in help.el and help-fns.el as far as I can see.

(require 'url)
(let ((base "https://git.savannah.gnu.org/cgit/emacs.git/plain/lisp/")
      fns)
  (dolist (file '("help.el" "help-fns.el"))
    (with-temp-buffer
      (url-insert-file-contents (concat base file))
      (goto-char (point-min))
      (while (re-search-forward "(defun \\(describe-[^ )]+\\)" nil t)
        (push (intern (match-string 1)) fns))))
  (sort (delete-dups (nreverse fns)) #'string<))
  • describe-bindings
  • describe-categories
  • describe-command
  • describe-copying
  • describe-distribution
  • describe-face
  • describe-function
  • describe-function–helper
  • describe-function-1
  • describe-gnu-project
  • describe-key
  • describe-key–helper
  • describe-key-briefly
  • describe-keymap
  • describe-map
  • describe-map–align-section
  • describe-map–fill-columns
  • describe-minor-mode
  • describe-minor-mode-completion-table-for-indicator
  • describe-minor-mode-completion-table-for-symbol
  • describe-minor-mode-from-indicator
  • describe-minor-mode-from-symbol
  • describe-mode
  • describe-mode–minor-modes
  • describe-no-warranty
  • describe-prefix-bindings
  • describe-symbol
  • describe-syntax
  • describe-variable
  • describe-variable-custom-version-info
  • describe-widget

There's a lot. The ones I've used frequently are:

  • describe-bindings
  • describe-mode
  • describe-key
  • describe-variable

I'll talk a little more about each.

0.1. describe-bindings

M-x describe-bindings gives you a list of all the keybindings available to you. And, beyond finding out the bindings, it's also just very handy to see what operations are available to you in. It's basically an in-built cheatsheet for all of Emacs.

As far as I can tell it is bindings for everything, so it can be a bit overwhelming. What can work better is…

0.2. describe-mode

M-x describe-mode tells you about the currently active modes (major and minor). It'll give you a brief description of the modes, as well as the key bindings for the mode.

Similarly to describe-bindings, it's another handy cheat sheet for wherever you're currently doing in Emacs. In something like Doom, if feels like there's a lot of minor-modes in play at any given moment, so you still get a lot of info here. A bit less than describe-bindings though I think.

As an example, I use describe-mode recently when reacquainting myself with using elfeed and couldn't remember what exactly I could do, and the keys to do it with in Doom.

0.3. describe-key

Sometimes, you know how to do something, but you're intrigued as to what is running under the hood in order to do it.

Example: I know in Doom I can highlight a piece of text, press S, and then press a character I want to surround that piece of text with. I do it with ~ (tilde) often to highlight keys or inline snippets of code.

But what is actually doing that? If I highlight the text, then press M-x describe-key, then S, it tells me that it's evil-surround-region. Good to know if I ever need to debug something related to it, or get more info on it somewhere.

You can do this for any key press. It's powerful.

0.4. describe-variable

Another goto is M-x describe-variable, which will tell you all about a particular variable. What its default value is, and what it's current value is.

I use this all the time, sadly mainly to figure out why something has the wrong value and where I've messed my config up.

1. Elsewhere

1.1. In my garden

Notes that link to this note (AKA backlinks).

1.3. Mentions

Recent changes. Source. Peer Production License.