(backward-sexp)
(delete-char 1)))
+(defun lisp-duplicate-sexp (n)
+ "Duplicate sexp immediately after or before point in a new line N times."
+ (interactive "p")
+ (let ((exp (thing-at-point 'sexp)))
+ (dotimes (_ n)
+ (save-excursion
+ (cond
+ ((equal (char-after) ?\() (insert exp "\n"))
+ ((equal (char-before) ?\)) (insert "\n" exp))
+ (t (user-error "No list at point")))
+ (when (nth 9 (syntax-ppss)) (lisp-tidy-sexp))))))
+
(defvar-keymap lisp-mode-shared-map
:doc "Keymap for commands shared by all sorts of Lisp modes."
:parent prog-mode-map
"M-r" #'raise-sexp
"M-S" #'lisp-split-sexp
"M-J" #'lisp-join-sexps
+ "M-D" #'lisp-duplicate-sexp
"M-<up>" #'lisp-splice-following
"?" #'lisp-character
"C-)" #'lisp-slurp-forward