From 237faf4bbeae254cda47b0cdcc38b14f208dfaee Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 3 Jul 2026 14:30:18 +0300 Subject: [PATCH 1/5] Color macrostep gensyms with theme-aware faces cider-macrostep-gensym-colors hardcoded seven hex colors (the last hardcoded color list in the codebase); replace it with cider-macrostep-gensym-faces, a palette inheriting from standard font-lock faces. The option was unreleased, so no aliases needed. --- .../ROOT/pages/debugging/macroexpansion.adoc | 4 +- lisp/cider-macrostep.el | 74 ++++++++++++++----- test/cider-macrostep-tests.el | 22 +++--- 3 files changed, 70 insertions(+), 30 deletions(-) diff --git a/doc/modules/ROOT/pages/debugging/macroexpansion.adoc b/doc/modules/ROOT/pages/debugging/macroexpansion.adoc index 0e6acafae..c38f12641 100644 --- a/doc/modules/ROOT/pages/debugging/macroexpansion.adoc +++ b/doc/modules/ROOT/pages/debugging/macroexpansion.adoc @@ -220,5 +220,5 @@ in one step. further-expandable sub-forms (on by default). * `cider-macrostep-color-gensyms` - colorize the gensyms introduced by an expansion (on by default). -* `cider-macrostep-gensym-colors` - the palette cycled through when coloring - gensyms. +* `cider-macrostep-gensym-faces` - the face palette cycled through when + coloring gensyms (theme-aware, inheriting from font-lock faces). diff --git a/lisp/cider-macrostep.el b/lisp/cider-macrostep.el index 60b55140a..e1a7721aa 100644 --- a/lisp/cider-macrostep.el +++ b/lisp/cider-macrostep.el @@ -58,18 +58,58 @@ silently skipped." (defcustom cider-macrostep-color-gensyms t "Whether to colorize the gensyms introduced by a macro expansion. When non-nil, each distinct gensym (e.g. `x__42__auto__') in an inline -expansion gets its own color from `cider-macrostep-gensym-colors', so a +expansion gets its own face from `cider-macrostep-gensym-faces', so a binding introduced by the macro can be tracked through the expansion." :type 'boolean :group 'cider :package-version '(cider . "2.0.0")) -(defcustom cider-macrostep-gensym-colors - '("#d33682" "#268bd2" "#859900" "#b58900" "#6c71c4" "#2aa198" "#cb4b16") - "Colors cycled through when coloring gensyms. -Each distinct gensym in an expansion is assigned the next color in this -list, wrapping around when an expansion has more gensyms than colors." - :type '(repeat color) +(defface cider-macrostep-gensym-1-face '((t :inherit font-lock-keyword-face)) + "Face 1 of the palette cycled through when coloring gensyms." + :group 'cider + :package-version '(cider . "2.0.0")) + +(defface cider-macrostep-gensym-2-face '((t :inherit font-lock-string-face)) + "Face 2 of the palette cycled through when coloring gensyms." + :group 'cider + :package-version '(cider . "2.0.0")) + +(defface cider-macrostep-gensym-3-face '((t :inherit font-lock-function-name-face)) + "Face 3 of the palette cycled through when coloring gensyms." + :group 'cider + :package-version '(cider . "2.0.0")) + +(defface cider-macrostep-gensym-4-face '((t :inherit font-lock-variable-name-face)) + "Face 4 of the palette cycled through when coloring gensyms." + :group 'cider + :package-version '(cider . "2.0.0")) + +(defface cider-macrostep-gensym-5-face '((t :inherit font-lock-type-face)) + "Face 5 of the palette cycled through when coloring gensyms." + :group 'cider + :package-version '(cider . "2.0.0")) + +(defface cider-macrostep-gensym-6-face '((t :inherit font-lock-constant-face)) + "Face 6 of the palette cycled through when coloring gensyms." + :group 'cider + :package-version '(cider . "2.0.0")) + +(defface cider-macrostep-gensym-7-face '((t :inherit font-lock-builtin-face)) + "Face 7 of the palette cycled through when coloring gensyms." + :group 'cider + :package-version '(cider . "2.0.0")) + +(defcustom cider-macrostep-gensym-faces + '(cider-macrostep-gensym-1-face cider-macrostep-gensym-2-face + cider-macrostep-gensym-3-face cider-macrostep-gensym-4-face + cider-macrostep-gensym-5-face cider-macrostep-gensym-6-face + cider-macrostep-gensym-7-face) + "Faces cycled through when coloring gensyms. +Each distinct gensym in an expansion is assigned the next face in this +list, wrapping around when an expansion has more gensyms than faces. +The defaults inherit from standard font-lock faces, so they follow your +theme." + :type '(repeat face) :group 'cider :package-version '(cider . "2.0.0")) @@ -288,11 +328,11 @@ symbols and are left uncolored.") (defun cider-macrostep--refresh-gensyms () "Color each distinct gensym in the active expansions. -All occurrences of a gensym share one color; different gensyms get different -colors from `cider-macrostep-gensym-colors'. A no-op when disabled." +All occurrences of a gensym share one face; different gensyms get different +faces from `cider-macrostep-gensym-faces'. A no-op when disabled." (cider-macrostep--clear-gensym-overlays) - (when (and cider-macrostep-color-gensyms cider-macrostep-gensym-colors) - (let ((colors (vconcat cider-macrostep-gensym-colors)) + (when (and cider-macrostep-color-gensyms cider-macrostep-gensym-faces) + (let ((faces (vconcat cider-macrostep-gensym-faces)) (assigned (make-hash-table :test 'equal)) (next 0) ;; Nested expansions overlap (the outer overlay still spans the inner @@ -302,13 +342,13 @@ colors from `cider-macrostep-gensym-colors'. A no-op when disabled." cider-macrostep--overlays)))) (dolist (match matches) (pcase-let ((`(,name ,beg ,end) match)) - (let ((color (or (gethash name assigned) - (let ((c (aref colors (mod next (length colors))))) - (puthash name c assigned) - (setq next (1+ next)) - c))) + (let ((face (or (gethash name assigned) + (let ((f (aref faces (mod next (length faces))))) + (puthash name f assigned) + (setq next (1+ next)) + f))) (gov (make-overlay beg end))) - (overlay-put gov 'face (list :foreground color)) + (overlay-put gov 'face face) (overlay-put gov 'priority 90) (push gov cider-macrostep--gensym-overlays))))))) diff --git a/test/cider-macrostep-tests.el b/test/cider-macrostep-tests.el index b53630bb9..516841cc6 100644 --- a/test/cider-macrostep-tests.el +++ b/test/cider-macrostep-tests.el @@ -187,24 +187,24 @@ (push (match-string-no-properties 0) matches)) (expect (nreverse matches) :to-equal '("x__1__auto__" "G__42"))))) - (it "gives each distinct gensym its own color, shared across occurrences" + (it "gives each distinct gensym its own face, shared across occurrences" (with-temp-buffer (clojure-mode) (insert "(let* [x__1__auto__ 1 y__2__auto__ 2] (list x__1__auto__ y__2__auto__))") (setq cider-macrostep--overlays (list (make-overlay (point-min) (point-max)))) - (let ((cider-macrostep-gensym-colors '("red" "blue"))) + (let ((cider-macrostep-gensym-faces '(bold italic))) (cider-macrostep--refresh-gensyms)) ;; four occurrences -> four overlays (expect (length cider-macrostep--gensym-overlays) :to-equal 4) - ;; same gensym -> same color, distinct gensyms -> distinct colors - (let ((color-of (lambda (name) - (seq-some (lambda (o) - (when (string= name (buffer-substring-no-properties - (overlay-start o) (overlay-end o))) - (overlay-get o 'face))) - cider-macrostep--gensym-overlays)))) - (expect (funcall color-of "x__1__auto__") :to-equal '(:foreground "red")) - (expect (funcall color-of "y__2__auto__") :to-equal '(:foreground "blue"))))) + ;; same gensym -> same face, distinct gensyms -> distinct faces + (let ((face-of (lambda (name) + (seq-some (lambda (o) + (when (string= name (buffer-substring-no-properties + (overlay-start o) (overlay-end o))) + (overlay-get o 'face))) + cider-macrostep--gensym-overlays)))) + (expect (funcall face-of "x__1__auto__") :to-equal 'bold) + (expect (funcall face-of "y__2__auto__") :to-equal 'italic)))) (it "does not double-color gensyms in nested (overlapping) expansions" (with-temp-buffer From 310fb775076cb41680efbb777a0ec4d82719777e Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 3 Jul 2026 14:33:22 +0300 Subject: [PATCH 2/5] Get checkdoc to zero complaints Fix the six genuine warnings (missing arguments in docstrings, an unquoted symbol, an unescaped paren, an embedded keycode) and disable checkdoc's experimental third-person-verb check in the Eldev config - it misfires on nouns like "tests" and "highlights", which a Clojure IDE can hardly avoid in docstrings. --- Eldev | 4 ++++ lisp/cider-eval.el | 9 +++++---- lisp/cider-jack-in.el | 2 +- lisp/cider-repl.el | 2 +- lisp/cider-scratch.el | 5 +++-- lisp/nrepl-client.el | 5 +++-- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Eldev b/Eldev index 1655f8f04..fff7367ae 100644 --- a/Eldev +++ b/Eldev @@ -22,6 +22,10 @@ ;; allow commas to indicate that the first sentence continues, which enables longer first sentences (setq checkdoc-permit-comma-termination-flag t) +;; the experimental third-person-verb check misfires on nouns like "tests" +;; and "highlights", which a Clojure IDE can hardly avoid in docstrings +(setq checkdoc-verb-check-experimental-flag nil) + (defvar cider-test-type 'main) (setf eldev-standard-excludes `(:or ,eldev-standard-excludes ;; Exclude flycheck temporary files diff --git a/lisp/cider-eval.el b/lisp/cider-eval.el index 9767c267f..7a723d365 100644 --- a/lisp/cider-eval.el +++ b/lisp/cider-eval.el @@ -226,8 +226,9 @@ additionally: `cider-default-err-handler' with BUFFER. BUFFER is the editor buffer the response is associated with (typically -the one that issued the eval). All other slots have the same semantics -as in `nrepl-make-eval-handler'." +the one that issued the eval). The other slots (ON-VALUE, ON-STDOUT, +ON-STDERR, ON-DONE, ON-EVAL-ERROR, ON-CONTENT-TYPE and ON-TRUNCATED) +have the same semantics as in `nrepl-make-eval-handler'." (nrepl-make-eval-handler :on-value on-value :on-stdout on-stdout @@ -329,8 +330,8 @@ REPL buffer. This is controlled via "Mark BUFFER's content as loaded into the REPL and in sync. Refreshes the evaluation fringe indicators across BUFFER and runs `cider-file-loaded-hook' (which the namespace load-state indicator hooks -into). BUFFER defaults to the current buffer. Used by the load-file flow -and by the namespace reloading commands once they finish." +into). BUFFER defaults to the current buffer. Used by the file-loading +flow and by the namespace reloading commands once they finish." (with-current-buffer (or buffer (current-buffer)) (cider--make-fringe-overlays-for-region (point-min) (point-max)) (run-hooks 'cider-file-loaded-hook))) diff --git a/lisp/cider-jack-in.el b/lisp/cider-jack-in.el index ab0ce8827..38bdecca2 100644 --- a/lisp/cider-jack-in.el +++ b/lisp/cider-jack-in.el @@ -744,7 +744,7 @@ with its nREPL middleware and dependencies." ;;; Command resolution (defun cider--resolve-command (command) - "Find COMMAND in `exec-path', or on the remote host's PATH over TRAMP. + "Find COMMAND in the variable `exec-path', or on a remote PATH over TRAMP. Return the (shell-quoted) absolute path if found, otherwise nil. When `default-directory' is remote, `executable-find' is asked to search on that host instead of the local one." diff --git a/lisp/cider-repl.el b/lisp/cider-repl.el index 9dc4e6e7e..968113c3c 100644 --- a/lisp/cider-repl.el +++ b/lisp/cider-repl.el @@ -424,7 +424,7 @@ The full getting-started help now lives in `cider-repl-help'." \\{cider-repl-help-mode-map}") (defun cider-repl--help-key (command keymap) - "Return a display key for COMMAND in KEYMAP, or an \"M-x\" form if unbound. + "Return a display key for COMMAND in KEYMAP, or an extended-command form. KEYMAP is a symbol whose value is a keymap. Only that keymap is searched (not its parents), since the refcard sections list commands bound directly in it." (if-let* ((km (and (boundp keymap) (symbol-value keymap))) diff --git a/lisp/cider-scratch.el b/lisp/cider-scratch.el index df26a4b8e..4cfcc961f 100644 --- a/lisp/cider-scratch.el +++ b/lisp/cider-scratch.el @@ -104,8 +104,9 @@ Per-session scratch buffers are named `*cider-scratch: SESSION*'.") "Go to the scratch buffer attached to the current session. Each session gets its own scratch buffer, permanently attached to it, so evaluations always target a known session. When the current context has -no clear session (or with a prefix ARG to force it), prompt for one. With -no connections at all, fall back to a single session-less scratch buffer." +no clear session (or when ASK is non-nil - interactively, a prefix +argument), prompt for one. With no connections at all, fall back to a +single session-less scratch buffer." (interactive "P") (let ((repl (or (and (not ask) (cider-current-repl)) (cider-scratch--ask-for-repl)))) diff --git a/lisp/nrepl-client.el b/lisp/nrepl-client.el index f22b7562c..e1bbb24bd 100644 --- a/lisp/nrepl-client.el +++ b/lisp/nrepl-client.el @@ -787,7 +787,8 @@ sub-handlers has been provided. All UI concerns (namespace tracking, default error handling, need-input prompting, status messages) live in higher layers -- see `cider-make-eval-handler' for the editor wrapper. -Sub-handlers, all optional: +Sub-handlers (ON-VALUE, ON-STDOUT, ON-STDERR, ON-DONE, ON-NS, ON-STATUS, +ON-EVAL-ERROR, ON-CONTENT-TYPE and ON-TRUNCATED), all optional: :on-value called with VALUE when the response carries one. :on-stdout called with the OUT string for stdout chunks. @@ -854,7 +855,7 @@ level `cider-make-eval-handler' which layers UI concerns on top. The shim adapts the (BUFFER VALUE)-style sub-handlers expected here to the simpler (VALUE)-style sub-handlers of `nrepl-make-eval-handler', and additionally wires up the global handler hooks -(`nrepl-namespace-handler-function', `nrepl-err-handler-function', +\\(`nrepl-namespace-handler-function', `nrepl-err-handler-function', `nrepl-need-input-handler-function') and the legacy status messages that used to live inside `nrepl-make-eval-handler' itself. Anything that was visible behavior of the original 7-positional-arg API stays From c5f3aa1a42a27f7f07a401b57444538d3897953a Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 3 Jul 2026 14:34:28 +0300 Subject: [PATCH 3/5] Bump the default REPL history size to 5000 History is cheap, and 500 entries is easy to blow through in a day of REPL work. Also freshen cider-print-buffer-size's docstring, which still described the pre-#4049 per-chunk font-locking behavior; its 4K default stays - benchmarking chunk sizes against a live nREPL showed no measurable difference between 4K and 16K, and a regression at 64K. --- CHANGELOG.md | 1 + lisp/cider-client.el | 5 ++--- lisp/cider-repl.el | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9c612954..dee8f7d15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ ### Changes +- Bump the default `cider-repl-history-size` from 500 to 5000. - Rename the REPL history browser from `cider-repl-history` to `cider-history` (command, mode and options), so its names no longer clash with the REPL's unrelated input-history settings (`cider-repl-history-file`, `cider-repl-history-size`); the old names keep working as obsolete aliases. - Color the nREPL messages buffer with theme-aware faces (`nrepl-message-faces`, eight faces inheriting from standard font-lock faces) instead of a hardcoded color list; `nrepl-message-colors` is now obsolete, but still takes precedence when customized. - Consolidate the per-buffer auto-select options into a single `cider-auto-select-buffer`, which can be `t`, `nil` or a list of the popup buffers to select (e.g. `'(error inspector)`); the old options (`cider-auto-select-error-buffer`, `cider-auto-select-test-report-buffer`, `cider-doc-auto-select-buffer`, `cider-inspector-auto-select-buffer`, `cider-cheatsheet-auto-select-buffer` and `cider-log-auto-select-frameworks-buffer`) are now obsolete, but still take precedence when customized. diff --git a/lisp/cider-client.el b/lisp/cider-client.el index 56a7947a8..0a4ecb49f 100644 --- a/lisp/cider-client.el +++ b/lisp/cider-client.el @@ -490,9 +490,8 @@ Set to nil for no limit." (defcustom cider-print-buffer-size (* 4 1024) "The size in bytes of each value/output chunk when using print streaming. -Smaller values mean smaller data chunks and faster feedback, but they also mean -smaller results that can be font-locked as Clojure in the REPL buffers, as only -a single chunk result can be font-locked. +Smaller values mean faster first feedback, but also more messages for large +results, with the associated decoding overhead. The default value in nREPL is 1024." :type 'integer diff --git a/lisp/cider-repl.el b/lisp/cider-repl.el index 968113c3c..f9cdb522c 100644 --- a/lisp/cider-repl.el +++ b/lisp/cider-repl.el @@ -1775,7 +1775,7 @@ If USE-CURRENT-INPUT is non-nil, use the current input." (t nil))) ;;; persistent history -(defcustom cider-repl-history-size 500 +(defcustom cider-repl-history-size 5000 "The maximum number of items to keep in the REPL history." :type 'integer :safe #'integerp) From 16aef3a41a9145c09b277b3ba99e638a8731d9d5 Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 3 Jul 2026 14:36:14 +0300 Subject: [PATCH 4/5] Two small robustness tweaks Truncate huge eval results before the overlay face bookkeeping walks them (they get cut to the display threshold anyway), and give the reload-clear sync request a 60s timeout - the op is fast by itself but serializes behind any refresh already in flight (#3652). --- lisp/cider-ns.el | 6 +++++- lisp/cider-overlays.el | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lisp/cider-ns.el b/lisp/cider-ns.el index f9f84b339..bb2d77bdd 100644 --- a/lisp/cider-ns.el +++ b/lisp/cider-ns.el @@ -383,7 +383,11 @@ inhibit-fns)), which is how `cider-ns-menu' passes its arguments." nil t)) (when clear? - (cider-nrepl-sync-request `("op" ,(cider-ns--reload-op "reload-clear")) :connection conn)) + ;; The clear op is fast by itself, but it serializes behind any + ;; refresh already in flight, which on large projects can hold + ;; the lock well past the default timeout (#3652). + (let ((nrepl-sync-request-timeout 60)) + (cider-nrepl-sync-request `("op" ,(cider-ns--reload-op "reload-clear")) :connection conn))) (let ((reloading (list nil))) (cider-nrepl-send-request `("op" ,(cider-ns--reload-op (if all? "reload-all" "reload")) diff --git a/lisp/cider-overlays.el b/lisp/cider-overlays.el index 26d6a7e73..150094fe9 100644 --- a/lisp/cider-overlays.el +++ b/lisp/cider-overlays.el @@ -328,6 +328,12 @@ overlay." ;; Maximum value width at which we truncate it. (truncation-threshold (* 3 (window-width))) (o nil)) + ;; Huge results get truncated to the threshold below anyway; cut + ;; them down early so the face and width bookkeeping doesn't have + ;; to walk the full text. + (when (> (length display-string) (* 2 truncation-threshold)) + (setq display-string + (substring display-string 0 (* 2 truncation-threshold)))) ;; Remove any overlay at the position we're creating a new one, if it ;; exists. (remove-overlays beg end 'category type) From c60648a908192f7f4f3b765d7304bbacee6af10d Mon Sep 17 00:00:00 2001 From: Bozhidar Batsov Date: Fri, 3 Jul 2026 14:40:04 +0300 Subject: [PATCH 5/5] Bring the refcard up to date cider-macroexpand-all moved to C-c M-m a, and the card now also lists inline macrostep, source-based find-references, the who-calls / who-implements queries and cider-ns-reload. --- refcard/cider-refcard.pdf | Bin 36640 -> 36650 bytes refcard/cider-refcard.tex | 11 ++++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/refcard/cider-refcard.pdf b/refcard/cider-refcard.pdf index 37d15f2733cb7e731ea8d0047462c0a60f9de020..cc62da5ff3431ebfb5541456925a1968e2fe9b73 100644 GIT binary patch delta 12219 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�n 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 J7gv-(_#ezqsR;l8 delta 12233 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