This patch lets SLIME support Eldoc (i.e. flashing argument lists in the minibuffer). Inspired by semantic/cedet, which does this for many languages.
/s
--- slime.el.~1.61.~ Wed Oct 29 17:18:24 2003 +++ slime.el Sat Nov 1 18:06:03 2003 @@ -1771,20 +1771,40 @@ (slime-function-called-at-point/line)) (slime-arglist (symbol-name (slime-function-called-at-point/line)))))
-(defun slime-arglist (symbol-name) +(defvar slime-arglist-cache (make-hash-table :test 'equal) + "Cache for Slime arglist info (useful with Eldoc).") + +(defun slime-arglist (symbol-name &optional show) "Show the argument list for the nearest function call, if any." (interactive (list (slime-read-symbol "Arglist of: "))) - (slime-eval-async - `(swank:arglist-string ,symbol-name) - (slime-buffer-package) - (lexical-let ((symbol-name symbol-name)) - (lambda (arglist) - (message "%s" (slime-format-arglist symbol-name arglist)))))) + (unless show + (setq show #'message)) + (let ((val (gethash symbol-name slime-arglist-cache))) + (if val + (funcall show "%s" val) + (slime-eval-async + `(swank:arglist-string ,symbol-name) + (slime-buffer-package) + (lexical-let ((symbol-name symbol-name)) + (lambda (arglist) + (funcall show "%s" + (setf (gethash symbol-name slime-arglist-cache) + (slime-format-arglist symbol-name arglist)))))))))
(defun slime-get-arglist (symbol-name) "Return the argument list for SYMBOL-NAME." - (slime-format-arglist symbol-name - (slime-eval `(swank:arglist-string ,symbol-name)))) + (or (gethash symbol-name slime-arglist-cache) + (setf (gethash symbol-name slime-arglist-cache) + (slime-format-arglist symbol-name + (slime-eval `(swank:arglist-string ,symbol-name)))))) + +(defadvice eldoc-print-current-symbol-info (around slime activate) + "Enable Eldoc argument list feedback with SLIME/SWANK." + (if (eq major-mode 'lisp-mode) + (let ((sym (slime-function-called-at-point/line))) + (when sym + (slime-arglist (symbol-name sym) #'eldoc-message))) + ad-do-it))
(defun slime-format-arglist (symbol-name arglist) (format "(%s %s)" symbol-name (substring arglist 1 -1)))