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@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@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@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@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@freebits.de + + * swank.lisp (valid-function-name-p): Fixed wrt. setf functions. + +2007-11-29 Helmut Eller heller@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@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@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@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@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@freebits.de + + * swank.lisp (swank-require): Fix typo (:key was used instead of + :test.) Reported by Stelian Ionescu. + +2007-11-22 Helmut Eller heller@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@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@Psilocybe.Update.UU.SE + to comp.lang.lisp. + 2007-11-06 Helmut Eller heller@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@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@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@common-lisp.net + + * slime-fuzzy.el: Use slime-require instead of a connected-hook. + +2007-11-20 Helmut Eller heller@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@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 -@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 ``@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 ``@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 +@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 ()