[slime-devel] Re: Indenting macro bodies

Pascal J.Bourguignon pjb at informatimago.com
Wed Oct 6 23:08:28 UTC 2004


Peter Seibel writes:
> Helmut Eller <e9626484 at stud3.tuwien.ac.at> writes:
> 
> > SLIME does by default nothing special for macros starting with "with-"
> > of "def" because doing so messes up the indentation of defmethod in
> > some implementations.  You can change the default by setting
> > slime-conservative-indentation.
> 
> So that variable is set to t and lisp-indent-function's value is
> common-lisp-indent-function yet I'm still getting "special"
> indentation of lines following a "def" form. Which is particularly
> ignoring in cases like this (indented with indent-sexp):
> 
>   (defclass column ()
>     ((name               
>       :accessor name
>       :initarg :name)
>      (default-value-fn
>          :accessor default-value-fn ;;; <<---- note extra indentation
>        :initarg :default-value-fn)))
> 
> What am I doing wrong?

You're not using the right lisp-indent-function! The one coming with
emacs (and I guess the other one coming with slime) lack a
(looking-at ":") disjonction.


diff -c /tmp/b /tmp/a
*** /tmp/b	2004-10-07 01:06:07.000000000 +0200
--- /tmp/a	2004-10-07 01:05:46.000000000 +0200
***************
*** 3,9 ****
      (goto-char (1+ (elt state 1)))
      (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
      (if (and (elt state 2)
!              (or (looking-at ":") (not (looking-at "\\sw\\|\\s_"))))
        ;; car of form doesn't seem to be a symbol
        (progn
          (if (not (> (save-excursion (forward-line 1) (point))
--- 3,9 ----
      (goto-char (1+ (elt state 1)))
      (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
      (if (and (elt state 2)
!              (not (looking-at "\\sw\\|\\s_")))
        ;; car of form doesn't seem to be a symbol
        (progn
          (if (not (> (save-excursion (forward-line 1) (point))



;; extracted from ~pascal/.emacs:

(require 'lisp-mode)

(defun lisp-indent-function (indent-point state)
  (let ((normal-indent (current-column)))
    (goto-char (1+ (elt state 1)))
    (parse-partial-sexp (point) calculate-lisp-indent-last-sexp 0 t)
    (if (and (elt state 2)
             (or (looking-at ":") (not (looking-at "\\sw\\|\\s_"))))
      ;; car of form doesn't seem to be a symbol
      (progn
        (if (not (> (save-excursion (forward-line 1) (point))
                    calculate-lisp-indent-last-sexp))
          (progn (goto-char calculate-lisp-indent-last-sexp)
                 (beginning-of-line)
                 (parse-partial-sexp (point)
                                     calculate-lisp-indent-last-sexp 0 t)))
        ;; Indent under the list or under the first sexp on the same
        ;; line as calculate-lisp-indent-last-sexp.  Note that first
        ;; thing on that line has to be complete sexp since we are
        ;; inside the innermost containing sexp.
        (backward-prefix-chars)
        (current-column))
      (let ((function (buffer-substring (point)
                                        (progn (forward-sexp 1) (point))))
            method)
        (setq method (or (get (intern-soft function) 'lisp-indent-function)
                         (get (intern-soft function) 'lisp-indent-hook)))
        (cond ((or (eq method 'defun)
                   (and (null method)
                        (> (length function) 3)
                        (string-match "\\`def" function)))
               (lisp-indent-defform state indent-point))
              ((integerp method)
               (lisp-indent-specform method state
                                     indent-point normal-indent))
              (method
               (funcall method state indent-point)))))));;lisp-indent-function

-- 
__Pascal Bourguignon__                     http://www.informatimago.com/

Voting Democrat or Republican is like choosing a cabin in the Titanic.





More information about the slime-devel mailing list