终极解决方案:Emacs+Slime+Lisp启动错误:Polling "/tmp/slime.5000 .. 25 (Abort with 'M-x slime-abort-connection'.) [730 times]"
目录
问题描述
在树莓派2上安装了 Emacs + Slime + CCL/SBCL/CLISP/ECL
开发环境,结果启动时总是在 minibuffer
区出现如下错误,很难连接成功:
Polling "/tmp/slime.5000 .. 25 (Abort with 'M-x slime-abort-connection'.) [730 times]
尝试搜索无果
搜到几种解决办法,但是貌似都不起作用
主要参考此文:[Emacs slime mini buffer take-over] (http://stackoverflow.com/questions/15141617/emacs-slime-mini-buffer-take-over),其中有人提供了4种解决办法,不过貌似都不起作用
1、在 ~/.emacs.d/
目录下新建 tmp
目录,并在 .emacs
中增加设置:
(setq temporary-file-directory "/tmp")
2、清除掉 ~/.cache/common-lisp/
3、进入 slime
安装目录下的 /slime/contrib
,删除其中的 elc
文件
cd /path/slime/contrib
find ./ -name '*.elc' | xargs rm -f
4、因为使用自动安装,导致缺少 swank-loader.lisp,手动下载将其拷贝到 slime
的对应目录下,具体描述如下:
http://iswwwup.com/t/1307c691a162/emacs-slime-mini-buffer-take-over.html
The infinite polling may be due to the missing of file swank-loader.lisp. Check the variable slime-backend to see whether it contains the right path to swank-loader.lisp.
On my computer I don't even have a swank-loader.lisp file(I noticed that if you install the slime using elpa, this may happen). So I downloaded the entire slime from here and got it right.
自力更生研究报错信息
看来取巧的办法是不存在的,最终还是得靠自己研究,先看看错误信息提示:
(progn (load "/usr/share/common-lisp/source/slime/swank-loader.lisp" :verbose t) (funcall (read-from-string "swank-loader:init")) (fun\
call (read-from-string "swank:start-server") "/tmp/slime.7434"))
2
3lisp kernel support for the ARM soft-float ABI has been deprecated
等等~~ 我在 .emacs
里设置的 slime
路径貌似不是这个啊!看看 .emacs
文件里的这个配置行:
;; 设置 slime 加载目录
(add-to-list 'load-path "/opt/software/slime/")
恩,貌似有些明白了,上面的那个轮询提示是因为 slime
连接不到 swank
上,那么为什么连接不上?CCL
提示 slime
版本跟 swank
版本不一致(目前看来,还是 CCL
连接 slime
的错误提示最完全)。
在我的环境中 slime
最初是用这个命令安装的
sudo apt-get install slime
于是自动安装了一堆东西到 /usr/shar/common-lisp
下,包括旧版本的 slime
,cl-asdf
还有什么 common-lisp-controler
,而且用下面两个文件指定了 slime
相关路径在这里
pi@raspberrypi /usr/share/common-lisp/source/common-lisp-controller $ ls -al
total 20
drwxr-xr-x 2 root root 4096 Aug 23 21:45 .
drwxr-xr-x 5 root root 4096 Aug 24 10:42 ..
-rw-r--r-- 1 root root 5808 Oct 23 2012 common-lisp-controller.lisp
-rw-r--r-- 1 root root 2956 Oct 23 2012 post-sysdef-install.lisp
正好刚才加载 ECL
时也提示 asdf
版本过旧,看来也可以一起试着解决一下
因为 emacs
的启动配置文件有多个,既有 ~/.emacs
,也有 ~/.emacs.d/init.el
,还有 emacs/site-lisp/
下的文件,优先级我现在也记不太清楚了,所以导致我们修改了的文件配置在加载时被系统的默认配置给覆盖了,于是我们的配置就没起作用。
现在为了保证不会有多个修改源,后面下载回来的 slime
和 cl-asdf
我们只保留一个实际拷贝,其他目录下对它们的使用都建立符号链接,命令为:ln -s 原始文件夹完整路径 目标位置完整路径
问题解决方案
既然貌似找到了原因,那就试着改改,先解决 minibuffer
始终显示 polling
而连接不起来的问题,那么就手动下载 slime
最新版
cd ~/
sudo git clone https://github.com/slime/slime slime
cd ./slime
sudo make
sudo ln -s /home/pi/slime /usr/share/common-lisp/source/slime
然后按照上面第2、第3所说的清除相关文件
再次运行
emacs
M - -
M - x
slime
clisp
很好,编译一段时间后,连接成功, CLISP
下的 polling
信息消失了!
继续启动 CCL
和 SBCL
检查,全部 ok!看来问题初步得到了解决。
- 教训:需要相互配合使用的软件,比如
Emacs + Slime + Common Lisp
最好能自己独立下载安装,然后花点时间手动配置,否则用默认安装的话很可能会出现各种奇怪的问题。
ECL的小尾巴:
不过 ECL 还是继续报错,报错信息如下:
12;;; Loading "/usr/share/common-lisp/source/slime/swank-loader.lisp"
13;;; Loading #P"/usr/lib/ecl-11.1.1/cmp.fas"
14;;; Loading "/home/pi/.slime/fasl/2015-08-18/ecl-11.1.1-linux-arm/backend.fas"
15;;; Loading "/home/pi/.slime/fasl/2015-08-18/ecl-11.1.1-linux-arm/ecl.fas"
16;;; Loading #P"/usr/lib/ecl-11.1.1/sockets.fas"
17;;; Loading #P"/usr/lib/ecl-11.1.1/profile.fas"
18;;; Loading #P"/usr/lib/ecl-11.1.1/serve-event.fas"
19;;; Loading "/home/pi/.slime/fasl/2015-08-18/ecl-11.1.1-linux-arm/gray.fas"
20;;; Loading "/home/pi/.slime/fasl/2015-08-18/ecl-11.1.1-linux-arm/match.fas"
21;;; Loading "/home/pi/.slime/fasl/2015-08-18/ecl-11.1.1-linux-arm/rpc.fas"
22;;; Loading "/home/pi/.slime/fasl/2015-08-18/ecl-11.1.1-linux-arm/swank.fas"
23;;;
24;;; Compiling /usr/share/common-lisp/source/slime/contrib/swank-asdf.lisp.
25;;; OPTIMIZE levels: Safety=2, Space=0, Speed=3, Debug=3
26;;;
27;;; Loading #P"/usr/lib/ecl-11.1.1/asdf.fas"
28;;; Error:
29;;; in file swank-asdf.lisp, position 2332
30;;; at (UNLESS (OR #) ...)
31;;; * The form (IF (NOT (OR (ASDF:VERSION-SATISFIES (ASDF:ASDF-VERSION) "2.14.6"))) (PROGN (ERROR "Your ASDF is too old. ~
32;;; The oldest version supported by swank-asdf is 2.014.6."))) was not evaluated successfully.
33;;; Error detected:
34;;; Your ASDF is too old. The oldest version supported by swank-asdf is 2.014.6.;;
35;; Error while compiling /usr/share/common-lisp/source/slime/contrib/swank-asdf.lisp:
36;; COMPILE-FILE returned NIL.
37;; Aborting.
38;;
39
40Restart ABORT is not active.
41
42Available restarts:
43
441. (RESTART-TOPLEVEL) Go back to Top-Level REPL.
45
46Broken at SWANK-LOADER::HANDLE-SWANK-LOAD-ERROR. In: #<process TOP-LEVEL>.
47 File: #P"/opt/software/slime/swank-loader.lisp" (Position #6091)
48>>
那么就手动安装一次 cl-asdf
了
sudo apt-get install https://gitlab.common-lisp.net/asdf/asdf.git cl-asdf
sudo ln -s /opt/software/cl-asdf / /usr/share/common-lisp/source/cl-asdf
接着再把前面的临时文件清除一下
cd /usr/share/emacs/site-lisp/slime/contrib
sudo find ./ -name '*.elc' | xargs rm -f
cd ~/.cache
mv common-lisp/ ./common-lisp-back
不过 ECL 貌似有多处临时文件要删,这两个目录:/usr/lib/ecl-11.1.1/
,/home/pi/.slime/fasl/2015-08-18/ecl-11.1.1-linux-arm/
命令如下
pi@raspberrypi ~/.slime/fasl/2015-08-18 $ sudo mv ./ecl-11.1.1-linux-arm/ ./ecl-11.1.1-linux-arm-back
pi@raspberrypi /usr/lib/ecl-11.1.1 $ sudo mv ./*.fas ./fas-back
貌似把 lib
目录下的全部 fas
文件移出去会导致失败,那就先恢复原样,只把 asdf.fas
移走试试。
继续报错,那就把最新下载回来的 asdf.lisp
拷贝过去,这下好了,asdf
的问题解决了。
不过出现了另一个错误:
121;;; Compiling /usr/share/common-lisp/source/slime/contrib/swank-trace-dialog.lisp.
122;;; OPTIMIZE levels: Safety=2, Space=0, Speed=3, Debug=3
123;;;
124;;; Error:
125;;; in file swank-trace-dialog.lisp, position 6458
126;;; at (DEFSLIMEFUN REPORT-PARTIAL-TREE ...)
127;;; * The macro form (LOOP FOR I FROM (LENGTH RECENTLY-FINISHED) BELOW *TRACES-PER-REPORT* WHILE (< *VISITOR-IDX* (LENGTH *TRACES*\
)) FOR TRACE = (AREF *TRACES* *VISITOR-IDX*) COLLECT TRACE UNLESS (COMPLETED-P TRACE) DO (PUSH TRACE *UNFINISHED-TRACES*) DO (INCF *\
VISITOR-IDX*)) was not expanded successfully.
128;;; Error detected:
129;;; Iteration in LOOP follows body code.
130;;; Current LOOP context: FOR TRACE = (AREF *TRACES* *VISITOR-IDX*) COLLECT.;;
131;; Error while compiling /usr/share/common-lisp/source/slime/contrib/swank-trace-dialog.lisp:
132;; COMPILE-FILE returned NIL.
133;; Aborting.
134;;
135
136Restart ABORT is not active.
137
138Available restarts:
139
1401. (RESTART-TOPLEVEL) Go back to Top-Level REPL.
141
142Broken at SWANK-LOADER::HANDLE-SWANK-LOAD-ERROR. In: #<process TOP-LEVEL>.
143 File: #P"/opt/software/slime/swank-loader.lisp" (Position #6091)
144>>
报错的意思是这个 loop
宏形式没有成功展开,看来这个错误得去仔细研究一下 swank-trace-dialog.lisp
中这段代码了,不过暂时没啥时间,而且对 ECL
用得也不多,命令行下的 REPL
就足够用了,暂时留一个小尾巴,等以后有时间了再看。
本文最新版本:http://my.oschina.net/freeblues/blog/496640
==结束==