终极解决方案:Emacs+Slime+Lisp启动错误:Polling "/tmp/slime.50

终极解决方案: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 下,包括旧版本的 slimecl-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/ 下的文件,优先级我现在也记不太清楚了,所以导致我们修改了的文件配置在加载时被系统的默认配置给覆盖了,于是我们的配置就没起作用。

现在为了保证不会有多个修改源,后面下载回来的 slimecl-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 信息消失了!

继续启动 CCLSBCL 检查,全部 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

==结束==

转载于:https://my.oschina.net/freeblues/blog/496640

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值