;; 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
(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.