Why I don't use cider.
This is all personal opinion and a matter of taste. I'm putting it here because people have asked - I'm glad Cider exists and that a lot of people are obviously using it to great effect. This is not an attack on Cider or a an attempt to negate the experience of those who like it, just my own experience.
Also some of the critiques are more properly aimed at nRepl than Cider - I don't use nRepl either, in Emacs. For some reason I have fewer issues with it in Cursive (though I still do have some).
- With Cider, there's too much "going on" between Emacs and Clojure. When something glitches, hangs, doesn't return a value, throws an excption, etc (as it does, multiple times a day), I don't know whether the problem is in Emacs, in the Cider client, the nRepl server, one of any of the default middlewares or in my actual program. I run Emacs in inferior lisp using
lein trampoline -m clojure.main- if something goes wrong, it's either in Emacs (which is usually obvious) or my program. Middleware is especially bad about this - when something goes wrong in middleware its extremely annoying to debug and completely breaks flow with me and my program, which is an absolute deal-breaker. I have a very low tolerance for environmental failures when I'm in the middle of debugging a complex issue.
- Cider sends different output to different places. System out and system err don't show up in the REPL. Exceptions are piped to special buffers. I don't like keeping track of that and switching buffers all the time is awkward, and I don't like worrying that I missed something becase it was running in a different thread where its output isn't captured. I like everything inline in one REPL buffer. I dislike new buffers popping in and out all the time, as Cider error buffers tend to do.
- When eval'ing an individual form in a file, Cider shows the results in the minibuffer. I'd rather it showed up in the REPL window so I can refer to the history. Typing a form in the REPL and evaling it from another buffer should be identical operations, in my opinion. This is true of inferior lisp mode.
- The client/server nature of Cider/nREpl introduce complexity I don't need. I've never personally found remote REPLs to be very useful (nor, in my opinion, are they safe or secure). I only need one JVM, I only want one point of failure.
- Cider/nRepl's encoding/decoding of forms and IO is good. Not great. Occasionally I'll hit an encoding error (particularly when there is IO in non-UTF8 formats), or a form that doesn't make it over the wire intact (especially with tons of data). It doesn't happen frequently, but when it does it is incredibly annoying (and again, I often can't tell the difference with a bug in my program, immediately.)
- It doesn't actually give me anything over what inferior-lisp does. All I want to do is have a REPL, eval forms in it either by typing them or hitting a key in an existing buffer, and load files with a keystroke. That's it. Cider introduces 1000% more complexity for 5% benefit (for my workflow).
- I would like to have good auto-complete and inline documentation, but I really don't like that Cider actually has to talk to the Clojure process to make it happen. Not only does it require that I have an active connected process before any of my contextual things will work, it means they're sometimes slow, sometimes crash, and sometimes just don't work for some non-apparant reason. Having something available and working maybe 30% of the time is more distracting than not having it at all.
- Subjectively, it seems to make my emacs slow. This one is hard to quantify, sorry.