Version 5.24.0 of package Clojure-Mode has just been released in NonGNU ELPA. You can now find it in M-x list-packages RET.
Clojure-Mode describes itself as: =========================== Major mode for Clojure code =========================== More at https://elpa.nongnu.org/nongnu/clojure-mode.html ## Summary: Provides font-lock, indentation, navigation and basic refactoring for the Clojure programming language (https://clojure.org). Using clojure-mode with paredit or smartparens is highly recommended. Here are some example configurations: ;; require or autoload paredit-mode (add-hook 'clojure-mode-hook #'paredit-mode) ;; require or autoload smartparens (add-hook 'clojure-mode-hook #'smartparens-strict-mode) See inf-clojure (https://github.com/clojure-emacs/inf-clojure) for basic interaction with Clojure subprocesses. See CIDER (https://github.com/clojure-emacs/cider) for better interaction with subprocesses via nREPL. ## Recent NEWS: # Changelog <!-- Entries are one line per item and section headings repeat for every release, so the line-length and duplicate-heading rules don't fit this file. --> <!-- markdownlint-disable MD013 MD024 --> ## master (unreleased) ## 5.24.0 (2026-11-07) ### New features * [#708](https://github.com/clojure-emacs/clojure-mode/pull/708): Add `clojure-remove-unused-keys` (`C-c C-r k`), which removes the names the top-level form at point destructures from maps but never uses, along with their `:or` defaults. ### Changes * [#705](https://github.com/clojure-emacs/clojure-mode/pull/705): Rename the `#_` toggle commands to `clojure-toggle-discard`, `clojure-toggle-discard-surrounding-form` and `clojure-toggle-discard-defun`, matching Clojure's "discard" terminology (the old `clojure-toggle-ignore*` names remain as obsolete aliases). * [#709](https://github.com/clojure-emacs/clojure-mode/pull/709): Give `extend-protocol`, `extend-type`, `specify` and `specify!` the `((:block 1) (:inner 1))` indent spec that `clojure-ts-mode` and cljfmt use, instead of an `(:inner 0)` rule that only worked because of how it was converted to the legacy format (specs copied from it need `(:inner 1)` too). * [#709](https://github.com/clojure-emacs/clojure-mode/pull/709): Indent `fdef` like cljfmt does, as `((:inner 0))`, and list `let*` in the built-in indent specs, so that `clojure-get-indent-spec` returns its spec. * [#709](https://github.com/clojure-emacs/clojure-mode/pull/709): Add the indent specs that cljfmt and `clojure-ts-mode` have and `clojure-mode` lacked, which indents the bodies of `match` and `struct-map`, and the bindings of `with-open`, `with-redefs` and the like as special arguments. * [#710](https://github.com/clojure-emacs/clojure-mode/pull/710): Drop the indent specs of `async`, `this-as` and core.logic's `run`, `run*` and `fresh`, which cljfmt and `clojure-ts-mode` don't have, so they're indented like function calls now (`put-clojure-indent` brings them back). ### Bugs fixed * [#709](https://github.com/clojure-emacs/clojure-mode/pull/709): Fix `clojure-get-indent-spec` and `put-clojure-indent` converting legacy indent specs, like those of `letfn`, `reify` or `extend-protocol`, to the wrong modern rules. * [#709](https://github.com/clojure-emacs/clojure-mode/pull/709): Fix indenting with a modern indent spec that has an `:inner` rule with a position but no `:block` rule, like `((:inner 1 0))`, which signaled an error. * [#711](https://github.com/clojure-emacs/clojure-mode/pull/711): Fix the indentation of `letfn` functions, and of other forms an `:inner` rule with an index applies to, when a `#_` form comes before them, as the discarded form and its `#_` counted as two arguments. * [#707](https://github.com/clojure-emacs/clojure-mode/issues/707): Highlight `[[var]]` and `` `code` `` only in strings and comments, so Datalog relation bindings like `[[?x]]` and destructuring like `(fn [[x]] x)` aren't colored as constants in code. ## 5.23.0 (2026-03-25) ### New features * Adopt the modern indent spec tuple format (`((:block N))`, `((:inner D))`, `((:inner D I))`) shared with `clojure-ts-mode` and `cljfmt`. The legacy format (integers, `:defn`, positional lists) is still accepted but will be removed in clojure-mode 6. * Add `clojure-get-indent-spec` public API for retrieving indent specs in the modern format. * `put-clojure-indent` and `define-clojure-indent` now accept both modern and legacy indent specs. ### Changes * Convert all built-in `define-clojure-indent` specs to the modern tuple format. * Migrate CI from CircleCI to GitHub Actions. ### Bugs fixed * Fix `clojure-paredit-setup` to apply to `edn-mode-map` as well as `clojure-mode-map`. * Fix destructive `sort` bug in `clojure-project-root-path`. ## 5.22.0 (2026-03-03) ### New features * [#687](https://github.com/clojure-emacs/clojure-mode/issues/687): Add `clojure-preferred-build-tool` to control project root detection when multiple build tool files exist. When unset, prefer directories containing `.git` as a tiebreaker. ... ...
