CIDER comes with a powerful solution to the problem of verbose Clojure stacktraces. Stacktraces are presented in a special major mode (cider-stacktrace-mode), which gives you the possibility to filter out certain stack frames and some handy ways to navigate causes. You'll also be able to go to the code in question with a single keystroke.

Command Keyboard shortcut Description
cider-stacktrace-previous-cause M-p Move point to previous cause
cider-stacktrace-next-cause M-n Move point to next cause
cider-stacktrace-jump M-. or Return Navigate to the source location (if available) for the stacktrace frame
cider-stacktrace-cycle-current-cause Tab Cycle current cause detail
cider-stacktrace-cycle-all-causes 0 or S-Tab Cycle all cause detail
cider-stacktrace-cycle-cause-1 1 Cycle cause #1 detail
cider-stacktrace-cycle-cause-2 2 Cycle cause #2 detail
cider-stacktrace-cycle-cause-3 3 Cycle cause #3 detail
cider-stacktrace-cycle-cause-4 4 Cycle cause #4 detail
cider-stacktrace-cycle-cause-5 5 Cycle cause #5 detail
cider-stacktrace-toggle-java j Toggle display of Java frames
cider-stacktrace-toggle-clj c Toggle display of Clojure frames
cider-stacktrace-toggle-repl r Toggle display of REPL frames
cider-stacktrace-toggle-tooling t Toggle display of tooling frames (e.g. compiler, nREPL middleware)
cider-stacktrace-toggle-duplicates d Toggle display of duplicate frames
cider-stacktrace-show-only-project p Toggle display only project frames
cider-stacktrace-toggle-all a Toggle display of all frames

You can configure whether the error buffer with stacktraces should be automatically shown on error. By default it will be displayed, but you can change this:

(setq cider-show-error-buffer nil)

At times, the error being displayed will originate from a bug in the CIDER code itself. These internal errors might frequently occur and interrupt your workflow, but you might not want to suppress all stacktrace buffers via the cider-show-error-buffer variable as above; instead, you might only want to suppress this specific type of internal error. The stacktrace buffers provide such an option when displaying an internal error. A toggle button will be displayed with the error type's name, and you can toggle whether this particular type of error will cause the stacktrace buffer to automatically show itself. The toggle button controls this behavior only during the current Emacs session, but if you would like to make the suppression more permanent, you can do so by customizing the cider-stacktrace-suppressed-errors variable. The buffer will also provide a direct link to the bug reporting page to help facilitate its diagnosis and repair.

Independently of the value of cider-show-error-buffer or cider-stacktrace-suppressed-errors, the error buffer is always generated in the background. Use cider-selector (C-c M-s) to visit this buffer.

There are two more selective strategies for the error buffer:

(setq cider-show-error-buffer 'except-in-repl) ; or
(setq cider-show-error-buffer 'only-in-repl)
  • To disable auto-selection of the error buffer when it's displayed:
(setq cider-auto-select-error-buffer nil)
  • Error buffer stacktraces may be filtered by default. Valid filter types include java, clj, repl, tooling, and dup. There are also "positive" filtering types. The value project will cause only project frames to be shown or all will force all stackframes to be shown. Note that project and all are mutually exclusive. Whichever one is first will determine the behavior if they are both present.
(setq cider-stacktrace-default-filters '(tooling dup))
;; or
(setq cider-stacktrace-default-filters '(project))
  • Error messages may be wrapped for readability. If this value is nil, messages will not be wrapped; if it is truthy but non-numeric, the default fill-column will be used.
(setq cider-stacktrace-fill-column 80)