I was watching another of Tim Visher’s VimGolf videos in which he builds a multiplication table by the clever use of keyboard macros. What got my attention, however, was his use of the function eval-and-replace
that evaluates the sexp preceding the point and replaces it with its value. This seemed like a useful thing to be able to do but as Visher explained, eval-and-replace
is part of the Emacs Starter Kit and not part of Emacs itself.
I have a fairly large init.el
that I’ve developed over time and therefore never installed the starter kit even though I’ve heard good things about it. Rather than hunt up the starter kit to get the function, I just rolled my own:
(defun eval-and-replace (value) "Evaluate the sexp at point and replace it with its value" (interactive (list (eval-last-sexp nil))) (kill-sexp -1) (insert (format "%S" value)))
The eval-last-sexp
in the interactive
declaration evaluates the sexp and passes its value to eval-and-replace
. Then the (kill-sexp -1)
deletes the sexp from the buffer. Finally the value is inserted into the buffer with the insert
function.
I originally wrote the function using a let
to capture the value of the sexp instead of using the interactive
declaration but this seemed a bit shorter and I wanted to use an expression in the interactive
declaration, as I wrote about here, to fix the idea in my mind.
I can see all sorts of uses for eval-and-replace
. As a trivial example, suppose I want to say 223=8388608 but I don’t remember the value of 223. I could switch over to my calculator buffer to make the calculation and then cut and paste it to my text or I can just write
2^23=(expt 2 23)
and call eval-and-replace
to put the value in the text for me.
I’ve added eval-and-replace
to my init.el
so that I’ll have it available the next time I have a need for it.