On Sun, Sep 25, 2011 at 7:42 AM, Paulo Madeira acelent@gmail.com wrote:
2011/09/23 Alistair Gee:
I am using the latest version of slime from cvs. I noticed that macros
such
as iter (from the iterate package) indents differently now than
sometime in
the past.
Current indentation:
(iter (for i below 3) (collect i))
Old indentation:
(iter (for i below 3) (collect i)) ; "collect" is lined up with "for"
An example with a macro from the clsql package:
Current indentation:
(clsql:with-default-database (db) (progn))
Old indentation:
(clsql:with-default-database (db) (progn)) ; &body is indented 2 spaces
How do I configure slime to indent with the older styles? My .emacs has: (slime-setup '(slime-fancy slime-asdf slime-sprof slime-compiler-notes-tree slime-hyperdoc slime-mdot-fu slime-mrepl slime-indentation slime-repl))
The old behaviour depended solely on the Emacs side of things.
The `iter' form didn't actually indent the `collect' form with the `for' form on purpose, it indented just like it would any other function call.
The `with-default-database' form has a first element whose name starts with "with-", a very common prefix for macros with a body, so it was assumed and indented as such.
When connected to lisp, the new indentation mechanism can detects `&body' arguments.
If you add a newline right before the `for' form, you'll see it's indented at 2, because `iter' has a single `&body' arguments.
The `with-default-database' has a `&rest' argument, so it's not indented like a body.
The best solution would be to update clsql to declare the macro argument as `&body'. One workaround is to add something like this to your Emacs init.el (note: I didn't actually test this):
(put 'with-default-database 'common-lisp-indent-function 1)
Paulo Madeira
Thanks for the help. Your workaround for with-default-database works. I am also now using the following workaround for iter:
(put 'iter 'common-lisp-indent-function '(&lambda))