(or emacs irrelevant)

lispy 0.24.0 is out

The last release was a month ago, and there have been 70 commits to master since then. If you're not familiar with lispy, see my intro post for version 0.21.0. I'll just copy the release notes here, while adding a few things.


  • DEL behaves properly after a string and one space.
  • C-k works better for expressions preceded with "#".
  • 3 should not add a space when there is one already.
  • # will not add a space after a comma.
  • C-j works better in comments after a quote.
  • lispy--eval-elisp-form first arg is now named lispy-form instead of form. It was impossible to evaluate an unrelated form variable with the previous behavior.
  • F again works properly when jumping to a jar (e.g. to defn) from Clojure source.
  • C-k won't call delete-region in some obscure branches.


  • P (lispy-paste) will add a newline when called from start of line. This way, nP becomes equivalent to c (lispy-clone). Of course, it's more flexible: you can do e.g. nkP.
  • xb (lispy-bind-variable) now works on regions as well. Use it to bind the current sexp or region as a let-bound variable: it will put you in iedit. When you're done with iedit, press M-m (lispy-mark-symbol) to exit iedit. If you need to move the let binding around, use a combination of C (lispy-convolute) and h (lispy-left).
  • g will ignore loaddefs.el for Elisp.
  • M-m works better in unbalanced buffers, which should be an rare thing.
  • add defhydra to lispy-tag-arity: now g will recognize defhydra statements.
  • The tag logic was improved to do less parsing.
  • lispy-outline was updated to match the standard ^;;; outline regex. Try pressing I in e.g. org.el, it's quite beautiful.
  • All lispy-eval functions will preserve the match data.
  • > will delete the extra whitespace while slurping.
  • Added undercover/Coveralls test coverage report.
  • H (lispy-ace-symbol-replace) is now a Hydra: type h to delete more, type u to undo.
  • Q (lispy-ace-char) now uses avy to jump. This change allows to cover this function with a test.

New features

p can now iterate dolist variables in Elisp.

(defun range (a b)
  (message "called range")
  (number-sequence a b))
(dolist |(i (range 1 3))
  (message "i=%d" i))

Pressing p with point where | is, will

  • call range and set i to 1
  • set i to 2
  • set i to 3
  • set i to nil
  • call range and set i to 1

This is another step toward edebug-less debugging, adding to special behavior for let, cond and labels. Remember that you can drop out of edebug with Z (lispy-edebug-stop). This function will take the current function arguments that edebug provides, store them in top-level, and exit edebug. This is really cool for setting up entry conditions for a function that you want to debug, or even a function with an empty body that you want to write. Why am I so eager to exit edebug? Because it puts the code in read-only mode, which is quite restrictive.

Incompatible changes

  • lispy-helm-columns is now a list '(60 80). The first number is the width of the tag name column, the second number is the width of both tag name and tag file. The tag name column is left-aligned, while the file column is right-aligned.
  • j and k should now move to outline when at beginning of comment. The previous behavior was to look for the first sexp in the direction. You can still do that with f.
  • I (lispy-shiftab) is now a two-way cycle, instead of three-way, like org-mode. The contents can be obtained with C-u I or C-u C-TAB.


It seems that lispy is winding down feature-wise, which is a good thing, because I'm almost out of keys - there's only Y and U left.

Possible next steps would be to improve the test coverage (currently 48%) and the documentation. Perhaps I'll try to implement some automation for generating the function reference, or learn some texinfo and write an actual manual, see how ox-texinfo holds up.

I hope that you'll grow to enjoy lispy as much as I do. Happy hacking!