Start command or switch to its buffer

Few weeks ago I showed you a handy way to run term-mode. You might have noticed that it makes sense for many commands to be run in a similar manner. Here’s a quick example - I often like to jump between an Emacs Lisp source buffer and an ielm (interactive Emacs Lisp shell - M-x ielm) buffer to try out stuff. I could reuse the code I showed you for ansi-term to create a similar command called visit-ielm:

(defun visit-ielm ()
  "Create or visit a `ielm' buffer."
  (if (not (get-buffer "*ielm*"))
        (split-window-sensibly (selected-window))
        (other-window 1)
    (switch-to-buffer-other-window "*ielm*")))

You might want to bind this to C-c C-z (a-la SLIME):

(define-key emacs-lisp-mode-map (kbd "C-c C-z") 'visit-ielm)

I don’t know about you, but I hate code repetition. Having that in mind we can factor out the duplication like this:

(defun start-or-switch-to (function buffer-name)
  "Invoke FUNCTION if there is no buffer with BUFFER-NAME.
Otherwise switch to the buffer named BUFFER-NAME.  Don't clobber
the current buffer."
  (if (not (get-buffer buffer-name))
        (split-window-sensibly (selected-window))
        (other-window 1)
        (funcall function))
    (switch-to-buffer-other-window buffer-name)))

(defun visit-term-buffer ()
  "Create or visit a terminal buffer."
  (start-or-switch-to (lambda ()
                         (ansi-term (getenv "SHELL")))

(defun visit-ielm ()
  "Switch to default `ielm' buffer.
Start `ielm' if it's not already running."
  (prelude-start-or-switch-to 'ielm "*ielm*"))

Much better! We can now use start-or-switch-to to build any number of similar commands!

start-or-switch-to and visit-ielm are available in Prelude(but with a prelude- prefix).

P.S. If you’d like some nice SLIME-like code navigation command in emacs-lisp-mode you might check out elisp-slime-nav.

SLIME allows very convenient navigation to the symbol at point (using M-.), and the ability to pop back to previous marks (using M-,).

This plugin provides similar navigation for Emacs Lisp, supporting navigation to the definitions of variables, functions, libraries and faces.

Additionally, elisp-slime-nav provides a way to describe the symbol at point, whatever its type. As with slime-describe-symbol, this functionality is bound both to C-c C-d d and C-c C-d C-d by default.

It’s pretty useful if you hack Emacs Lisp yourselves. If you don’t hack Emacs Lisp (yet) you probably can do without it.

elisp-slime-nav comes bundled with Prelude.