Index: swank.lisp
===================================================================
RCS file: /project/slime/cvsroot/slime/swank.lisp,v
retrieving revision 1.498
diff -u -r1.498 swank.lisp
--- swank.lisp	25 Aug 2007 04:56:50 -0000	1.498
+++ swank.lisp	25 Aug 2007 14:40:08 -0000
@@ -24,6 +24,7 @@
            #:run-after-init-hook
            #:inspect-for-emacs
            #:inspect-slot-for-emacs
+           #:emacs-indentation
            ;; These are user-configurable variables:
            #:*communication-style*
            #:*dont-close*
@@ -4608,19 +4609,26 @@
   "Return true if Emacs has special rules for indenting SYMBOL."
   (cl-symbol-p symbol))
 
+(defvar *emacs-indentation* (make-hash-table :test 'eq))
+
+(defun emacs-indentation (symbol)
+  (gethash symbol *emacs-indentation*))
+(defun (setf emacs-indentation) (spec symbol)
+  (setf (gethash symbol *emacs-indentation*) spec))
+
 (defun symbol-indentation (symbol)
   "Return a form describing the indentation of SYMBOL.
 The form is to be used as the `common-lisp-indent-function' property
 in Emacs."
-  (if (and (macro-function symbol)
-           (not (known-to-emacs-p symbol)))
-      (let ((arglist (arglist symbol)))
-        (etypecase arglist
-          ((member :not-available)
-           nil)
-          (list
-           (macro-indentation arglist))))
-      nil))
+  (or (gethash symbol *emacs-indentation*)
+      (when (and (macro-function symbol)
+                 (not (known-to-emacs-p symbol)))
+        (let ((arglist (arglist symbol)))
+          (etypecase arglist
+            ((member :not-available)
+             nil)
+            (list
+             (macro-indentation arglist)))))))
 
 (defun macro-indentation (arglist)
   (if (well-formed-list-p arglist)
Index: slime.el
===================================================================
RCS file: /project/slime/cvsroot/slime/slime.el,v
retrieving revision 1.814
diff -u -r1.814 slime.el
--- slime.el	25 Aug 2007 07:31:44 -0000	1.814
+++ slime.el	25 Aug 2007 14:40:50 -0000
@@ -9208,7 +9208,7 @@
       (unless (and slime-conservative-indentation
                    (string-match "^\\(def\\|\\with-\\)" symbol-name))
         (let ((symbol (intern symbol-name))
-              (indent (cdr info)))
+              (indent (slime-clean-indent-spec (cdr info))))
           (let ((old-slime-indent (get symbol 'slime-indent)))
             (flet ((update (indent-function)
                            ;; Does the symbol have an indentation value
@@ -9221,6 +9221,16 @@
               (when (member 'scheme-mode slime-lisp-modes)
                 (update 'scheme-indent-function)))))))))
 
+(defun slime-clean-indent-spec (thing)
+  (typecase thing
+    (symbol (let* ((name (symbol-name thing))
+                   (colon-idx (position ?: name :from-end t)))
+              (if colon-idx
+                  (intern (substring name (1+ colon-idx)))
+                thing)))
+    (cons   (mapcar 'slime-clean-indent-spec thing))
+    (t      thing)))
+
 (defun slime-reindent-defun (&optional force-text-fill)
   "Reindent the current defun, or refill the current paragraph.
 If point is inside a comment block, the text around point will be
