In addition to the functionality provided by
CIDER I use lispy and
clj-refactor to round out my tooling needs. Each of these packages is deep. I mean really
deep. I'm constantly revisiting each of them to see if there's a new command I can adopt
or a hidden gem I've missed.
It turns out that these packages complement each other really well – I wouldn't describe
them as competing tools even if they do have some functionality overlap.
provides a host of one-off edit recipes (e.g. add a
require to the namespace) while
lispy provides a composable bottom-up approach to structural editing. Finding the time
to invest into using each of these to their fullest extent is hard and as such I've
focused the most on digesting and incorporating
lispy paired with a pretty small subset
of the available
clj-refactor refactorings, mostly project and namespace-related.
apAdd project dependency My absolute favorite refactoring. Hotload a dependency. Saves you having to visit
project.cljand, more importantly,
cider-jack-inagain after adding a dep to
project.clj. But there's more! You get to choose from all available projects and version numbers without leaving your editor to hunt them down. This is especially nice since I'm constantly forgetting the
groupidof the libraries I frequently use. I tend to follow this one up with an
amAdd missing libspec My second favorite. Require or import based on the symbol at point. If I'm going to refer, e.g. a function, into my namespace from a library that I haven't required yet I can just type the name of the function and then
C-c C-m amthe full libspec into my
nsform. With some of the more common libs this happens automatically when you type a commonly used namespace alias like
clojure.stringbut this has you covered for all other cases.
arAdd require to namespace definition I use this when I know I want to alias an entire namespace instead of
:refer-ing specific vars.
aiAdd import to namespace declaration The title pretty much sums this one up.
cnClean ns Cleans up your namespace. I love using this after I've been working with a namespace for a while to clean up unused deps and for the clean, easily digestable
rfRename file or dir I'm constantly moving namespaces around. Saves you having to update the
nsform manually and remembering to use underscores instead of dashes in the file name.
lispy there's similarly a lot to like. Some of my favorite bits are:
t: some of the
ace-commands. Navigating the point to an open paren like this is awesome. I love that both are one key away (which is the case for most of these, but still!).
ais especially great for deleting, copying symbols.
tfor teleporting expressions and regions is immensely useful.
W: recentering the view is great for ergonomics. I use vertical monitors and
vlet's me mindlessly pull what I'm editing into view instead of craning my neck.
Nfor narrowing has a similar use-case but with the added benefit of allowing you to focus on just that expression. This is a really nice way to focus up.
i: fix up whitespace and indentation with a single keystroke. Yes please.
clj-refactor also require very little configuration. I'll leave you
with my configs if you want to get started with either package and need a jumping off
point. Oh, and lastly, I'd like to express my gratitude to the authors of these
packages: thank you so much for what you do!
(add-hook 'cider-mode-hook #'clj-refactor-mode) (add-hook 'clojure-mode-hook #'lispy-mode) (use-package clj-refactor :ensure t :defer t :config (cljr-add-keybindings-with-prefix "C-c C-m")) (use-package lispy :ensure t :defer t :init (setq lispy-compat '(cider)))