Author: hhubner
Date: 2007-12-02 13:46:42 -0500 (Sun, 02 Dec 2007)
New Revision: 2295
Modified:
branches/trunk-reorg/thirdparty/slime/CVS/Entries
branches/trunk-reorg/thirdparty/slime/ChangeLog
branches/trunk-reorg/thirdparty/slime/NEWS
branches/trunk-reorg/thirdparty/slime/contrib/CVS/Entries
branches/trunk-reorg/thirdparty/slime/contrib/ChangeLog
branches/trunk-reorg/thirdparty/slime/contrib/slime-fuzzy.el
branches/trunk-reorg/thirdparty/slime/contrib/swank-arglists.lisp
branches/trunk-reorg/thirdparty/slime/contrib/swank-fancy-inspector.lisp
branches/trunk-reorg/thirdparty/slime/doc/CVS/Entries
branches/trunk-reorg/thirdparty/slime/doc/slime.texi
branches/trunk-reorg/thirdparty/slime/slime.el
branches/trunk-reorg/thirdparty/slime/swank-cmucl.lisp
branches/trunk-reorg/thirdparty/slime/swank-lispworks.lisp
branches/trunk-reorg/thirdparty/slime/swank-loader.lisp
branches/trunk-reorg/thirdparty/slime/swank.lisp
Log:
update slime from cvs
Modified: branches/trunk-reorg/thirdparty/slime/CVS/Entries
===================================================================
--- branches/trunk-reorg/thirdparty/slime/CVS/Entries 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/CVS/Entries 2007-12-02 18:46:42 UTC (rev 2295)
@@ -1,9 +1,5 @@
-D/contrib////
-D/doc////
/.cvsignore/1.5/Thu Oct 11 14:10:25 2007//
-/ChangeLog/1.1241/Wed Nov 14 21:30:35 2007//
/HACKING/1.8/Thu Oct 11 14:10:25 2007//
-/NEWS/1.8/Thu Oct 11 14:10:25 2007//
/PROBLEMS/1.8/Thu Oct 11 14:10:25 2007//
/README/1.14/Thu Oct 11 14:10:25 2007//
/hyperspec.el/1.11/Thu Oct 11 14:10:25 2007//
@@ -12,24 +8,28 @@
/nregex.lisp/1.4/Thu Oct 11 14:10:25 2007//
/sbcl-pprint-patch.lisp/1.1/Thu Oct 11 14:10:25 2007//
/slime-autoloads.el/1.3/Thu Oct 11 14:10:25 2007//
-/slime.el/1.877/Wed Nov 14 21:30:35 2007//
/swank-abcl.lisp/1.44/Wed Nov 14 21:30:35 2007//
/swank-allegro.lisp/1.98/Thu Oct 11 14:10:25 2007//
/swank-backend.lisp/1.126/Thu Oct 11 14:10:25 2007//
/swank-clisp.lisp/1.64/Thu Oct 11 14:10:25 2007//
-/swank-cmucl.lisp/1.174/Thu Oct 11 14:10:25 2007//
/swank-corman.lisp/1.11/Thu Oct 11 14:10:25 2007//
/swank-ecl.lisp/1.8/Thu Oct 11 14:10:25 2007//
/swank-gray.lisp/1.10/Thu Oct 11 14:10:25 2007//
-/swank-lispworks.lisp/1.92/Thu Oct 11 14:10:25 2007//
-/swank-loader.lisp/1.74/Wed Nov 14 21:30:35 2007//
/swank-openmcl.lisp/1.120/Wed Nov 14 21:30:35 2007//
/swank-sbcl.lisp/1.185/Thu Oct 11 14:10:25 2007//
/swank-scl.lisp/1.13/Thu Oct 11 14:10:25 2007//
/swank-source-file-cache.lisp/1.8/Thu Oct 11 14:10:25 2007//
/swank-source-path-parser.lisp/1.17/Thu Oct 11 14:10:25 2007//
/swank.asd/1.5/Thu Oct 11 14:10:25 2007//
-/swank.lisp/1.513/Wed Nov 14 21:30:35 2007//
/test-all.sh/1.2/Thu Oct 11 14:10:25 2007//
/test.sh/1.9/Thu Oct 11 14:10:25 2007//
/xref.lisp/1.2/Thu Oct 11 14:10:25 2007//
+D/contrib////
+D/doc////
+/ChangeLog/1.1254/Sun Dec 2 04:22:09 2007//
+/NEWS/1.9/Sun Dec 2 04:22:09 2007//
+/slime.el/1.882/Sun Dec 2 04:22:09 2007//
+/swank-cmucl.lisp/1.175/Sun Dec 2 04:22:09 2007//
+/swank-lispworks.lisp/1.93/Sun Dec 2 04:22:09 2007//
+/swank-loader.lisp/1.75/Sun Dec 2 04:22:09 2007//
+/swank.lisp/1.521/Sun Dec 2 04:22:09 2007//
Modified: branches/trunk-reorg/thirdparty/slime/ChangeLog
===================================================================
--- branches/trunk-reorg/thirdparty/slime/ChangeLog 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/ChangeLog 2007-12-02 18:46:42 UTC (rev 2295)
@@ -1,3 +1,118 @@
+2007-12-02 Alan Caulkins <fatman(a)maxint.net>
+
+ Make it possible to close listening sockets.
+
+ * swank.lisp (stop-server, restart-server): New functions.
+ (*listener-sockets*): New variable.
+ (setup-server): Store open sockets in *listener-sockets*.
+
+2007-12-02 Helmut Eller <heller(a)common-lisp.net>
+
+ Add hook to customize the region used by C-c C-c.
+ Useful to recognize block declarations in CMUCL sources.
+
+ * slime.el (slime-region-for-defun-function): New variable.
+ (slime-region-for-defun-at-point): Use it.
+
+2007-11-30 Helmut Eller <heller(a)common-lisp.net>
+
+ Handle byte-functions without debug-info.
+
+ * swank-cmucl.lisp (byte-function-location): Return an error
+ if the component has no debug-info.
+
+2007-11-30 Helmut Eller <heller(a)common-lisp.net>
+
+ Disable the pretty-printer for backtraces.
+ Would be nice if we could print newlines in strings as \n.
+
+ * swank.lisp (*backtrace-printer-bindings*): New varaible.
+ (backtrace, frame-locals-for-emacs): Use it.
+
+2007-11-29 Tobias C. Rittweiler <tcr(a)freebits.de>
+
+ * swank.lisp (valid-function-name-p): Fixed wrt. setf functions.
+
+2007-11-29 Helmut Eller <heller(a)common-lisp.net>
+
+ Prettify package names for slime-repl-set-package.
+
+ * slime.el (slime-repl-set-package): slime-current-package may
+ have leading colons. Use slime-pretty-package-name to remove
+ them. Reported by Constantine Vetoshev.
+ (slime-pretty-current-package): New function.
+ (slime-set-package): Use it.
+
+2007-11-24 Helmut Eller <heller(a)common-lisp.net>
+
+ Drop remaining dependencies on nregex.
+
+ * swank-lispworks.lisp (unmangle-unfun): Use sys::setf-symbol-p
+ instead of regexp matching.
+
+ * swank-loader.lisp (*sysdep-files*): Don't include nregex.
+
+2007-11-24 Helmut Eller <heller(a)common-lisp.net>
+
+ Mirror *modules* in Emacs.
+
+ * slime.el (slime-lisp-modules): New connction variable.
+ (slime-set-connection-info): Load requested modules.
+ (slime-required-modules): New variable.
+ (slime-require, slime-load-contribs): New functions.
+
+ * swank.lisp (connection-info): Include *modules*.
+ (swank-require): Accept a list of modules as argument.
+
+2007-11-24 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (parse-package): The old version didn't pass the
+ test-suite. Now use the reader directly instead of emulating it
+ half-heartedly.
+
+ * slime.el (slime-search-buffer-package): Don't remove double
+ quotes or "#:", swank:parse-package takes care of that.
+
+2007-11-24 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (apropos-symbols): Use simple search instead of
+ regexps.
+ (make-apropos-matcher): Used to be make-regexp-matcher.
+
+ (*sldb-printer-bindings*): Set *print-right-margin* to
+ most-positive-fixnum. This prints each frame in the backtrace in a
+ single long line. But is suboptimal for other purposes, like
+ eval-in-frame.
+
+ (setup-server): Initialize multiprocessing here, so that is also
+ done for create-server.
+
+2007-11-23 Tobias C. Rittweiler <tcr(a)freebits.de>
+
+ * swank.lisp (swank-require): Fix typo (:key was used instead of
+ :test.) Reported by Stelian Ionescu.
+
+2007-11-22 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank.lisp (swank-require): Don't search the file if the
+ module-name is present in *modules*. That should avoid problems if
+ swank is included in a core file and moved to a different
+ location. Reported by John Wiegley.
+
+2007-11-19 Tobias C. Rittweiler <tcr(a)freebits.de>
+
+ * slime.el (slime-repl-mode-map, slime-repl-read-mode),
+ (slime-compiler-notes-mode-map, slime-xref-mode-map),
+ (sldb-mode-map, slime-connection-list-mode-map),
+ (slime-inspector-mode-map): Added bindings for [return] in
+ addition to (kbd "RET"). The reason is that pressing enter in X is
+ translated to (kbd "RET") only if no binding for [return] is
+ active; if [return] is bound to something, pressing enter is
+ translated to this key binding henceforth, as was explained to me
+ by Pierre Gaston, thanks! This can cause quite confusing behaviour
+ as Andreas Davour faced in his post <cs9k5ofqbt7.fsf(a)Psilocybe.Update.UU.SE>
+ to comp.lang.lisp.
+
2007-11-06 Helmut Eller <heller(a)common-lisp.net>
* slime.el (slime-events-buffer, slime-inspector-buffer): Disable
Modified: branches/trunk-reorg/thirdparty/slime/NEWS
===================================================================
--- branches/trunk-reorg/thirdparty/slime/NEWS 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/NEWS 2007-12-02 18:46:42 UTC (rev 2295)
@@ -1,5 +1,54 @@
-* SLIME News -*- outline -*-
+* SLIME News -*- outline -*-
+* 3.0 (not released yet)
+
+** Removed Features
+Some of the more esoteric features, like presentations or fuzzy
+completion, are no longer enabled by default. A new directory
+"contrib/" contains the code for these packages. To use them, you
+must make some changes to your ~/.emacs. For details see, section
+"Contributed Packages" in the manual.
+
+** Stepper
+Juho Snellman implemented stepping commands for SBCL.
+
+** Completions
+SLIME can now complete keywords and character names (like #\newline).
+
+* 2.0 (April 2006)
+
+** In-place macro expansion
+Marco Baringer wrote a new minor mode to incrementally expand macros.
+
+** Improved arglist display
+SLIME now recognizes `make-instance' calls and displays the correct
+arglist if the classname is present. Similarly, for `defmethod' forms
+SLIME displays the arguments of the generic function.
+
+** Persistent REPL history
+SLIME now saves the command history from REPL buffers in a file and
+reloads it for newly created REPL buffers.
+
+** Scieneer Common Lisp
+Douglas Crosher added support for Scieneer Common Lisp.
+
+** SBCL
+Various improvements to make SLIME work well with current SBCL versions.
+
+** Corman Common Lisp
+Espen Wiborg added support for Corman Common Lisp.
+
+** Presentations
+A new feature which associates objects in Lisp with their textual
+represetation in Emacs. The text is clickable and operations on the
+associated object can be invoked from a pop-up menu.
+
+** Security
+SLIME has now a simple authentication mechanism: if the file
+~/.slime-secret exists we verify that Emacs and Lisp can access it.
+Since both parties have access to the same file system, we assume that
+we can trust each other.
+
* 1.2 (March 2005)
** New inspector
Modified: branches/trunk-reorg/thirdparty/slime/contrib/CVS/Entries
===================================================================
--- branches/trunk-reorg/thirdparty/slime/contrib/CVS/Entries 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/contrib/CVS/Entries 2007-12-02 18:46:42 UTC (rev 2295)
@@ -1,4 +1,3 @@
-/ChangeLog/1.64/Wed Nov 14 21:30:35 2007//
/README/1.3/Thu Oct 11 14:10:25 2007//
/bridge.el/1.1/Thu Oct 11 14:10:25 2007//
/inferior-slime.el/1.2/Thu Oct 11 14:10:25 2007//
@@ -9,7 +8,6 @@
/slime-editing-commands.el/1.5/Thu Oct 11 14:10:25 2007//
/slime-fancy-inspector.el/1.2/Thu Oct 11 14:10:25 2007//
/slime-fancy.el/1.4/Thu Oct 11 14:10:25 2007//
-/slime-fuzzy.el/1.4/Thu Oct 11 14:10:25 2007//
/slime-highlight-edits.el/1.3/Thu Oct 11 14:10:25 2007//
/slime-parse.el/1.7/Thu Oct 11 14:10:25 2007//
/slime-presentation-streams.el/1.2/Thu Oct 11 14:10:25 2007//
@@ -19,12 +17,14 @@
/slime-tramp.el/1.2/Thu Oct 11 14:10:25 2007//
/slime-typeout-frame.el/1.5/Thu Oct 11 14:10:25 2007//
/slime-xref-browser.el/1.1/Thu Oct 11 14:10:25 2007//
-/swank-arglists.lisp/1.12/Wed Nov 14 21:30:35 2007//
/swank-asdf.lisp/1.1/Thu Oct 11 14:10:25 2007//
/swank-c-p-c.lisp/1.2/Thu Oct 11 14:10:25 2007//
-/swank-fancy-inspector.lisp/1.4/Thu Oct 11 14:10:25 2007//
/swank-fuzzy.lisp/1.6/Thu Oct 11 14:10:25 2007//
/swank-listener-hooks.lisp/1.1/Thu Oct 11 14:10:25 2007//
/swank-presentation-streams.lisp/1.4/Thu Oct 11 14:10:25 2007//
/swank-presentations.lisp/1.4/Thu Oct 11 14:10:25 2007//
+/swank-fancy-inspector.lisp/1.5/Wed Nov 21 20:47:43 2007//
+/ChangeLog/1.68/Sun Dec 2 04:22:09 2007//
+/slime-fuzzy.el/1.5/Sun Dec 2 04:22:09 2007//
+/swank-arglists.lisp/1.15/Sun Dec 2 04:22:10 2007//
D
Modified: branches/trunk-reorg/thirdparty/slime/contrib/ChangeLog
===================================================================
--- branches/trunk-reorg/thirdparty/slime/contrib/ChangeLog 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/contrib/ChangeLog 2007-12-02 18:46:42 UTC (rev 2295)
@@ -1,3 +1,25 @@
+2007-11-27 Tobias C. Rittweiler <tcr(a)freebits.de>
+
+ * swank-arglists.lisp (arglist-dispatch 'defmethod): Use
+ VALID-FUNCTION-NAME-P. Fixes error on certain `(defmethod (setf ...))'
+ forms.
+
+2007-11-27 Tobias C. Rittweiler <tcr(a)freebits.de>
+
+ * swank-arglists.lisp (print-arglist): Print initforms in &optional and
+ &key lambda list specifiers as if by PRIN1 instead of PRINC.
+ Reported by Michael Weber.
+
+2007-11-24 Helmut Eller <heller(a)common-lisp.net>
+
+ * slime-fuzzy.el: Use slime-require instead of a connected-hook.
+
+2007-11-20 Helmut Eller <heller(a)common-lisp.net>
+
+ * swank-fancy-inspector.lisp (inspect-for-emacs function t): Don't
+ specialize the second argument, so that backend methods take
+ precedence. Reported by Maciej Katafiasz.
+
2007-10-24 Tobias C. Rittweiler <tcr(a)freebits.de>
* swank-arglist.lisp (decode-arglist): Fix incompatibility with
Modified: branches/trunk-reorg/thirdparty/slime/contrib/slime-fuzzy.el
===================================================================
--- branches/trunk-reorg/thirdparty/slime/contrib/slime-fuzzy.el 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/contrib/slime-fuzzy.el 2007-12-02 18:46:42 UTC (rev 2295)
@@ -585,14 +585,12 @@
;;; Initialization
(defun slime-fuzzy-init ()
- (add-hook 'slime-connected-hook 'slime-fuzzy-on-connect)
(slime-fuzzy-bind-keys))
(defun slime-fuzzy-bind-keys ()
(define-key slime-mode-map "\C-c\M-i" 'slime-fuzzy-complete-symbol)
(define-key slime-repl-mode-map "\C-c\M-i" 'slime-fuzzy-complete-symbol))
-(defun slime-fuzzy-on-connect ()
- (slime-eval-async '(swank:swank-require :swank-fuzzy)))
+(slime-require :swank-fuzzy)
(provide 'slime-fuzzy)
Modified: branches/trunk-reorg/thirdparty/slime/contrib/swank-arglists.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/slime/contrib/swank-arglists.lisp 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/contrib/swank-arglists.lisp 2007-12-02 18:46:42 UTC (rev 2295)
@@ -283,6 +283,7 @@
;;; (DECLARE (OPTIMIZE &ANY (compilation-speed 1) (safety 1) ...))
;;;
+;; FIXME: This really ought to be rewritten.
(defun print-arglist (arglist &key operator highlight)
(let ((index 0)
(need-space nil))
@@ -290,26 +291,29 @@
(typecase arg
(arglist ; destructuring pattern
(print-arglist arg))
- (optional-arg
- (princ (encode-optional-arg arg)))
+ (optional-arg
+ (let ((enc-arg (encode-optional-arg arg)))
+ (if (symbolp enc-arg)
+ (princ enc-arg)
+ (destructuring-bind (var &optional (initform nil initform-p)) enc-arg
+ (pprint-logical-block (nil nil :prefix "(" :suffix ")")
+ (format t "~A~:[~; ~S~]" var initform-p initform))))))
(keyword-arg
(let ((enc-arg (encode-keyword-arg arg)))
(etypecase enc-arg
(symbol (princ enc-arg))
- ((cons symbol)
- (pprint-logical-block (nil nil :prefix "(" :suffix ")")
- (princ (car enc-arg))
- (write-char #\space)
- (pprint-fill *standard-output* (cdr enc-arg) nil)))
+ ((cons symbol)
+ (destructuring-bind (keyarg initform) enc-arg
+ (pprint-logical-block (nil nil :prefix "(" :suffix ")")
+ (format t "~A ~S" keyarg initform))))
((cons cons)
- (pprint-logical-block (nil nil :prefix "(" :suffix ")")
- (pprint-logical-block (nil nil :prefix "(" :suffix ")")
- (prin1 (caar enc-arg))
- (write-char #\space)
- (print-arg (keyword-arg.arg-name arg)))
- (unless (null (cdr enc-arg))
- (write-char #\space))
- (pprint-fill *standard-output* (cdr enc-arg) nil))))))
+ (destructuring-bind ((keyword-name var) &optional (initform nil initform-p))
+ enc-arg
+ (pprint-logical-block (nil nil :prefix "(" :suffix ")")
+ (pprint-logical-block (nil nil :prefix "(" :suffix ")")
+ (format t "~S ~A" keyword-name var))
+ (when initform-p
+ (format t " ~S" initform))))))))
(t ; required formal or provided actual arg
(if (keywordp arg)
(prin1 arg) ; for &ANY args.
@@ -1002,7 +1006,6 @@
(split-form-spec form-spec)
(arglist-dispatch type operator arguments :remove-args remove-args))))
-
(defmacro with-availability ((var) form &body body)
`(let ((,var ,form))
(if (eql ,var :not-available)
@@ -1039,9 +1042,7 @@
(not (null arguments)) ;have generic function name
(notany #'listp (rest arguments))) ;don't have arglist yet
(let* ((gf-name (first arguments))
- (gf (and (or (symbolp gf-name)
- (and (listp gf-name)
- (eql (first gf-name) 'setf)))
+ (gf (and (valid-function-name-p gf-name)
(fboundp gf-name)
(fdefinition gf-name))))
(when (typep gf 'generic-function)
Modified: branches/trunk-reorg/thirdparty/slime/contrib/swank-fancy-inspector.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/slime/contrib/swank-fancy-inspector.lisp 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/contrib/swank-fancy-inspector.lisp 2007-12-02 18:46:42 UTC (rev 2295)
@@ -94,7 +94,7 @@
(t
(list label ": " '(:newline) " " docstring '(:newline))))))
-(defmethod inspect-for-emacs ((f function) (inspector fancy-inspector))
+(defmethod inspect-for-emacs ((f function) inspector)
(declare (ignore inspector))
(values "A function."
(append
Modified: branches/trunk-reorg/thirdparty/slime/doc/CVS/Entries
===================================================================
--- branches/trunk-reorg/thirdparty/slime/doc/CVS/Entries 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/doc/CVS/Entries 2007-12-02 18:46:42 UTC (rev 2295)
@@ -4,6 +4,6 @@
/slime-refcard.tex/1.1/Thu Oct 11 14:10:24 2007//
/slime-small.eps/1.1/Thu Oct 11 14:10:24 2007//
/slime-small.pdf/1.1/Thu Oct 11 14:10:24 2007//
-/slime.texi/1.57/Thu Oct 11 14:10:24 2007//
/texinfo-tabulate.awk/1.2/Thu Oct 11 14:10:24 2007//
+/slime.texi/1.61/Sun Dec 2 04:22:10 2007//
D
Modified: branches/trunk-reorg/thirdparty/slime/doc/slime.texi
===================================================================
--- branches/trunk-reorg/thirdparty/slime/doc/slime.texi 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/doc/slime.texi 2007-12-02 18:46:42 UTC (rev 2295)
@@ -1,5 +1,5 @@
\input texinfo
--@c %**start of header
+@c %**start of header
@setfilename slime.info
@settitle The Superior Lisp Interaction Mode for Emacs
@@ -7,12 +7,12 @@
@direntry
* SLIME: (slime). Superior Lisp Interaction Mode for Emacs.
@end direntry
--@c %**end of header
+@c %**end of header
@set EDITION 3.0-alpha
@set SLIMEVER 3.0-alpha
@c @set UPDATED @today{}
-@set UPDATED @code{$Date: 2007/09/17 13:44:48 $}
+@set UPDATED @code{$Date: 2007/11/27 13:16:52 $}
@set TITLE SLIME User Manual
@settitle @value{TITLE}, version @value{EDITION}
@@ -37,6 +37,7 @@
@end titlepage
+@c Macros
@macro SLIME
@acronym{SLIME}
@@ -90,6 +91,10 @@
@xref{\name\}.
@end macro
+@c Merge the variable and concept indices because both are rather short
+@synindex cp vr
+
+
@c @setchapternewpage off
@c @shortcontents
@contents
@@ -110,14 +115,142 @@
* slime-mode::
* REPL::
* Debugger::
-* Extras::
+* Misc::
* Customization::
* Tips and Tricks::
+* Contributed Packages::
* Credits::
-@c * Index to Functions::
-* Key Index::
-* Command Index::
-* Variable Index::
+* Key Index::
+* Command Index::
+* Variable Index::
+
+@detailmenu
+ --- The Detailed Node Listing ---
+
+Getting started
+
+* Platforms::
+* Downloading::
+* Installation::
+* Running::
+* Setup Tuning::
+
+Downloading SLIME
+
+* CVS::
+* CVS Incantations::
+
+Downloading from CVS
+
+* CVS Incantations::
+
+Setup Tuning
+
+* Autoloading::
+* Multiple Lisps::
+* Loading Swank faster::
+
+Using slime-mode
+
+* User-interface conventions::
+* Commands::
+* Semantic indentation::
+* Reader conditionals::
+
+User-interface conventions
+
+* Temporary buffers::
+* Inferior-lisp::
+* Multithreading::
+* Key bindings::
+
+Commands
+
+* Programming::
+* Compilation::
+* Evaluation::
+* Recovery::
+* Inspector::
+* Profiling::
+* Other::
+
+Programming commands
+
+* Completion::
+* Indentation::
+* Documentation::
+* Cross-reference::
+* Finding definitions::
+* Macro-expansion::
+* Disassembly::
+
+REPL: the ``top level''
+
+* REPL commands::
+* Input Navigation::
+* Shortcuts::
+
+SLDB: the SLIME debugger
+
+* Examining frames::
+* Restarts::
+* Frame Navigation::
+* Stepping::
+* Miscellaneous::
+
+Misc
+
+* slime-selector::
+* slime-macroexpansion-minor-mode::
+* Multiple connections::
+
+Customization
+
+* Emacs-side customization::
+* Lisp-side::
+
+Emacs-side
+
+* Hooks::
+
+Lisp-side (Swank)
+
+* Communication style::
+* Other configurables::
+
+Tips and Tricks
+
+* Connecting to a remote lisp::
+* Global IO Redirection::
+* Auto-SLIME::
+
+Connecting to a remote lisp
+
+* Setting up the lisp image::
+* Setting up Emacs::
+* Setting up pathname translations::
+
+Contributed Packages
+
+* Loading Contribs::
+* Compound Completion::
+* Fuzzy Completion::
+* slime-autodoc-mode::
+* ASDF::
+* Banner::
+* Editing Commands::
+* Fancy Inspector::
+* Presentations::
+* Typeout frames::
+* TRAMP::
+* Documentation Links::
+* Xref and Class Browser::
+* Highlight Edits::
+* inferior-slime-mode::
+* Scratch Buffer::
+* slime-fancy::
+
+@end detailmenu
@end menu
@c -----------------------
@@ -281,7 +414,7 @@
@section Installation
With a Lisp implementation that can be started from the command-line,
-installation just requires a few lines in your @file{~/.emacs}:
+installation just requires a few lines in your @file{.emacs}:
@vindex inferior-lisp-program
@vindex load-path
@@ -333,7 +466,6 @@
* Autoloading::
* Multiple Lisps::
* Loading Swank faster::
-* Loading Contribs::
@end menu
@node Autoloading
@@ -353,8 +485,8 @@
The only difference compared to the basic setup is the line
@code{(require 'slime-autoloads)}. It tells Emacs that the rest of
-@SLIME{} should be loaded when one of the commands @kbd{M-x slime} or
-@kbd{M-x slime-connect} is executed the first time.
+@SLIME{} should be loaded automatically when one of the commands
+@kbd{M-x slime} or @kbd{M-x slime-connect} is executed the first time.
@node Multiple Lisps
@subsection Multiple Lisps
@@ -391,10 +523,18 @@
@item PROGRAM-ARGS
is a list of command line arguments.
@item CODING-SYSTEM
-the coding system for the connection.
+the coding system for the connection. (@pxref{slime-net-coding-system})
@item INIT
-@itemx INIT-FUNCTION
- ... to be written ...
+should be a function which takes two arguments: a filename and a
+character encoding. The function should return a Lisp expression as a
+string which instructs Lisp to start the Swank server and to write the
+port number to the file. At startup, @SLIME{} starts the Lisp process
+and sends the result of this function to Lisp's standard input. As
+default, @code{slime-init-command} is used. An example is shown in
+@ref{init-example,,Loading Swank faster}.
+@itemx INIT-FUNCTION
+should be a function which takes no arguments. It is called after
+the connection is established. (See also @ref{slime-connected-hook}.)
@end table
@node Loading Swank faster
@@ -426,15 +566,16 @@
@example
shell$ sbcl
* (load ".../slime/swank-loader.lisp")
-* (save-lisp-and-die "sbcl.core-with-slime")
+* (save-lisp-and-die "sbcl.core-with-swank")
@end example
@noindent
Then add this to your @file{.emacs}:
+@anchor{init-example}
@lisp
(setq slime-lisp-implementations
- '((sbcl ("sbcl" "--core" "sbcl.core-with-slime")
+ '((sbcl ("sbcl" "--core" "sbcl.core-with-swank")
:init (lambda (port-file _)
(format "(swank:start-server %S)\n" port-file)))))
@end lisp
@@ -442,10 +583,6 @@
@noindent
Similar setups should also work for other Lisp implementations.
-@node Loading Contribs
-@subsection Loading Contribs
-... to be written ...
-
@node slime-mode
@chapter Using slime-mode
@@ -455,7 +592,6 @@
@menu
* User-interface conventions::
-* Key bindings::
* Commands::
* Semantic indentation::
* Reader conditionals::
@@ -473,6 +609,7 @@
* Temporary buffers::
* Inferior-lisp::
* Multithreading::
+* Key bindings::
@end menu
@c -----------------------
@@ -544,10 +681,28 @@
swank:*default-worker-thread-bindings*).
@end example
-@c -----------------------
+
@node Key bindings
-@section Key bindings
+@subsection Key bindings
+In general we try to make our key bindings fit with the overall Emacs
+style. We also have the following somewhat unusual convention of our
+own: when entering a three-key sequence, the final key can be pressed
+either with control or unmodified. For example, the
+@code{slime-describe-symbol} command is bound to @kbd{C-c C-d d}, but
+it also works to type @kbd{C-c C-d C-d}. We're simply binding both key
+sequences because some people like to hold control for all three keys
+and others don't, and with the two-key prefix we're not afraid of
+running out of keys.
+
+There is one exception to this rule, just to trip you up. We never
+bind @kbd{C-h} anywhere in a key sequence, so @kbd{C-c C-d C-h}
+doesn't do the same thing as @kbd{C-c C-d h}. This is because Emacs
+has a built-in default so that typing a prefix followed by @kbd{C-h}
+will display all bindings starting with that prefix, so @kbd{C-c C-d
+C-h} will actually list the bindings for all documentation commands.
+This feature is just a bit too useful to clobber!
+
@quotation
@i{``Are you deliberately spiting Emacs's brilliant online help facilities? The gods will be angry!''}
@end quotation
@@ -570,7 +725,6 @@
@kbdanchorc{C-h l, view-lossage, ``Woah@comma{} what key chord did I just do?''}
Shows you the literal sequence of keys you've pressed in order.
-
@c <key> is breaks links PDF, despite that it's not l it's C-h
@c @kbdanchorc{ <key> l, , ``What starts with?''}
@c Lists all keybindings that begin with @code{<key>} for the focus buffer mode.
@@ -591,24 +745,6 @@
@noindent In this situation everywhere you see @kbd{C-h} in the
documentation you would substitute @kbd{F1}.
-In general we try to make our key bindings fit with the overall Emacs
-style. We also have the following somewhat unusual convention of our
-own: when entering a three-key sequence, the final key can be pressed
-either with control or unmodified. For example, the
-@code{slime-describe-symbol} command is bound to @kbd{C-c C-d d}, but
-it also works to type @kbd{C-c C-d C-d}. We're simply binding both key
-sequences because some people like to hold control for all three keys
-and others don't, and with the two-key prefix we're not afraid of
-running out of keys.
-
-There is one exception to this rule, just to trip you up. We never
-bind @kbd{C-h} anywhere in a key sequence, so @kbd{C-c C-d C-h}
-doesn't do the same thing as @kbd{C-c C-d h}. This is because Emacs
-has a built-in default so that typing a prefix followed by @kbd{C-h}
-will display all bindings starting with that prefix, so @kbd{C-c C-d
-C-h} will actually list the bindings for all documentation commands.
-This feature is just a bit too useful to clobber!
-
You can assign or change default key bindings globally using the
@code{global-set-key} function in your @file{~/.emacs} file like this:
@example
@@ -659,7 +795,6 @@
@menu
* Completion::
-* Closure::
* Indentation::
* Documentation::
* Cross-reference::
@@ -672,6 +807,9 @@
@node Completion
@subsubsection Completion commands
+@cindex Completion
+@cindex Symbol Completion
+
Completion commands are used to complete a symbol or form based on
what is already present at point. Classical completion assumes an
exact prefix and gives choices only where branches may occur. Fuzzy
@@ -683,89 +821,15 @@
@itemx C-c C-i
@itemx C-M-i
Complete the symbol at point. Note that three styles of completion are
-available in @SLIME{}, and the default differs from normal Emacs
+available in @SLIME{}; the default is similar to normal Emacs
completion (@pxref{slime-complete-symbol-function}).
-@kbditem{C-c C-s, slime-complete-form}
-Looks up and inserts into the current buffer the argument list for the
-function at point, if there is one. More generally, the command
-completes an incomplete form with a template for the missing arguments.
-There is special code for discovering extra keywords of generic
-functions and for handling @code{make-instance} and
-@code{defmethod}. Examples:
-
-@example
-(subseq "abc" <C-c C-s>
- --inserts--> start [end])
-(find 17 <C-c C-s>
- --inserts--> sequence :from-end from-end :test test
- :test-not test-not :start start :end end
- :key key)
-(find 17 '(17 18 19) :test #'= <C-c C-s>
- --inserts--> :from-end from-end
- :test-not test-not :start start :end end
- :key key)
-(defclass foo () ((bar :initarg :bar)))
-(defmethod print-object <C-c C-s>
- --inserts--> (object stream)
- body...)
-(defmethod initialize-instance :after ((object foo) &key blub))
-(make-instance 'foo <C-c C-s>
- --inserts--> :bar bar :blub blub initargs...)
-@end example
-
-@anchor{slime-fuzzy-complete-symbol}
-@kbditem{C-c M-i, slime-fuzzy-complete-symbol}
-Presents a list of likely completions to choose from for an
-abbreviation at point. This is a third completion method and it is
-very different from the more traditional completion to which
-@command{slime-complete-symbol} defaults. It attempts to complete a
-symbol all at once, instead of in pieces. For example, ``mvb'' will
-find ``@code{multiple-value-bind}'' and ``norm-df'' will find
-``@code{least-positive-normalized-double-float}''. This can also be
-selected as the method of completion used for
-@code{slime-complete-symbol}.
-
-@cmditem{slime-fuzzy-completions-mode}
-@cmditem{slime-fuzzy-abort}
@end table
-
-@c -----------------------
-@node Closure
-@subsubsection Closure commands
-
-Closure commands are used to fill in missing parenthesis.
-
-@table @kbd
-@kbditem{C-c C-q, slime-close-parens-at-point}
-Closes parentheses at point to complete the top-level-form by inserting ')'
-characters at until @code{beginning-of-defun} and @code{end-of-defun}
-execute without errors, or @code{slime-close-parens-limit} is exceeded.
-
-@kbditem{C-], slime-close-all-sexp}
-Balance parentheses of open s-expressions at point.
-Insert enough right-parentheses to balance unmatched left-parentheses.
-Delete extra left-parentheses. Reformat trailing parentheses
-Lisp-stylishly.
-
-If @code{REGION} is true, operate on the region. Otherwise operate on
-the top-level sexp before point.
-@end table
-
-
-@c -----------------------
@node Indentation
@subsubsection Indentation commands
@table @kbd
-@kbditem{C-c M-q, slime-reindent-defun}
-Re-indents the current defun, or refills the current paragraph.
-If point is inside a comment block, the text around point will be
-treated as a paragraph and will be filled with @code{fill-paragraph}.
-Otherwise, it will be treated as Lisp code, and the current defun
-will be reindented. If the current defun has unbalanced parens,
-an attempt will be made to fix it before reindenting.
@kbditem{C-M-q, indent-sexp}
Indents the list immediately following point to match the level at point.
@@ -774,7 +838,6 @@
be treated as a paragraph. This is useful for filling docstrings."
@end table
-
@c -----------------------
@node Documentation
@subsubsection Documentation commands
@@ -828,6 +891,9 @@
@node Cross-reference
@subsubsection Cross-reference commands
+@cindex xref
+@cindex Cross-referencing
+
@SLIME{}'s cross-reference commands are based on the support provided
by the Lisp system, which varies widely between Lisps. For systems
with no built-in @acronym{XREF} support @SLIME{} queries a portable
@@ -884,6 +950,9 @@
@node Finding definitions
@subsubsection Finding definitions (``Meta-Point'' commands).
+@cindex Meta-dot
+@cindex TAGS
+
The familiar @kbd{M-.} command is provided. For generic functions this
command finds all methods, and with some systems it does other fancy
things (like tracing structure accessors to their @code{DEFSTRUCT}
@@ -919,6 +988,8 @@
@node Macro-expansion
@subsubsection Macro-expansion commands
+@cindex Macros
+
@table @kbd
@kbditem{C-c C-m, slime-macroexpand-1}
Macroexpand the expression at point once. If invoked with a prefix
@@ -962,6 +1033,8 @@
@node Compilation
@subsection Compilation commands
+@cindex Compilation
+
@SLIME{} has fancy commands for compiling functions, files, and
packages. The fancy part is that notes and warnings offered by the
Lisp compiler are intercepted and annotated directly onto the
@@ -969,9 +1042,9 @@
see what this means.)
@table @kbd
+@cindex Compiling Functions
@kbditem{C-c C-c, slime-compile-defun}
Compile the top-level form at point.
-@cindex compiling functions
@kbditem{C-c C-y, slime-call-defun}
Insert a call to the function defined around point into the REPL.
@@ -1012,50 +1085,56 @@
@node Evaluation
@subsection Evaluation commands
-These commands each evaluate a Lisp expression in a different way. By
-default they show their results in a message, but a prefix argument
-causes the results to be printed in the @REPL{} instead.
+These commands each evaluate a Common Lisp expression in a different
+way. Usually they mimic commands for evaluating Emacs Lisp code. By
+default they show their results in the echo area, but a prefix
+argument causes the results to be inserted in the current buffer.
@table @kbd
+@kbditem{C-x C-e, slime-eval-last-expression}
+
+Evaluate the expression before point and show the result in the echo
+area.
+
@kbditem{C-M-x, slime-eval-defun}
-Evaluate the current toplevel form.
-Use @code{slime-re-evaluate-defvar} if the from starts with @code{(defvar}.
+Evaluate the current toplevel form and show the result in the echo
+area. `C-M-x' treats `defvar' expressions specially. Normally,
+evaluating a `defvar' expression does nothing if the variable it
+defines already has a value. But `C-M-x' unconditionally resets the
+variable to the initial value specified in the `defvar' expression.
+This special feature is convenient for debugging Lisp programs.
-@kbditem{C-x C-e, slime-eval-last-expression}
-Evaluate the expression before point.
@end table
-If @kbd{C-M-x} or @kbd{C-x C-e} is given a numeric argument, it inserts the
-value into the current buffer at point, rather than displaying it in the
-echo area.
+If @kbd{C-M-x} or @kbd{C-x C-e} is given a numeric argument, it
+inserts the value into the current buffer, rather than displaying it
+in the echo area.
@table @kbd
-@kbditem{C-c C-p, slime-pprint-eval-last-expression}
-Evaluate the expression before point and pretty-print the result.
+@kbditem{C-c :, slime-interactive-eval}
+Evaluate an expression read from the minibuffer.
@kbditem{C-c C-r, slime-eval-region}
Evaluate the region.
-@kbditem{C-x M-e, slime-eval-last-expression-display-output}
-Display output buffer and evaluate the expression preceding point.
+@kbditem{C-c C-p, slime-pprint-eval-last-expression}
+Evaluate the expression before point and pretty-print the result in a
+fresh buffer.
-@kbditem{C-c :, slime-interactive-eval}
-Evaluate an expression read from the minibuffer.
-
-@anchor{slime-scratch}
-@cmditem{slime-scratch}
-Create a @file{*slime-scratch*} buffer. In this
-buffer you can enter Lisp expressions and evaluate them with
-@kbd{C-j}, like in Emacs's @file{*scratch*} buffer.
-
@kbditem{C-c E, slime-edit-value}
Edit the value of a setf-able form in a new buffer @file{*Edit <form>*}.
The value is inserted into a temporary buffer for editing and then set
-in Lisp when committed with @code{slime-edit-value-commit}.
+in Lisp when committed with @kbd{C-c C-c}.
+@kbditem{C-x M-e, slime-eval-last-expression-display-output}
+Display the output buffer and evaluate the expression preceding point.
+This is useful if the expression writes something to the output stream.
+
@kbditem{C-c C-u, slime-undefine-function}
-Unbind symbol for function at point.
+Undefine the function, with @code{fmakunbound}, for the symbol at
+point.
+
@end table
@@ -1080,14 +1159,10 @@
@node Inspector
@subsection Inspector commands
-The @SLIME{} inspector is a very fancy Emacs-based alternative to the
+The @SLIME{} inspector is a Emacs-based alternative to the
standard @code{INSPECT} function. The inspector presents objects in
Emacs buffers using a combination of plain text, hyperlinks to related
-objects, and ``actions'' that can be selected to invoke Lisp code on
-the inspected object. For example, to present a generic function the
-inspector shows the documentation in plain text and presents each
-method with both a hyperlink to inspect the method object and a
-``remove method'' action that you can invoke interactively.
+objects.
The inspector can easily be specialized for the objects in your own
programs. For details see the the @code{inspect-for-emacs} generic
@@ -1120,8 +1195,9 @@
@kbditem{q, slime-inspector-quit}
Dismiss the inspector buffer.
-@kbditem{M-RET, slime-inspector-copy-down}
-Evaluate the value under point via the REPL (to set `*').
+@kbditem{M-RET, slime-inspector-copy-down}
+Store the value under point in the variable `*'. This can
+then be used to access the object in the REPL.
@end table
@@ -1129,6 +1205,10 @@
@node Profiling
@subsection Profiling commands
+The profiling commands are based on CMUCL's profiler. These are
+simple wrappers around functions which usually print something to the
+output buffer.
+
@table @kbd
@cmditem{slime-toggle-profile-fdefinition}
Toggle profiling of a function.
@@ -1205,18 +1285,20 @@
@node Reader conditionals
@section Reader conditional fontification
-@SLIME{} automatically evaluates reader-conditional expressions in
-source buffers and ``grays out'' code that will be skipped for the
-current Lisp connection.
+@SLIME{} automatically evaluates reader-conditional expressions, like
+@code{#+linux}, in source buffers and ``grays out'' code that will be
+skipped for the current Lisp connection.
@c -----------------------
@node REPL
@chapter REPL: the ``top level''
+@cindex Listener
+
@SLIME{} uses a custom Read-Eval-Print Loop (@REPL{}, also known as a
-``top level''). The @REPL{} user-interface is written in Emacs Lisp,
-which gives more Emacs-integration than the traditional
+``top level'', or listener). The @REPL{} user-interface is written in
+Emacs Lisp, which gives more Emacs-integration than the traditional
@code{comint}-based Lisp interaction:
@itemize @bullet
@@ -1255,35 +1337,51 @@
@kbditem{C-j, slime-repl-newline-and-indent}
Open and indent a new line.
+@kbditem{C-a, slime-repl-bol}
+Go to the beginning of the line, but stop at the @REPL{} prompt.
+
@c @anchor{slime-interrupt}
@kbditem{C-c C-c, slime-interrupt}
Interrupt the Lisp process with @code{SIGINT}.
-@kbditem{C-c M-g, slime-quit}
-Quit slime.
+@c @kbditem{C-c M-g, slime-quit}
+@c Quit slime.
+@kbditem{C-c C-t, slime-repl-clear-buffer}
+Clear the entire buffer, leaving only a prompt.
+
@kbditem{C-c C-o, slime-repl-clear-output}
Remove the output and result of the previous expression from the
buffer.
-@kbditem{C-c C-t, slime-repl-clear-buffer}
-Clear the entire buffer, leaving only a prompt.
-
@end table
@c -----------------------
@node Input Navigation
@section Input navigation
+@cindex Input History
+
+The input navigation (a.k.a. history) commands are modelled after
+@code{coming}-mode. Be careful if you are used to Bash-like
+keybindings: @kbd{M-p} and @kbd{M-n} use the current input as search
+pattern and only work Bash-like if the current line is
+empty. @kbd{C-<up>} and @kbd{C-<up>} work like the up and down keys in
+Bash.
+
@table @kbd
-@kbditem{C-a, slime-repl-bol}
-Go to the beginning of the line, but stop at the @REPL{} prompt.
+@kbditempair{C-<up>, C-<down>,
+ slime-repl-forward-input, slime-repl-backward-input}
+Go to the next/previous history item.
@kbditempair{M-n, M-p, slime-repl-next-input, slime-repl-previous-input}
-Go to next/previous in command history.
+Search the next/previous item in the command history using the current
+input as search pattern. If @kbd{M-n}/@kbd{M-n} is typed two times in
+a row, the second invocation uses the same search pattern (even if the
+current input has changed).
-@kbditempair{M-s, M-r,
+@kbditempair{M-s, M-r,
slime-repl-next-matching-input, slime-repl-previous-matching-input}
Search forward/reverse through command history with regex
@@ -1292,22 +1390,24 @@
@c @code{comint}-style input history commands.
@kbditempair{C-c C-n, C-c C-p,
-slime-repl-next-prompt, slime-repl-previous-prompt}
+slime-repl-next-prompt, slime-repl-previous-prompt}
Move between the current and previous prompts in the @REPL{} buffer.
+Pressing RET on a line with old input copies that line to the newest
+prompt.
+@end table
-@kbditempair{C-M-a, C-M-e,
-slime-repl-beginning-of-defun, slime-repl-end-of-defun}
-These commands are like @code{beginning-of-defun} and
-@code{end-of-defun}, but when used inside the @REPL{} input area they
-instead go directly to the beginning or the end, respectively.
+@vindex slime-repl-wrap-history
+The variable @code{slime-repl-wrap-history} controls wrap around
+behaviour, i.e. whether cycling should restart at the beginning of the
+history if the end is reached.
-@end table
-
@c -----------------------
@comment node-name, next, previous, up
@node Shortcuts
@section Shortcuts
+@cindex Shortcuts
+
``Shortcuts'' are a special set of @REPL{} commands that are invoked
by name. To invoke a shortcut you first press @kbd{,} (comma) at the
@REPL{} prompt and then enter the shortcut's name when prompted.
@@ -1327,24 +1427,15 @@
@item compile-and-load (aka cl)
Compile (if neccessary) and load a lisp file.
-@item compile-system
-Compile (but not load) an ASDF system.
@item defparameter (aka !)
Define a new global, special, variable.
-@item force-compile-system
-Recompile (but not load) an ASDF system.
-
-@item force-load-system
-Recompile and load an ASDF system.
-
@item help (aka ?)
Display the help.
-@item load-system
-Compile (as needed) and load an ASDF system.
+
@item pop-directory (aka -d)
Pop the current directory.
@@ -1378,6 +1469,8 @@
@node Debugger
@chapter SLDB: the SLIME debugger
+@cindex Debugger
+
@SLIME{} has a custom Emacs-based debugger called @SLDB{}. Conditions
signalled in the Lisp system invoke @SLDB{} in Emacs by way of the
Lisp @code{*DEBUGGER-HOOK*}.
@@ -1391,6 +1484,7 @@
* Examining frames::
* Restarts::
* Frame Navigation::
+* Stepping::
* Miscellaneous::
@end menu
@@ -1461,7 +1555,29 @@
only.
@end table
-@c -----------------------
+@node Stepping
+@section Stepping
+
+@cindex Stepping
+
+Stepping is not available in all implementations and works very
+differently in those in which it is available.
+
+@table @kbd
+@kbditem{s, sldb-step}
+Step to the next expression in the frame. For CMUCL that means, set a
+breakpoint at all those code locations in the current code block which
+are reachable from the current code location.
+
+@kbditem{x, sldb-next}
+[Step to the next form in the current function.]
+
+@kbditem{o, sldb-next}
+[Stop single-stepping temporarily, but resume it once the current
+function returns.]
+
+@end table
+
@node Miscellaneous
@section Miscellaneous Commands
@@ -1475,29 +1591,24 @@
Return from the frame with a value entered in the minibuffer. (This
command is not available in all implementations.)
-@kbditem{s, sldb-step}
-Step to the next expression in the frame. (This command is not
-available in all implementations.)
@kbditem{B, sldb-break-with-default-debugger}
Exit @SLDB{} and debug the condition using the Lisp system's default
debugger.
-@kbditem{C-c :, slime-interactive-eval}
+@kbditem{:, slime-interactive-eval}
Evaluate an expression entered in the minibuffer.
@end table
@c -----------------------
-@node Extras
-@chapter Extras
+@node Misc
+@chapter Misc
@menu
* slime-selector::
-* slime-autodoc-mode::
* slime-macroexpansion-minor-mode::
* Multiple connections::
-* Typeout frames::
@end menu
@c -----------------------
@@ -1538,24 +1649,6 @@
buffers for @code{slime-selector} to find.
@c -----------------------
-@node slime-autodoc-mode
-@section @code{slime-autodoc-mode}
-
-@table @kbd
-@cmditem{slime-autodoc-mode}
-Autodoc mode is an additional minor-mode for automatically showing
-information about symbols near the point. For function names the
-argument list is displayed, and for global variables, the value.
-This is a clone of @code{eldoc-mode} for Emacs Lisp.
-@end table
-
-The mode can be enabled by default in the @code{slime-setup} call of your
-(a)code{~/.emacs}:
-@example
-(slime-setup '(slime-autodoc))
-@end example
-
-@c -----------------------
@node slime-macroexpansion-minor-mode
@section slime-macroexpansion-minor-mode
@@ -1648,33 +1741,7 @@
@end table
-@c -----------------------
-@node Typeout frames
-@section Typeout frames
-A ``typeout frame'' is a special Emacs frame which is used instead of
-the echo area (minibuffer) to display messages from @SLIME{} commands.
-This is an optional feature. The advantage of a typeout frame over the
-echo area is that it can hold more text, it can be scrolled, and its
-contents don't disappear when you press a key. All potentially long
-messages are sent to the typeout frame, such as argument lists, macro
-expansions, and so on.
-
-@table @kbd
-@cmditem{slime-ensure-typeout-frame}
-Ensure that a typeout frame exists, creating one if necessary.
-@end table
-
-If the typeout frame is closed then the echo area will be used again
-as usual.
-
-To have a typeout frame created automatically at startup you can add
-the @code{slime-connected-hook} to your @file{~/.emacs} file:
-
-@example
-(add-hook 'slime-connected-hook 'slime-ensure-typeout-frame)
-@end example
-
@c -----------------------
@node Customization
@chapter Customization
@@ -1705,34 +1772,13 @@
@vindex slime-complete-symbol-function
@item slime-complete-symbol-function
The function to use for completion of Lisp symbols. Three completion
-styles are available. The default @code{slime-complete-symbol*}
-performs completion ``in parallel'' over the hyphen-delimited
-sub-words of a symbol name.
-@footnote{This style of completion is modelled on @file{completer.el}
-by Chris McConnell. That package is bundled with @acronym{ILISP}.}
-Formally this means that ``@code{a-b-c}'' can complete to any symbol
-matching the regular expression ``(a)code{^a.*-b.*-c.*}'' (where ``dot''
-matches anything but a hyphen). Examples give a more intuitive
-feeling:
-@itemize @bullet
-@item
-@code{m-v-b} completes to @code{multiple-value-bind}.
-@item
-@code{w-open} is ambiguous: it completes to either
-@code{with-open-file} or @code{with-open-stream}. The symbol is
-expanded to the longest common completion (@code{with-open-}) and the
-point is placed at the first point of ambiguity, which in this case is
-the end.
-@item
-@code{w--stream} completes to @code{with-open-stream}.
-@end itemize
-An alternative is @code{slime-simple-complete-symbol}, which
-completes in the usual Emacs way. Finally, there is
-@code{slime-fuzzy-complete-symbol}, which is quite different from both
-of the above and tries to find best matches to an abbreviated symbol.
-It also has its own key binding, defaulting to @kbd{C-c M-i}.
-@xref{slime-fuzzy-complete-symbol}, for more information.
+styles are available: @code{slime-simple-complete-symbol},
+@code{slime-complete-symbol*} (@pxref{Compound Completion}),
+and @code{slime-fuzzy-complete-symbol} (@pxref{Fuzzy Completion}).
+The default is @code{slime-simple-complete-symbol}, which completes in
+the usual Emacs way.
+
@vindex slime-filename-translations
@item slime-filename-translations
This variable controls filename translation between Emacs and the Lisp
@@ -1741,7 +1787,13 @@
but have different layouts, as is the case with @acronym{SMB}-based
file sharing.
+@anchor{slime-net-coding-system}
@vindex slime-net-coding-system
+@cindex Unicode
+@cindex UTF-8
+@cindex ASCII
+@cindex LATIN-1
+@cindex Character Encoding
@item slime-net-coding-system
If you want to transmit Unicode characters between Emacs and the Lisp
system, you should customize this variable. E.g., if you use SBCL, you
@@ -1749,11 +1801,12 @@
@example
(setq slime-net-coding-system 'utf-8-unix)
@end example
-To actually display Unicode characters you also need appropriate fonts,
-otherwise the characters will be rendered as hollow boxes. If you are
-using Allegro CL and GNU Emacs, you can also use @code{emacs-mule-unix}
-as coding system. GNU Emacs has often nicer fonts for the latter
-encoding.
+To actually display Unicode characters you also need appropriate
+fonts, otherwise the characters will be rendered as hollow boxes. If
+you are using Allegro CL and GNU Emacs, you can also
+use @code{emacs-mule-unix} as coding system. GNU Emacs has often
+nicer fonts for the latter encoding. (Different encodings can be used
+for different Lisps, see @ref{Multiple Lisps}.)
@end table
@@ -1774,6 +1827,7 @@
buffers. An example use is to enable @code{slime-autodoc-mode}
(@pxref{slime-autodoc-mode}).
+@anchor{slime-connected-hook}
@vindex slime-connected-hook
@item slime-connected-hook
This hook is run when @SLIME{} establishes a connection to a Lisp
@@ -2075,7 +2129,8 @@
@file{/opt/project/source.lisp} refers to the same file on both
machines. Unfortunetly NFS is usually slow, often buggy, and not
always feasable, fortunetely we have an ssh connection and Emacs'
-@code{tramp-mode} can do the rest.
+@code{tramp-mode} can do the rest.
+(See @inforef{Top, TRAMP User Manual,tramp}.)
What we do is teach Emacs how to take a filename on the remote machine
and translate it into something that tramp can understand and access
@@ -2130,7 +2185,440 @@
(save-excursion (slime)))))
@end example
+@node Contributed Packages
+@chapter Contributed Packages
+In version 3.0 we moved some functionility to separate packages. This
+chapter tells you how to load contrib modules and describes what the
+particular packages do.
+
+@menu
+* Loading Contribs::
+* Compound Completion::
+* Fuzzy Completion::
+* slime-autodoc-mode::
+* ASDF::
+* Banner::
+* Editing Commands::
+* Fancy Inspector::
+* Presentations::
+* Typeout frames::
+* TRAMP::
+* Documentation Links::
+* Xref and Class Browser::
+* Highlight Edits::
+* inferior-slime-mode::
+* Scratch Buffer::
+* slime-fancy::
+@end menu
+
+@node Loading Contribs
+@section Loading Contrib Packages
+
+@cindex Contribs
+@cindex Contributions
+@cindex Plugins
+
+Contrib packages aren't loaded by default. You have to modify your
+setup a bit so that Emacs knows where to find them and which of them
+to load, i.e. you should add the contrib directory to
+Emacs' @code{load-path} and call @code{slime-setup} with the list of
+package-names. For example, a setup to load the @code{slime-scratch}
+and @code{slime-editing-commands} looks like:
+
+@example
+(add-to-list 'load-path ".../slime") ; path for core
+(add-to-list 'load-path ".../slime/contrib") ; path for contribs
+(require 'slime-autoloads)
+(slime-setup '(slime-scratch slime-editing-commands))
+@end example
+
+After starting SLIME, the commands of both packages should be
+available.
+
+@node Compound Completion
+@section Compund Completion
+
+@anchor{slime-complete-symbol*}
+The package @code{slime-c-p-c} provides a different symbol completion
+algorithm, which performs completion ``in parallel'' over the
+hyphen-delimited sub-words of a symbol name.
+@footnote{This style of completion is modelled on @file{completer.el}
+by Chris McConnell. That package is bundled with @acronym{ILISP}.}
+Formally this means that ``@code{a-b-c}'' can complete to any symbol
+matching the regular expression ``(a)code{^a.*-b.*-c.*}'' (where ``dot''
+matches anything but a hyphen). Examples give a more intuitive
+feeling:
+@itemize @bullet
+@item
+@code{m-v-b} completes to @code{multiple-value-bind}.
+@item
+@code{w-open} is ambiguous: it completes to either
+@code{with-open-file} or @code{with-open-stream}. The symbol is
+expanded to the longest common completion (@code{with-open-}) and the
+point is placed at the first point of ambiguity, which in this case is
+the end.
+@item
+@code{w--stream} completes to @code{with-open-stream}.
+@end itemize
+
+The variable @code{slime-c-p-c-unambiguous-prefix-p} specifies where
+point should be placed after completion. E.g. the possible
+completions for @code{f-o} are @code{finish-output} and
+@code{force-output}. By the default point is moved after the
+@code{f}, because that is the unambigous prefix. If
+@code{slime-c-p-c-unambiguous-prefix-p} is nil, point moves to
+the end of the inserted text, after the @code{o} in this case.
+
+@table @kbd
+@kbditem{C-c C-s, slime-complete-form}
+Looks up and inserts into the current buffer the argument list for the
+function at point, if there is one. More generally, the command
+completes an incomplete form with a template for the missing arguments.
+There is special code for discovering extra keywords of generic
+functions and for handling @code{make-instance} and
+@code{defmethod}. Examples:
+
+@example
+(subseq "abc" <C-c C-s>
+ --inserts--> start [end])
+(find 17 <C-c C-s>
+ --inserts--> sequence :from-end from-end :test test
+ :test-not test-not :start start :end end
+ :key key)
+(find 17 '(17 18 19) :test #'= <C-c C-s>
+ --inserts--> :from-end from-end
+ :test-not test-not :start start :end end
+ :key key)
+(defclass foo () ((bar :initarg :bar)))
+(defmethod print-object <C-c C-s>
+ --inserts--> (object stream)
+ body...)
+(defmethod initialize-instance :after ((object foo) &key blub))
+(make-instance 'foo <C-c C-s>
+ --inserts--> :bar bar :blub blub initargs...)
+@end example
+@end table
+
+@node Fuzzy Completion
+@section Fuzzy Completion
+
+The package @code{slime-fuzzy} implements yet another symbol
+completion heuristic.
+
+[Somebody please describe what the algorithm actually does]
+
+It attempts to complete a symbol all at once, instead of in pieces.
+For example, ``mvb'' will find ``@code{multiple-value-bind}'' and
+``norm-df'' will find
+``@code{least-positive-normalized-double-float}''.
+
+The algorithm tries to expand every character in various ways and
+rates the list of possible completions with the following heuristic.
+
+Letters are given scores based on their position in the string.
+Letters at the beginning of a string or after a prefix letter at
+the beginning of a string are scored highest. Letters after a
+word separator such as #\- are scored next highest. Letters at
+the end of a string or before a suffix letter at the end of a
+string are scored medium, and letters anywhere else are scored
+low.
+
+If a letter is directly after another matched letter, and its
+intrinsic value in that position is less than a percentage of the
+previous letter's value, it will use that percentage instead.
+
+Finally, a small scaling factor is applied to favor shorter
+matches, all other things being equal.
+
+@table @kbd
+@anchor{slime-fuzzy-complete-symbol}
+@kbditem{C-c M-i, slime-fuzzy-complete-symbol}
+Presents a list of likely completions to choose from for an
+abbreviation at point. If you set the
+variable @code{slime-complete-symbol-function} to this command, fuzzy
+completion will also be used for @kbd{M-TAB}.
+@end table
+
+@node slime-autodoc-mode
+@section @code{slime-autodoc-mode}
+
+Autodoc mode is an additional minor-mode for automatically showing
+information about symbols near the point. For function names the
+argument list is displayed, and for global variables, the value.
+This is a clone of @code{eldoc-mode} for Emacs Lisp.
+
+The mode can be enabled by default in the @code{slime-setup} call of your
+(a)code{~/.emacs}:
+@example
+(slime-setup '(slime-autodoc))
+@end example
+
+@table @kbd
+@cmditem{slime-arglist NAME}
+Show the argument list of the function NAME.
+
+@cmditem{slime-autodoc-mode}
+Toggles autodoc-mode on or off according to the argument, and
+toggles the mode when invoked without argument.
+@end table
+
+If the variable @code{slime-use-autodoc-mode} is set (default), Emacs
+starts a timer, otherwise the information is only displayed after
+pressing SPC.
+
+@node ASDF
+@section ASDF
+
+@acronym{ASDF} is a popular ``system construction tool''. The package
+@code{slime-asdf} provides some commands to load and compile such
+systems from Emacs. @acronym{ASDF} itself is not included with
+@SLIME{}; you have to load that yourself into your Lisp. In
+particular, you must load @acronym{ASDF} before you connect, otherwise
+you will get errors about missing symbols.
+
+@table @kbd
+@cmditem{slime-load-system NAME}
+Compile and load an ASDF system. The default system name is taken
+from the first file matching *.asd in the current directory.
+@end table
+
+The package also installs some new REPL shortcuts (@pxref{Shortcuts}):
+
+@table @kbd
+@item load-system
+Compile (as needed) and load an ASDF system.
+@item compile-system
+Compile (but not load) an ASDF system.
+@item force-compile-system
+Recompile (but not load) an ASDF system.
+@item force-load-system
+Recompile and load an ASDF system.
+@end table
+
+@node Banner
+@section Banner
+The package @code{slime-banner} installs a window header line (
+@inforef{Header Lines, , elisp}.) in the REPL buffer. It also runs an
+animation at startup.
+
+@vindex slime-startup-animation
+@vindex slime-header-line-p
+By setting the variable @code{slime-startup-animation} to nil you can
+disable the animation respectivly with the
+variable @code{slime-header-line-p} the header line.
+
+@node Editing Commands
+@section Editing Commands
+
+The package @code{slime-editing-commands} provides some commands to
+edit Lisp expressions.
+
+@table @kbd
+@kbditem{C-c M-q, slime-reindent-defun}
+Re-indents the current defun, or refills the current paragraph.
+If point is inside a comment block, the text around point will be
+treated as a paragraph and will be filled with @code{fill-paragraph}.
+Otherwise, it will be treated as Lisp code, and the current defun
+will be reindented. If the current defun has unbalanced parens,
+an attempt will be made to fix it before reindenting.
+
+@cmditem{slime-close-all-parens-in-sexp}
+Balance parentheses of open s-expressions at point.
+Insert enough right parentheses to balance unmatched left parentheses.
+Delete extra left parentheses. Reformat trailing parentheses
+Lisp-stylishly.
+
+If REGION is true, operate on the region. Otherwise operate on
+the top-level sexp before point.
+
+@cmditem{slime-insert-balanced-comments}
+Insert a set of balanced comments around the s-expression containing
+the point. If this command is invoked repeatedly (without any other
+command occurring between invocations), the comment progressively
+moves outward over enclosing expressions. If invoked with a positive
+prefix argument, the s-expression arg expressions out is enclosed in a
+set of balanced comments.
+
+@kbditem{M-C-a, slime-beginning-of-defun}
+@kbditem{M-C-e, slime-end-of-defun}
+@end table
+
+@node Fancy Inspector
+@section Fancy Inspector
+
+@cindex Methods
+
+An alternative to default inspector is provided by the package
+`slime-fancy-inspector'. This inspector knows a lot about CLOS
+objects and methods. It provides many ``actions'' that can be
+selected to invoke Lisp code on the inspected object. For example, to
+present a generic function the inspector shows the documentation in
+plain text and presents each method with both a hyperlink to inspect
+the method object and a ``remove method'' action that you can invoke
+interactively. The key-bindings are the same as for the basic
+inspector (@pxref{Inspector}).
+
+@node Presentations
+@section Presentations
+
+@cindex Presentations
+
+A ``presentation''@footnote{Presentations are a feature originating
+from the Lisp machines. It was possible to define @code{present}
+methods specialized to various devices, e.g. to draw an object to
+bitmapped screen or to write some text to a character stream.} in
+@SLIME{} is a region of text associated with a Lisp object.
+Right-clicking on the text brings up a menu with operations for the
+particular object. Some operations, like inspecting, are available
+for all objects, but the object may also have specialized operations.
+E.g. pathnames have a dired operation.
+
+The package @code{slime-presentations} installs presentations in the
+REPL, i.e. the results of evaluation commands become presentations.
+
+For some implementations you can also install
+@code{slime-presentation-streams} which enables presentations on the
+Lisp @code{*standard-output*} stream. E.g. printing a list to such a
+stream will create presentions in the Emacs buffer.
+
+@table @kbd
+@cmditem{slime-copy-or-inspect-presentation-at-mouse}
+@cmditem{slime-inspect-presentation-at-mouse}
+@cmditem{slime-copy-presentation-at-mouse}
+@cmditem{slime-copy-presentation-at-mouse-to-point}
+@cmditem{slime-copy-presentation-at-mouse-to-kill-ring}
+@cmditem{slime-describe-presentation-at-mouse}
+@cmditem{slime-pretty-print-presentation-at-mouse}
+@cmditem{slime-clear-presentations}
+@end table
+
+@node Typeout frames
+@section Typeout frames
+
+@cindex Typeout Frame
+
+A ``typeout frame'' is a special Emacs frame which is used instead of
+the echo area (minibuffer) to display messages from @SLIME{} commands.
+This is an optional feature. The advantage of a typeout frame over the
+echo area is that it can hold more text, it can be scrolled, and its
+contents don't disappear when you press a key. All potentially long
+messages are sent to the typeout frame, such as argument lists, macro
+expansions, and so on.
+
+@table @kbd
+@cmditem{slime-ensure-typeout-frame}
+Ensure that a typeout frame exists, creating one if necessary.
+@end table
+
+If the typeout frame is closed then the echo area will be used again
+as usual.
+
+To have a typeout frame created automatically at startup you should
+load the @code{slime-typeout-frame} package. (@pxref{Loading Contribs}.)
+
+The variable @code{slime-typeout-frame-properties} specifies the
+height and possibly other properties of the frame. Its value is
+passed to @code{make-frame}. (@inforef{Creating Frames, ,elisp}.)
+
+@node TRAMP
+@section TRAMP
+
+@cindex TRAMP
+
+The package @code{slime-tramp} provides some functions to set up
+filename translations for TRAMP. (@pxref{Setting up pathname
+translations})
+
+@node Documentation Links
+@section Documentation Links
+
+For certain error messages, SBCL includes references to the ANSI
+Standard or the SBCL User Manual. The @code{slime-references} package
+turns those references into clickable links. This makes finding the
+referenced section of the HyperSpec much easier.
+
+@node Xref and Class Browser
+@section Xref and Class Browser
+
+A rudimentary class browser is provied by
+the @code{slime-xref-browser} package.
+
+@table @kbd
+@cmditem{slime-browse-classes}
+This command asks for a class name and displays inheritance tree of
+for the class.
+
+@cmditem{slime-browse-xrefs}
+This command prompts for a symbol and the kind of cross reference,
+e.g. callers. The cross reference tree rooted at the symbol is then
+then displayed.
+
+@end table
+
+
+@node Highlight Edits
+@section Highlight Edits
+
+@code{slime-highlight-edits} is a minor mode to highlight those
+regions in a Lisp source file which are modified. This is useful to
+quickly find those functions which need to be recompiled (whith
+@kbd{C-c C-c})
+
+@table @kbd
+@cmditem{slime-highlight-edits-mode}
+Turns @code{slime-highlight-edits-mode} on or off.
+@end table
+
+@node inferior-slime-mode
+@section @code{inferior-slime-mode}
+
+The @code{inferior-slime-mode} is a minor mode is intended to use with
+a comint buffer. It provides some of the SLIME commands, like symbol
+completion and documentation lookup. To install it, add something
+like this to user @file{.emacs}:
+
+@example
+(slime-setup '(inferior-slime-mode))
+(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode 1)))
+@end example
+
+@table @kbd
+@cmditem{inferior-slime-mode}
+Turns inferior-slime-mode on or off.
+@end table
+
+@vindex inferior-slime-mode-map
+The variable @code{inferior-slime-mode-map} contains the extra
+keybindings.
+
+@node Scratch Buffer
+@section Scratch Buffer
+
+@anchor{slime-scratch}
+The @SLIME{} scratch buffer, in contrib package @code{slime-scratch},
+imitates Emacs' usual @code{*scratch*} buffer. It's just like any
+other Lisp buffer, except for the command bound to @kbd{C-j}.
+
+@table @kbd
+
+@kbditem{C-j, slime-eval-print-last-expression}
+Evaluate the expression sexp before point and insert print value into
+the current buffer.
+
+@cmditem{slime-scratch}
+Create a @file{*slime-scratch*} buffer. In this
+buffer you can enter Lisp expressions and evaluate them with
+@kbd{C-j}, like in Emacs's @file{*scratch*} buffer.
+
+@end table
+
+@node slime-fancy
+@section Meta package: @code{slime-fancy}
+
+@code{slime-fancy} is a meta package which loads a combination of the
+most popular packages.
+
@c -----------------------
@node Credits
@chapter Credits
@@ -2172,8 +2660,8 @@
This index is currently ingored, because texinfo's built-in indexing
produces nicer results. -- Helmut Eller
-@node Index to Functions
-@appendix Index to Functions
+@c@node Index to Functions
+@c@appendix Index to Functions
These functions are all available (when relevant). To find the
keybinding (if there is one) refer to the function description.
@@ -2456,16 +2944,20 @@
@end ignore
-@node Key Index, Command Index, Credits, top
+@node Key Index
@unnumbered Key (Character) Index
@printindex ky
-@node Command Index, Variable Index, Key Index, top
+@node Command Index
@unnumbered Command and Function Index
@printindex fn
-@node Variable Index, , Command Index, top
-@unnumbered Variable Index
+@node Variable Index
+@unnumbered Variable and Concept Index
@printindex vr
@bye
+Local Variables:
+paragraph-start: "@[a-zA-Z]+\\({[^}]+}\\)?[ \n]\\|[ ]*$"
+paragraph-separate: "@[a-zA-Z]+\\({[^}]+}\\)?[ \n]\\|[ ]*$"
+End:
Modified: branches/trunk-reorg/thirdparty/slime/slime.el
===================================================================
--- branches/trunk-reorg/thirdparty/slime/slime.el 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/slime.el 2007-12-02 18:46:42 UTC (rev 2295)
@@ -488,13 +488,18 @@
(defun slime-pretty-package-name (name)
"Return a pretty version of a package name NAME."
- (let ((name (cond ((string-match "^:\\(.*\\)$" name)
+ (let ((name (cond ((string-match "^#?:\\(.*\\)$" name)
(match-string 1 name))
((string-match "^\"\\(.*\\)\"$" name)
(match-string 1 name))
(t name))))
(format "%s" (read name))))
+(defun slime-pretty-current-package ()
+ "Retrun a prettied version of `slime-current-package'."
+ (let ((p (slime-current-package)))
+ (and p (slime-pretty-package-name p))))
+
(when slime-update-modeline-package
(run-with-idle-timer 0.2 0.2 'slime-update-modeline-package))
@@ -1933,6 +1938,9 @@
"The symbol-names of Lisp's *FEATURES*.
This is automatically synchronized from Lisp.")
+(slime-def-connection-var slime-lisp-modules '()
+ "The strings of Lisp's *MODULES*.")
+
(slime-def-connection-var slime-lisp-package
"COMMON-LISP-USER"
"The current package name of the Superior lisp.
@@ -2002,14 +2010,16 @@
"Initialize CONNECTION with INFO received from Lisp."
(let ((slime-dispatching-connection connection))
(destructuring-bind (&key pid style lisp-implementation machine
- features package version &allow-other-keys) info
+ features package version modules
+ &allow-other-keys) info
(or (equal version slime-protocol-version)
(yes-or-no-p "Protocol version mismatch. Continue anyway? ")
(slime-net-close connection)
(top-level))
(setf (slime-pid) pid
(slime-communication-style) style
- (slime-lisp-features) features)
+ (slime-lisp-features) features
+ (slime-lisp-modules) modules)
(destructuring-bind (&key name prompt) package
(setf (slime-lisp-package) name
(slime-lisp-package-prompt-string) prompt))
@@ -2029,6 +2039,7 @@
(slime-generate-connection-name (symbol-name name)))))
(slime-hide-inferior-lisp-buffer)
(slime-init-output-buffer connection)
+ (slime-load-contribs)
(run-hooks 'slime-connected-hook)
(when-let (fun (plist-get args ':init-function))
(funcall fun)))
@@ -2244,15 +2255,12 @@
;; (in-package #+ansi-cl :cl #-ansi-cl 'lisp)
(defun slime-search-buffer-package ()
(let ((case-fold-search t)
- (regexp (concat "^(\\(cl:\\|common-lisp:\\)?in-package\\>[ \n\t\r']*"
- "\\([^)]+\\)[ \n\t]*)")))
+ (regexp (concat "^(\\(cl:\\|common-lisp:\\)?in-package\\>[ \t']*"
+ "\\([^)]+\\)[ \t]*)")))
(save-excursion
(when (or (re-search-backward regexp nil t)
(re-search-forward regexp nil t))
- (let ((string (match-string-no-properties 2)))
- (cond ((string-match "^\"" string) (ignore-errors (read string)))
- ((string-match "^#?:" string) (substring string (match-end 0)))
- (t string)))))))
+ (match-string-no-properties 2)))))
;;; Synchronous requests are implemented in terms of asynchronous
;;; ones. We make an asynchronous request with a continuation function
@@ -2840,6 +2848,7 @@
(slime-define-keys slime-repl-mode-map
("\C-m" 'slime-repl-return)
+ ([return] 'slime-repl-return)
("\C-j" 'slime-repl-newline-and-indent)
("\C-\M-m" 'slime-repl-closing-return)
([(control return)] 'slime-repl-closing-return)
@@ -3302,8 +3311,8 @@
(defun slime-repl-set-package (package)
"Set the package of the REPL buffer to PACKAGE."
- (interactive (list (slime-read-package-name "Package: "
- (slime-find-buffer-package))))
+ (interactive (list (slime-read-package-name
+ "Package: " (slime-pretty-current-package))))
(with-current-buffer (slime-output-buffer)
(let ((unfinished-input (slime-repl-current-input)))
(destructuring-bind (name prompt-string)
@@ -3565,6 +3574,7 @@
nil
"[read]"
'(("\C-m" . slime-repl-return)
+ ([return] . slime-repl-return)
("\C-c\C-b" . slime-repl-read-break)
("\C-c\C-c" . slime-repl-read-break)))
@@ -4167,6 +4177,7 @@
(slime-define-keys slime-compiler-notes-mode-map
((kbd "RET") 'slime-compiler-notes-default-action-or-show-details)
+ ([return] 'slime-compiler-notes-default-action-or-show-details)
([mouse-2] 'slime-compiler-notes-default-action-or-show-details/mouse)
("q" 'slime-temp-buffer-quit))
@@ -5985,6 +5996,7 @@
(slime-define-keys slime-xref-mode-map
((kbd "RET") 'slime-show-xref)
+ ([return] 'slime-show-xref)
("\C-m" 'slime-show-xref)
(" " 'slime-goto-xref)
("q" 'slime-xref-quit)
@@ -6374,7 +6386,7 @@
(defun slime-set-package (package)
(interactive (list (slime-read-package-name "Package: "
- (slime-find-buffer-package))))
+ (slime-pretty-current-package))))
(message "*package*: %s" (slime-eval `(swank:set-package ,package))))
(defun slime-set-default-directory (directory)
@@ -6516,6 +6528,7 @@
("v" 'sldb-show-source)
((kbd "RET") 'sldb-default-action)
("\C-m" 'sldb-default-action)
+ ([return] 'sldb-default-action)
([mouse-2] 'sldb-default-action/mouse)
([follow-link] 'mouse-face)
("e" 'sldb-eval-in-frame)
@@ -7339,6 +7352,7 @@
(slime-define-keys slime-connection-list-mode-map
((kbd "RET") 'slime-goto-connection)
+ ([return] 'slime-goto-connection)
("d" 'slime-connection-list-make-default)
("g" 'slime-update-connection-list)
((kbd "C-k") 'slime-quit-connection-at-point)
@@ -7680,7 +7694,7 @@
(slime-define-keys slime-inspector-mode-map
([return] 'slime-inspector-operate-on-point)
- ([(meta return)] 'slime-inspector-copy-down)
+ ((kbd "M-RET") 'slime-inspector-copy-down)
("\C-m" 'slime-inspector-operate-on-point)
([mouse-2] 'slime-inspector-operate-on-click)
("l" 'slime-inspector-pop)
@@ -7901,6 +7915,27 @@
(run-hook-with-args 'slime-indentation-update-hooks symbol indent))))
+;;;; Contrib modules
+
+(defvar slime-required-modules '())
+
+(defun slime-require (module)
+ (assert (keywordp module))
+ (pushnew module slime-required-modules)
+ (when (slime-connected-p)
+ (slime-load-contribs)))
+
+(defun slime-load-contribs ()
+ (let ((needed (remove-if (lambda (s)
+ (member (subseq (symbol-name s) 1)
+ (mapcar #'downcase (slime-lisp-modules))))
+ slime-required-modules)))
+ (when needed
+ (slime-eval-async `(swank:swank-require ',needed)
+ (lambda (new-modules)
+ (setf (slime-lisp-modules) new-modules))))))
+
+
;;;;; Pull-down menu
(defvar slime-easy-menu
@@ -9072,14 +9107,18 @@
(apply #'buffer-substring-no-properties
(slime-region-for-defun-at-point)))
+(defvar slime-region-for-defun-function nil)
+
(defun slime-region-for-defun-at-point ()
"Return the start and end position of the toplevel form at point."
- (save-excursion
- (save-match-data
- (end-of-defun)
- (let ((end (point)))
- (beginning-of-sexp)
- (list (point) end)))))
+ (or (and slime-region-for-defun-function
+ (funcall slime-region-for-defun-function))
+ (save-excursion
+ (save-match-data
+ (end-of-defun)
+ (let ((end (point)))
+ (beginning-of-sexp)
+ (list (point) end))))))
(defun slime-beginning-of-symbol ()
"Move point to the beginning of the current symbol."
Modified: branches/trunk-reorg/thirdparty/slime/swank-cmucl.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/slime/swank-cmucl.lisp 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/swank-cmucl.lisp 2007-12-02 18:46:42 UTC (rev 2295)
@@ -911,16 +911,17 @@
(vm::find-code-object function))
(not (eq closure function))))
-
-(defun byte-function-location (fn)
- "Return the location of the byte-compiled function FN."
- (etypecase fn
+(defun byte-function-location (fun)
+ "Return the location of the byte-compiled function FUN."
+ (etypecase fun
((or c::hairy-byte-function c::simple-byte-function)
- (let* ((component (c::byte-function-component fn))
- (debug-info (kernel:%code-debug-info component)))
- (debug-info-function-name-location debug-info)))
+ (let* ((di (kernel:%code-debug-info (c::byte-function-component fun))))
+ (if di
+ (debug-info-function-name-location di)
+ `(:error
+ ,(format nil "Byte-function without debug-info: ~a" fun)))))
(c::byte-closure
- (byte-function-location (c::byte-closure-function fn)))))
+ (byte-function-location (c::byte-closure-function fun)))))
;;; Here we deal with structure accessors. Note that `dd' is a
;;; "defstruct descriptor" structure in CMUCL. A `dd' describes a
Modified: branches/trunk-reorg/thirdparty/slime/swank-lispworks.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/slime/swank-lispworks.lisp 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/swank-lispworks.lisp 2007-12-02 18:46:42 UTC (rev 2295)
@@ -542,22 +542,10 @@
(defun unmangle-unfun (symbol)
"Converts symbols like 'SETF::|\"CL-USER\" \"GET\"| to
function names like \(SETF GET)."
- (or (and (eq (symbol-package symbol)
- (load-time-value (find-package :setf)))
- (let ((slime-nregex::*regex-groupings* 0)
- (slime-nregex::*regex-groups* (make-array 10))
- (symbol-name (symbol-name symbol)))
- (and (funcall (load-time-value
- (compile nil (slime-nregex:regex-compile "^\"(.+)\" \"(.+)\"$")))
- symbol-name)
- (list 'setf
- (intern (apply #'subseq symbol-name
- (aref slime-nregex::*regex-groups* 2))
- (find-package
- (apply #'subseq symbol-name
- (aref slime-nregex::*regex-groups* 1))))))))
- symbol))
-
+ (cond ((sys::setf-symbol-p symbol)
+ (sys::setf-pair-from-underlying-name symbol))
+ (t symbol)))
+
(defun signal-undefined-functions (htab &optional filename)
(maphash (lambda (unfun dspecs)
(dolist (dspec dspecs)
Modified: branches/trunk-reorg/thirdparty/slime/swank-loader.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/slime/swank-loader.lisp 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/swank-loader.lisp 2007-12-02 18:46:42 UTC (rev 2295)
@@ -33,7 +33,7 @@
(defparameter *sysdep-files*
(append
- '("nregex")
+ '()
#+cmu '("swank-source-path-parser" "swank-source-file-cache" "swank-cmucl")
#+scl '("swank-source-path-parser" "swank-source-file-cache" "swank-scl")
#+sbcl '("swank-source-path-parser" "swank-source-file-cache"
Modified: branches/trunk-reorg/thirdparty/slime/swank.lisp
===================================================================
--- branches/trunk-reorg/thirdparty/slime/swank.lisp 2007-11-29 13:18:49 UTC (rev 2294)
+++ branches/trunk-reorg/thirdparty/slime/swank.lisp 2007-12-02 18:46:42 UTC (rev 2295)
@@ -17,6 +17,8 @@
(:export #:startup-multiprocessing
#:start-server
#:create-server
+ #:stop-server
+ #:restart-server
#:ed-in-emacs
#:inspect-in-emacs
#:print-indentation-lossage
@@ -103,9 +105,15 @@
(*print-array* . t)
(*print-lines* . 10)
(*print-escape* . t)
- (*print-right-margin* . 70))
+ (*print-right-margin* . 65))
"A set of printer variables used in the debugger.")
+(defvar *backtrace-printer-bindings*
+ `((*print-pretty* . nil)
+ (*print-level* . 4)
+ (*print-length* . 6))
+ "Pretter settings for printing backtraces.")
+
(defvar *default-worker-thread-bindings* '()
"An alist to initialize dynamic variables in worker threads.
The list has the form ((VAR . VALUE) ...). Each variable VAR will be
@@ -577,19 +585,20 @@
(defvar *coding-system* "iso-latin-1-unix")
+(defvar *listener-sockets* nil
+ "A property list of lists containing style, socket pairs used
+ by swank server listeners, keyed on socket port number. They
+ are used to close sockets on server shutdown or restart.")
+
(defun start-server (port-file &key (style *communication-style*)
(dont-close *dont-close*)
(coding-system *coding-system*))
"Start the server and write the listen port number to PORT-FILE.
This is the entry point for Emacs."
- (flet ((start-server-aux ()
- (setup-server 0 (lambda (port)
- (announce-server-port port-file port))
- style dont-close
- (find-external-format-or-lose coding-system))))
- (if (eq style :spawn)
- (initialize-multiprocessing #'start-server-aux)
- (start-server-aux))))
+ (setup-server 0 (lambda (port)
+ (announce-server-port port-file port))
+ style dont-close
+ (find-external-format-or-lose coding-system)))
(defun create-server (&key (port default-server-port)
(style *communication-style*)
@@ -610,19 +619,61 @@
(defun setup-server (port announce-fn style dont-close external-format)
(declare (type function announce-fn))
(let* ((socket (create-socket *loopback-interface* port))
- (port (local-port socket)))
- (funcall announce-fn port)
+ (local-port (local-port socket)))
+ (funcall announce-fn local-port)
(flet ((serve ()
(serve-connection socket style dont-close external-format)))
(ecase style
(:spawn
- (spawn (lambda () (loop do (ignore-errors (serve)) while dont-close))
- :name "Swank"))
+ (initialize-multiprocessing
+ (lambda ()
+ (spawn (lambda ()
+ (loop do (ignore-errors (serve)) while dont-close))
+ :name (concatenate 'string "Swank "
+ (princ-to-string port))))))
((:fd-handler :sigio)
(add-fd-handler socket (lambda () (serve))))
((nil) (loop do (serve) while dont-close)))
- port)))
+ (setf (getf *listener-sockets* port) (list style socket))
+ local-port)))
+(defun stop-server (port)
+ "Stop server running on PORT."
+ (let* ((socket-description (getf *listener-sockets* port))
+ (style (first socket-description))
+ (socket (second socket-description)))
+ (ecase style
+ (:spawn
+ (let ((thread-position
+ (position-if
+ (lambda (x)
+ (string-equal (first x)
+ (concatenate 'string "Swank "
+ (princ-to-string port))))
+ (list-threads))))
+ (when thread-position
+ (kill-nth-thread thread-position)
+ (close-socket socket)
+ (remf *listener-sockets* port))))
+ ((:fd-handler :sigio)
+ (remove-fd-handlers socket)
+ (close-socket socket)
+ (remf *listener-sockets* port)))))
+
+(defun restart-server (&key (port default-server-port)
+ (style *communication-style*)
+ (dont-close *dont-close*)
+ (coding-system *coding-system*))
+ "Stop the server listening on PORT, then start a new SWANK server
+on PORT running in STYLE. If DONT-CLOSE is true then the listen socket
+will accept multiple connections, otherwise it will be closed after the
+first."
+ (stop-server port)
+ (sleep 5)
+ (create-server :port port :style style :dont-close dont-close
+ :coding-system coding-system))
+
+
(defun serve-connection (socket style dont-close external-format)
(let ((closed-socket-p nil))
(unwind-protect
@@ -1443,6 +1494,7 @@
:type ,(machine-type)
:version ,(machine-version))
:features ,(features-for-emacs)
+ :modules ,*modules*
:package (:name ,(package-name *package*)
:prompt ,(package-string-for-prompt *package*))
:version ,*swank-wire-protocol-version*))
@@ -1629,20 +1681,10 @@
(defun parse-package (string)
"Find the package named STRING.
Return the package or nil."
- (check-type string (or string null))
- (if (zerop (length string))
- nil
- (multiple-value-bind (name pos interned?)
- (let ((*package* *swank-io-package*))
- (ignore-errors (read-softly-from-string string)))
- (unwind-protect
- (and name
- (or (symbolp name)
- (stringp name))
- (= (length string) pos)
- (find-package name))
- (when interned?
- (unintern-in-home-package name))))))
+ ;; STRING comes usually from a (in-package STRING) form.
+ (ignore-errors
+ (find-package (let ((*package* *swank-io-package*))
+ (read-from-string string)))))
(defun unparse-name (string)
"Print the name STRING according to the current printer settings."
@@ -2017,7 +2059,7 @@
(defun safe-condition-message (condition)
"Safely print condition to a string, handling any errors during
printing."
- (let ((*print-pretty* t))
+ (let ((*print-pretty* t) (*print-right-margin* 65))
(handler-case
(format-sldb-condition condition)
(error (cond)
@@ -2053,8 +2095,9 @@
(loop for frame in (compute-backtrace start end)
for i from start
collect (list i (with-output-to-string (stream)
- (handler-case
- (print-frame frame stream)
+ (handler-case
+ (with-bindings *backtrace-printer-bindings*
+ (print-frame frame stream))
(t ()
(format stream "[error printing frame]")))))))
@@ -2138,11 +2181,12 @@
(defslimefun frame-locals-for-emacs (index)
"Return a property list ((&key NAME ID VALUE) ...) describing
the local variables in the frame INDEX."
- (mapcar (lambda (frame-locals)
- (destructuring-bind (&key name id value) frame-locals
- (list :name (prin1-to-string name) :id id
- :value (to-string value))))
- (frame-locals index)))
+ (with-bindings *backtrace-printer-bindings*
+ (mapcar (lambda (frame-locals)
+ (destructuring-bind (&key name id value) frame-locals
+ (list :name (prin1-to-string name) :id id
+ :value (to-string value))))
+ (frame-locals index))))
(defslimefun frame-catch-tags-for-emacs (frame-index)
(mapcar #'to-string (frame-catch-tags frame-index)))
@@ -2280,10 +2324,12 @@
;;;;; swank-require
-(defslimefun swank-require (module &optional filename)
+(defslimefun swank-require (modules &optional filename)
"Load the module MODULE."
- (require module (or filename (module-filename module)))
- nil)
+ (dolist (module (if (listp modules) modules (list modules)))
+ (unless (member (string module) *modules* :test #'string=)
+ (require module (or filename (module-filename module)))))
+ *modules*)
(defvar *find-module* 'find-module
"Pluggable function to locate modules.
@@ -2358,16 +2404,16 @@
;;;; Simple completion
-(defslimefun simple-completions (string buffer-package)
+(defslimefun simple-completions (string package)
"Return a list of completions for the string STRING."
- (let ((strings (all-completions string buffer-package #'prefix-match-p)))
+ (let ((strings (all-completions string package #'prefix-match-p)))
(list strings (longest-common-prefix strings))))
-(defun all-completions (string buffer-package test)
+(defun all-completions (string package test)
(multiple-value-bind (name pname intern) (tokenize-symbol string)
(let* ((extern (and pname (not intern)))
(pack (cond ((equal pname "") keyword-package)
- ((not pname) (guess-buffer-package buffer-package))
+ ((not pname) (guess-buffer-package package))
(t (guess-package pname))))
(test (lambda (sym) (funcall test name (unparse-symbol sym))))
(syms (and pack (matching-symbols pack extern test))))
@@ -2480,24 +2526,15 @@
(string< (symbol-name x) (symbol-name y))
(string< (package-name px) (package-name py)))))))))
-(let ((regex-hash (make-hash-table :test #'equal)))
- (defun compiled-regex (regex-string)
- (or (gethash regex-string regex-hash)
- (setf (gethash regex-string regex-hash)
- (if (zerop (length regex-string))
- (lambda (s) (check-type s string) t)
- (compile nil (slime-nregex:regex-compile regex-string)))))))
-
-(defun make-regexp-matcher (string case-sensitive)
- (let* ((case-modifier (if case-sensitive #'string #'string-upcase))
- (regex (compiled-regex (funcall case-modifier string))))
+(defun make-apropos-matcher (pattern case-sensitive)
+ (let ((chr= (if case-sensitive #'char= #'char-equal)))
(lambda (symbol)
- (funcall regex (funcall case-modifier symbol)))))
+ (search pattern (string symbol) :test chr=))))
(defun apropos-symbols (string external-only case-sensitive package)
(let ((packages (or package (remove (find-package :keyword)
(list-all-packages))))
- (matcher (make-regexp-matcher string case-sensitive))
+ (matcher (make-apropos-matcher string case-sensitive))
(result))
(with-package-iterator (next packages :external :internal)
(loop (multiple-value-bind (morep symbol) (next)
@@ -2875,15 +2912,13 @@
*inspectee-actions* (make-array 10 :adjustable t :fill-pointer 0)
*inspector-history* (make-array 10 :adjustable t :fill-pointer 0)))
-;; FIXME: Unused?
(defun valid-function-name-p (form)
- (or (and (not (null form))
- (not (eq form t))
- (symbolp form))
+ (or (symbolp form)
(and (consp form)
(second form)
(not (third form))
- (eq (first form) 'setf))))
+ (eq (first form) 'setf)
+ (symbolp (second form)))))
(defslimefun init-inspector (string)
(with-buffer-syntax ()