在 emacs 中配置 slime

在 emacs 中配置 slime

我正在为 emacs 配置 slime。到目前为止,我已经阅读了有关 common lisp 的基本功能,例如C-c C-q它调用命令slime-close-parens-at-point,将适当数量的括号放在鼠标所在的位置。另一个看起来很酷的命令是调用C-c C-c,它会将您正在缓冲区中编辑的代码传递到 REPL,然后“编译”它。

为什么这些命令对我不起作用?

无论如何,我已经通过 下载了slimeM-x list-packages但似乎没有这个功能(C-h w然后这些命令中的任何一个都告诉我这些命令不存在)。所以,我看到了一堆其他的 slime 扩展,比如slime-repl', 'slime-fuzzy' and 'hippie-expand-slime'. So I again usedMx list-packages` 并下载了它们。

我仍然没有这些命令。以下是我的 emacs 文件与 slime 相关的内容:

;;;Common Lisp and Slime                                                                                                                                
(add-to-list 'load-path "/home/s2s2/.emacs.d/elpa/slime-20130626.1151")
(add-to-list 'load-path "/home/s2s2/.emacs.d/elpa/slime-repl-201000404")
(add-to-list 'load-path "/home/s2s2/.emacs.d/elpa/hippie-expand-slime-20130226.1656")
(add-to-list 'load-path "/home/s2s2/.emacs.d/elpa/slime-fuzzy-20100404")

(require 'slime)
(setq slime-lisp-implementations
     `((sbcl ("/usr/bin/sbcl"))
       (ecl ("/usr/bin/ecl"))
       (clisp ("/usr/bin/clisp" "-q -I"))))

(require 'slime-repl)
(require 'slime-fuzzy)
(require 'hippie-expand-slime)

当我执行时,M-x slime我在缓冲区中收到以下消息inferior-lisp,可以在其中执行通用的 Lisp 代码(但是,这不应该是slime-repl因为我要求它吗?):

STYLE-WARNING: redefining EMACS-INSPECT (#<BUILT-IN-CLASS T>) in DEFMETHOD
STYLE-WARNING:
   Implicitly creating new generic function STREAM-READ-CHAR-WILL-HANG-P.
WARNING: These Swank interfaces are unimplemented:
 (DISASSEMBLE-FRAME SLDB-BREAK-AT-START SLDB-BREAK-ON-RETURN)
;; Swank started at port: 46533.

然后slime-error创建一个缓冲区,其内容如下:

Invalid protocol message:
Symbol "CREATE-REPL" not found in the SWANK package.

  Line: 1, Column: 28, File-Position: 28

  Stream: #<SB-IMPL::STRING-INPUT-STREAM {10056B9C33}>

(:emacs-rex (swank:create-repl nil) "COMMON-LISP-USER" t 5)
  1. 我应该如何修改 emacs 文件才能获得这些命令的功能?我是否没有在 emacs 文件中加载必要的文件?我需要安装其他软件包吗?

如果你需要更多信息,请告诉我!非常感谢你的帮助!

答案1

首先:不建议您像您那样手动将 ELPA 目录添加到加载路径;如果您通过 ELPA 更新这些软件包,新版本将位于不同的目录中,您将不得不重新访问 init 代码的这一部分来加载这些版本。本着尽可能自动化的原则,您最好明确初始化软件包管理器,它会自动将所有已安装的软件包添加到加载路径,而不是像默认的那样等待它在 init 之后初始化;请参阅这个答案了解如何做到这一点。

现在,我不确定我从哪里得到了这一段 Slime 的初始化代码,但它从来没有让我失望过:

(add-to-list 'load-path (expand-file-name "~/.emacs.d/site-lisp/slime"))
(require 'slime)
(add-hook 'lisp-mode-hook (lambda () (slime-mode t)))
(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))
(setq inferior-lisp-program "sbcl")
(slime-setup '(slime-fancy slime-asdf))

话虽如此,我只使用 SBCL,而且我看到您使用了多种实现。针对您的情况修改此初始化代码的最佳方法可能是这样的:

(require 'slime)
(add-hook 'lisp-mode-hook (lambda () (slime-mode t)))
(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))
(setq slime-lisp-implementations
  `((sbcl ("/usr/bin/sbcl"))
   (ecl ("/usr/bin/ecl"))
   (clisp ("/usr/bin/clisp" "-q -I"))))
(slime-setup '(slime-fancy slime-asdf hippie-expand-slime))

由于您已经根据我之前的评论初始化了包管理器,因此无需明确向加载路径添加任何内容;由于您使用了多个 Lisp,因此我们(setq inferior-lisp-program "...")也替换了。

有了这个,M-x slime将调用 SBCL 并为您提供 REPL 等,同时M-- M-x slime提示调用哪个 Lisp 实现。

相关内容