Separate CIDER REPL Histories for Different Clojure Projects



CIDER doesn't let me have different histories for different projects! Oh, yes it does.

CIDER provides a REPL history that persists across REPL sessions. You set this up by setting the (Emacs) variable cider-repl-history-file to be the name of the file in which to store the history. CIDER will then read from the file when starting up a REPL and write to it when closing down a REPL.

History is Shared Across Projects    

That single variable is shared by all projects, which means you have one history that is shared by all projects. (FWIW, there is some jiggery-pokery that means if you have more than one REPL running at the same time you don't lose history as a result of one project blatting the write of another project.)

Annoying    

The single shared history is good if you are just playing around with stuff that isn't project-specific, but mostly I find it annoying — I want separate REPL histories for different Clojure projects.

For a while I hacked CIDER each time I upgraded it so that it created a separate file for each project. But then something changed in the CIDER code that made it harder to apply my hack and I stopped bothering.

So for a good while now I've had a single CIDER history shared across all projects.

Separate Histories for Different Projects    

But finally I've found a way to fix this, mentioned in a comment about Emacs .dir-locals on a CIDER issue about persistent REPL history. A little digging led me to the following solution…

Simply create a file called .dir-locals.el in your home directory with this content:

((cider-repl-mode
  (cider-repl-history-file . ".cider-repl-history")))

This will create a directory-local variable for cider-repl-history-file in cider-repl-mode, and each of your Clojure projects will have its own history file.

As another commenter on that CIDER issue said, Now, that sounds emacsy.


About

Simon Katz

Developer.

Clojure and Emacs enthusiast.

Full details here