chiark / gitweb /
el/dot-emacs.el: Indent `setf' and related forms properly.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 10 Jul 2020 19:42:13 +0000 (20:42 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 9 Aug 2020 03:34:42 +0000 (04:34 +0100)
In both Emacs and Common Lisp.

el/dot-emacs.el

index 5ccce36b4d8d5910cce034bbd60f59441ab863a1..56cfe06ba4cddcfeb95a03c0f41ce22d1a8848d8 100644 (file)
@@ -4307,6 +4307,7 @@ (defun mdw-fontify-lispy ()
 ;; 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 @@ (progn
   (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.