A Clojure scratch REPL

2019-10-21

I had the idea recently that my one-off hacking would be greatly aided if I could hit a key in Emacs and immediately have a buffer connected to a running Clojure REPL session.

This REPL session would come with a bunch of dependencies preloaded for things like local database access, JSON, HTTP, parsing, etc. All of those quick, scripty things.

So I added created an Emacs lisp function to do it:

(defun clj-scratch ()
  "Create a scratch clojure buffer and jack in with default deps"
  (interactive)
  ;; if there is a file that is TODAYS_DATE.clj,
  ;; open it, otherwise create it and open it
  (let* ((todays-date (insert-current-date-underscores))
         (buf (find-file (concat "~/code/dotfiles/scratch/src/ckampfe/" todays-date ".clj"))))

    (switch-to-buffer buf)

    ;; if the buffer is empty, insert the default imports
    (if (<= (buffer-size buf) 25)
        (insert-file-contents "~/code/dotfiles/scratch/default.clj" nil nil nil))

    ;; if the buffer is not connected to a cider session, start one
    (with-current-buffer buf
      (clojure-mode)
      (if (not (cider-connected-p))
          (cider-jack-in-clj '(:project-dir "~/code/dotfiles/scratch"))))))

The function is set up to find or create a Clojure file with today's date if one doesn't exist. In this way, I get a new notebook-style file every day, rather than overwriting any previous day's work.

The function also templates in the necessary require setup and database connection boilerplate that I always end up looking up.

You can see the current version of this setup here, in .spacemacs and scratch: https://github.com/ckampfe/dotfiles