二、开始

本章告诉你如何配置和启动SLIME。

2.1 支持平台

SLIME广泛地支持多种操作系统和Lisp实现。SLIME可以在类Unix系统、Mac OSX和Microsoft Windows上运行。GNU Emacs 21、22和23以及XEmacs 21都可以运行SLIME。

粗略地根据支持的良好程度来排序的话,所有支持的Lisp实现为:

  • CMU Common Lisp(CMUCL),19d版或更新
  • Steel Bank Common Lisp(SBCL),1.0版或更新
  • Clozure Common Lisp(CCL),1.3版或更新
  • LispWorks,4.3版或更新
  • Allegro Common Lisp(ACL),6版或更新
  • CLISP,2.35版或更新
  • Armed Bear Common Lisp(ABCL)
  • Corman Common Lisp,2.51版或更新,需要 http://www.grumblesmurf.org/lisp/corman-patches 的补丁
  • Scieneer Common Lisp(SCL),1.2.7版或更新
  • Embedded Common Lisp(ECL)

绝大部分特性在不同实现上的表现都是一致的,但是有些可能会有所不同。这些包括放置编译信息的注释的精度、XREF支持以及调试器命令(例如“重启缓冲区”)。

2.2 下载SLIME

你可以选择使用发行版本的SLIME或者直接通过CVS仓库使用SLIME。你可以从我们的网站下载最新发布版本: http://www.common-lisp.net/project/slime/

我们建议加入了slime-dev邮件列表的用户使用CVS版本的代码。

2.2.1 从CVS下载

可以从common-lisp.net的CVS仓库取得SLIME。你可以选择使用最新版本的代码或者是带有FAIRLY-STABLE标签的快照版本。

跟FAIRLY-STABLE版本的代码相比,最新版本的代码可能有更多的特性和更少的BUG,但也有可能因为较大的改动而不稳定。根据经验法则,我们建议如果你加入了slime-dev邮件列表,你最好使用最新版本(当进行主要的变动时,我们会发出通告)。如果你没有加入邮件列表,你就无法得知最新版本代码的情况,所以使用FAIRLY-STABLE或者发布版本是一个安全的选择。

如果你从CVS迁出代码,记得经常更新。经常会有小的改进提交上去,而FAIRLY-STABLE标签也会随时推进。

2.2.2 使用CVS

要下载SLIME你要先配置你的CVSROOT并且登录到仓库。

export CVSROOT=:pserver:anonymous@common-lisp.net:/project/slime/cvsroot
cvs login

最新版的代码可以通过以下方式迁出:

cvs checkout slime

或者可以通过以下方式迁出FAIRLY-STABLE版本:

cvs checkout -rFAIRLY-STABLE slime

如果你想知道最新版本的代码跟你运行的版本有什么新的东西,你可以将本地的ChangeLog和版本仓库的进行对比:

cvs diff -rHEAD ChangeLog      # or: -rFAIRLY-STABLE

2.3 安装

如果你已经有了一个可以从命令行启动的Lisp实现,那么仅需在.emacs文件中添加几行即可安装成功:

(setq inferior-lisp-program "/opt/sbcl/bin/sbcl") ; your Lisp system
(add-to-list 'load-path "~/hacking/lisp/slime/")  ; your SLIME directory
(require 'slime)
(slime-setup)

在README文件里也可以见到上面这些代码。你可以从那里复制粘贴,但要记得替换正确的路径。

这是没有其它杂项的最小化配置。如果基本配置可以工作,那么你可以试附加模块。(8.1 加载扩展包)

我们建议如果你要使用SLIME就不要在Emacs里加载ILISP包。如果你这么做了,那么在编辑Lisp源文件时就会加入许多键绑定,而且这些键绑定可能会跟SLIME启动的Lisp进程发生冲突而无法正常工作。

2.4 启动SLIME

Emacs命令M-x slime可以启动SLIME。它使用inferior-lisp包来启动一个Lisp进程,加载并启动Lisp端服务器(叫做“Swank”),然后在Emacs和Lisp之间建立一个socket连接。最后会生成一个REPL缓冲区,你可以在这里输入Lisp表达式并求值。

于是现在SLIME启动完成,你可以开始使用了。

2.5 调整设置

这一部分说明了如何减少SLIME的启动时间和如何为多Lisp系统配置SLIME。

在进行本部分之前请确认你的基本配置已经可以工作。如果你对基本配置感到满意,那么请跳过这部分。

关于附加模块请看“8.1 加载扩展包”。

2.5.1 自动加载

基本设置始终会加载SLIME,即使你不使用它。如果你只在需要的时候才加载SLIME,那么Emacs会启动的快一点。要这样,你需要稍微更改你的.emacs文件:

(setq inferior-lisp-program "the path to your Lisp system")
(add-to-list 'load-path "the path of your slime directory")
(require 'slime-autoloads)
(slime-setup)

跟基本配置相比,差别只在这一行(require ‘slime-autoloads)。它告诉Emacs当M-x slime或者M-x slime-connect命令第一次执行之后SLIME的其它部分会被自动加载。

2.5.2 多种Lisp

默认情况下,M-x slime命令启动的程序是由inferior-lisp-program指定的。如果你在执行M-x slime命令时添加了一个前缀参数,Emacs会启动参数中指定的程序。如果你需要经常使用它或者命令的名称太长,那么在.emacs文件里设置slime-lisp-implementations变量则较为方便。例如,在这里我们定义了两个程序:

(setq slime-lisp-implementations
      '((cmucl ("cmucl" "-quiet"))
        (sbcl ("/opt/sbcl/bin/sbcl") :coding-system utf-8-unix)))

这个变量包含了一个Lisp程序的列表,如果你通过一个减号前缀参数启动SLIME,M– M-x sliem,你可以从这个列表里选择一个程序。当不加前缀地启动该命令,slime-default-lisp变量里指定的程序或者是列表中的第一项会被使用。列表的元素应该像这样:

(NAME (PROGRAM PROGRAM-ARGS...) &key CODING-SYSTEM INIT INIT-FUNCTION ENV)
  • NAME 是一个符号,用来指定Lisp程序

  • PROGRAM 是程序的文件名。注意文件名可以包含空格。

  • PROGRAM*ARGS 是一个命令行参数的列表。

  • CODING*SYSTEM 指定了连接的编码系统(见6.1 Emacs端 slime*net*coding*system)。

  • INIT 应该是一个接受两个参数的函数:一个文件名和一个字符编码。这个函数应该返回一个字符串格式的Lisp表达式,来指导Lisp启动Swank服务器并且将端口号写入文件。启动时,SLIME启动一个Lisp进程并将此函数的结果发送给Lisp的标准输入。默认情况下,slime*init*command会被使用。“2.5.3 更快地加载Swank”里有一个例子。

  • INIT*FUNCTION 应该是一个不接受参数的函数。连接建立之后它会被调用。(见 6.1.1 钩子 slime*connected*hook)

  • ENV 一个为子进程指定环境变量的列表。例如:

    (sbcl-cvs ("/home/me/sbcl-cvs/src/runtime/sbcl"
                   "--core" "/home/me/sbcl-cvs/output/sbcl.core") :env ("SBCL_HOME=/home/me/sbcl-cvs/contrib/"))
    

在子进程中初始化SBCL_HOME。

2.5.3 更快地加载Swank

对于SBCL,我们建议你新建一个有socket支持和POSIX绑定的核心配置文件,因为这些模块加载起来很耗时。为了新建一个这样的核心,执行以下的命令:

shell$ sbcl
(mapc 'require '(sb-bsd-sockets sb-posix sb-introspect sb-cltl2 asdf))
(save-lisp-and-die "sbcl.core-for-slime")

然后,在你的.emacs文件里加入如下代码:

(setq slime-lisp-implementations
      '((sbcl ("sbcl" "--core" "sbcl.core-for-slime"))))

为了最大化启动速度,你可以在核心文件里直接包含Swank服务器。这样做的缺点是设置的时候比较麻烦,并且当你想升级你的SLIME或者SBCL的时候你要新建一个核心文件。这样做的步骤是:

shell$ sbcl
(load ".../slime/swank-loader.lisp")
(swank-loader:dump-image "sbcl.core-with-swank")

然后在.emacs里加入如下代码:

(setq slime-lisp-implementations
      '((sbcl ("sbcl" "--core" "sbcl.core-with-swank")
              :init (lambda (port-file _)
                  (format "(swank:start-server %S)\n" port-file)))))

类似的配置对其它Lisp实现也适用。