关于Clojure:在Emacs中运行苹果酒劫持

Running cider-jack-in in emacs

我想学习一些Clojure,并且试图从Emacs运行REPL,但是我无法使其正常工作。

我已经与lein创建了一个基本项目。 我在Emacs中打开生成的文件core.clj,当我尝试从中运行REPL(通过运行cider-jack-in)时,我仅收到消息:

1
Symbol's function definition is void: nil

我已经切换了错误调试,回溯(最后几行)是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 Debugger entered--Lisp error: (void-function nil)
   nil(#<buffer core.clj>)
   #[257"  !\\203\\207\\300\\207" [exclude predicate] 3"\
\
(fn ELT)"](#<buffer core.clj>)
   seq-map(#[257"  !\\203\\207\\300\\207" [exclude predicate] 3"\
\
(fn ELT)"] (#<buffer core.clj> #<buffer  *Minibuf-1*> #<buffer *Warnings*> #<buffer *GNU Emacs*> #<buffer *scratch*> #<buffer  *Minibuf-0*> #<buffer *Messages*> #<buffer  *code-conversion-work*> #<buffer  *Echo Area 0*> #<buffer  *Echo Area 1*>))
   seq-filter(#[257"r\\211q\\210\\300\\301!)\\207" [derived-mode-p cider-repl-mode] 3"\
\
(fn BUFFER)"] (#<buffer core.clj> #<buffer  *Minibuf-1*> #<buffer *Warnings*> #<buffer *GNU Emacs*> #<buffer *scratch*> #<buffer  *Minibuf-0*> #<buffer *Messages*> #<buffer  *code-conversion-work*> #<buffer  *Echo Area 0*> #<buffer  *Echo Area 1*>))
   cider-repl-buffers()
   cider-find-reusable-repl-buffer(nil"~/Development/languages/clojure/playground/test1/")
   cider-jack-in(nil)

当我在终端中运行lein run时,代码可以正常运行。
另外,当我在终端中运行lein repl时,REPL会使用以下信息正常运行:

1
2
3
4
nREPL server started on port 62741 on host 127.0.0.1 - nrepl://127.0.0.1:62741
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.8.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0_45-b14

Lein的Cider版本为0.14.0,而Emacs的版本为0.15.0。

谁能帮我弄清楚我缺少哪一部分设置,或者我做错了什么?

谢谢您的帮助!

编辑:波纹管是Emacs初始化文件的内容,删除了注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(require 'package)
(add-to-list 'package-archives
           '("marmalade" ."http://marmalade-repo.org/packages/") t)
(add-to-list 'package-archives
           '("tromey" ."http://tromey.com/elpa/") t)
(add-to-list 'package-archives
           '("melpa" ."http://melpa.milkbox.net/packages/") t)

(package-initialize)

(when (not package-archive-contents)
  (package-refresh-contents))

(defvar ido-cur-item nil)
(defvar ido-default-item nil)
(defvar ido-cur-list nil)
(defvar predicate nil)
(defvar inherit-input-method nil)

(defvar my-packages
  '(paredit
    clojure-mode
    clojure-mode-extra-font-locking
    cider
    ido-ubiquitous
    smex
    projectile
    rainbow-delimiters
    tagedit
    magit))

(if (eq system-type 'darwin)
    (add-to-list 'my-packages 'exec-path-from-shell))

(dolist (p my-packages)
  (when (not (package-installed-p p))
    (package-install p)))

(add-to-list 'load-path"~/.emacs.d/vendor")
(add-to-list 'load-path"~/.emacs.d/customizations")

(load"shell-integration.el")
(load"navigation.el")
(load"ui.el")
(load"editing.el")
(load"misc.el")
(load"elisp-editing.el")
(load"setup-clojure.el")
(load"setup-js.el")


这是我的lein调试清单:

  • ~/.lein/profiles.clj删除任何苹果酒-nrepl配方
  • 从终端运行lein repl,然后从emacs运行cider-connectlocalhost
  • 运行lein升级
  • 升级到苹果酒emacs软件包的最新版本
  • 在提交错误报告之前,在苹果酒频道中询问Clojure松弛情况。

以前需要将苹果酒的nrepl中间件添加到您的lein配置文件中,以便在lein启动时将其包含在类路径中。现在,苹果酒会自动执行此操作,并自行选择匹配的版本。许多人都遵循这是一个手动过程的说明,却遇到类似问题,因此请首先进行检查。


因此,错误似乎出现在第102行的cider-client.el https://github.com/clojure-emacs/cider/blob/master/cider-client.el#L99中。我已经在下面发布了整个defun:

1
2
3
4
5
6
(defun cider-repl-buffers ()
 "Return the list of REPL buffers."
  (seq-filter
   (lambda (buffer)
     (with-current-buffer buffer (derived-mode-p 'cider-repl-mode)))
   (buffer-list)))

您可以在CIDER副本中访问此文件,并确保该定义如下所示吗?这段代码只是在寻找repl缓冲区,并且正在过滤emacs知道的缓冲区。


删除您的~/.emacs.d目录并安装spacemacs


git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d

使用新的spacemacs ~/.emacs.d目录运行Emacs后,只需打开一个Clojure文件,spacemacs就会为您加载Clojure层中。

可以在spacemacs.org以及本教程中使用spacemacs https://practicalli.github.io/spacemacs/进行的Clojure开发中找到更多详细信息。