From fcbac48de570ff17a17cb3582e5f3eb65f363e1d Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Fri, 10 Jul 2020 20:42:13 +0100 Subject: [PATCH] el/dot-emacs.el: Indent `setf' and related forms properly. In both Emacs and Common Lisp. --- el/dot-emacs.el | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/el/dot-emacs.el b/el/dot-emacs.el index 5ccce36..56cfe06 100644 --- a/el/dot-emacs.el +++ b/el/dot-emacs.el @@ -4307,6 +4307,7 @@ that character only to be normal punctuation.") ;; Special indentation. (defvar mdw-lisp-loop-default-indent 2) +(defvar mdw-lisp-setf-value-indent 2) (setq lisp-simple-loop-indentation 0 lisp-loop-keyword-indentation 0 @@ -4333,6 +4334,47 @@ to `foo'." (put 'funcall 'common-lisp-indent-function 'mdw-indent-funcall) (put 'funcall 'lisp-indent-function 'mdw-indent-funcall)) +(defun mdw-indent-setf + (path state &optional indent-point sexp-column normal-indent) + "Indent `setf' more usefully. +If the values aren't on the same lines as their variables then indent them +by `mdw-lisp-setf-value-indent' spaces." + (and (or (not (consp path)) (null (cadr path))) + (let ((basic-indent (save-excursion + (goto-char (cadr state)) + (forward-char 1) + (and (condition-case nil + (progn (forward-sexp 2) t) + (scan-error nil)) + (progn + (forward-sexp -1) + (current-column))))) + (offset (if (consp path) (car path) + (catch 'done + (save-excursion + (let ((start path) + (count 0)) + (goto-char (cadr state)) + (forward-char 1) + (while (< (point) start) + (condition-case nil (forward-sexp 1) + (scan-error (throw 'done nil))) + (incf count)) + (1- count))))))) + (and basic-indent offset + (list (+ basic-indent + (if (oddp offset) 0 + mdw-lisp-setf-value-indent)) + basic-indent))))) +(progn + (put 'setf 'common-lisp-indent-functopion 'mdw-indent-setf) + (put 'psetf 'common-lisp-indent-function 'mdw-indent-setf) + (put 'setq 'common-lisp-indent-function 'mdw-indent-setf) + (put 'setf 'lisp-indent-function 'mdw-indent-setf) + (put 'setq 'lisp-indent-function 'mdw-indent-setf) + (put 'setq-local 'lisp-indent-function 'mdw-indent-setf) + (put 'setq-default 'lisp-indent-function 'mdw-indent-setf)) + (defadvice common-lisp-loop-part-indentation (around mdw-fix-loop-indentation (indent-point state) activate compile) "Improve `loop' indentation. -- 2.11.0