camdez.com

Rule #1: There are no rules.

Emacs: Jump to Info From Command Documentation

| Comments

One of the coolest things about Emacs is that it’s self-documenting. What this means is that for any piece of functionality in Emacs, we can ask the editor about that thing. We can ask it to tell us about any function (C-h f), variable (C-h v), key binding (C-h k) or even the mode(s) we’re currently in (C-h m). Most of the time this documentation is comprehensive and heavily cross-referenced. If you’re not using these commands, you absolutely should start today.

Emacs also comes bundled with a detailed user manual (C-h r — think, read the manual), which is important when you don’t know exactly what you’re looking for, or if you want to see a command in the context of related functionality. Maybe you know about kill-word and kill-sentence but they aren’t exactly what you’re looking for — the manual is the first place to check to learn about (say) kill-sentence or kill-sexp.

Somewhat less well-known is the handy Info-goto-emacs-command-node command (on C-h F) which will take you directly to the Emacs manual page that talks about a given command. But unless we’re coding in Elisp, most of the time we work in terms of keystrokes and not command names. Wouldn’t it be more useful if we could look at the documentation for given key sequence and then, if we wanted more information, easily jump to the corresponding manual page? Let’s code that up:

1
2
3
4
5
6
7
8
9
10
(defun camdez/Info-goto-from-command-help ()
  "Go to the Info node in the Emacs manual for the command
currently being viewed in `help-mode'."
  (interactive)
  (let ((help-function (car help-xref-stack-item))
        (help-symbol (cadr help-xref-stack-item)))
    (if (and (eq help-function 'describe-function)
             (commandp help-symbol))
        (Info-goto-emacs-command-node help-symbol)
      (error "Info is only available for commands"))))

(Note that we have to do a couple tests on help-xref-stack-item because we can only jump into the manual for commands, and not for arbitrary functions or variables.)

Now let’s bind that to the (previously unused) i key in help-mode:

1
2
(eval-after-load 'help-mode
  '(define-key help-mode-map "i" 'camdez/Info-goto-from-command-help))

And we’re done! After putting that in your .emacs file and restarting Emacs (or reloading the config), try it out with something like C-h k C-k (“what does the C-k keystroke do?”) and then press i in the *Help* buffer.

Comments