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.
...
...

Reply via email to