Skip to content
Charles Comstock edited this page Nov 27, 2023 · 89 revisions

Available refactorings

*: These functions require an active repl connection and our middleware.

**: These functions got moved to Clojure mode but aliased here with the usual memnonics.

***: These functions got removed as an improved version was added to Clojure mode.

A cheatsheat is available here (pdf version).

These functions are available, but used so rarely they're not given a keybinding default:

  • cljr-reify-to-defrecord* replace a call to reify with a call to a defrecord constructor.
  • cljr-version Display version information for clj-refactor and the refactor-nrepl middleware.
  • cljr-toggle-debug-mode When something isn't working as intended debug mode can be toggled to get some more information about what's going on.

Customization

To take a look at the available settings do: M-x customize-group <RET> cljr <RET>

Misc features

Magic requires

Common namespace shorthands are automatically required when you type them:

For instance, typing (io/) adds [clojure.java.io :as io] to the requires.

  • io is clojure.java.io
  • set is clojure.set
  • str is clojure.string
  • walk is clojure.walk
  • zip is clojure.zip

The namespaces in cljr-magic-require-namespaces act like seed values, but once you start writing your own aliases those will be used as candidates in addition to the seed values. Note that since the result of looking up an alias in the project itself is considered to be more current, cljr-magic-require-namespaces is never consulted if the alias lookup in the project provides a hit.

You can turn this off with:

(setq cljr-magic-requires nil)

or set it to :prompt if you want to confirm before it inserts.

This feature uses the suggest-libspec middleware op, which provide completion candidates for unknown aliases in a namespace by suggesting existing aliases from the project codebase. The suggestions are aware of both the language context of the file (clj,cljs,cljc), as well as any language context specified by a surrounding reader conditional. The suggestions are augmented with the the cljr-magic-require-namespaces mapping above.

Previously this feature was provided by the namespace-aliases middleware, which is not aware of language contexts, and prompted for language context if the current file is cljs or cljc before presenting candidate alias resolutions. To revert to the older behavior disable the cljr-slash-uses-suggest-libspec flag. At some point this flag will be deprecated so suggest-libspec is the only option, so please report any issues with the new libspec completion mechanism.

Automatic insertion of namespace declaration

When you open a blank .clj-file, clj-refactor inserts the namespace declaration for you.

It will also add the relevant :use clauses in test files, normally using clojure.test, but if you're depending on midje or expectations in your project.clj it uses that instead.

Prefer to insert your own ns-declarations? Then:

(setq cljr-add-ns-to-blank-clj-files nil)

Tweaks to paredit

With clj-refactor enabled, any keybindings for paredit-raise-sexp is replaced by cljr-raise-sexp which does the same thing - except it also removes any # in front of function literals and sets.

More stuff to check out

You might also like