终极解决方案: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 区出现以下错误,很难链接成功:html

Polling "/tmp/slime.5000 .. 25 (Abort with 'M-x slime-abort-connection'.) [730 times]

尝试搜索无果

搜到几种解决办法,可是貌似都不起做用linux

主要参考此文:[Emacs slime mini buffer take-over] (http://stackoverflow.com/questions/15141617/emacs-slime-mini-buffer-take-over),其中有人提供了4种解决办法,不过貌似都不起做用git

一、在 ~/.emacs.d/ 目录下新建 tmp 目录,并在 .emacs 中增长设置:github

(setq temporary-file-directory "/tmp")

二、清除掉 ~/.cache/common-lisp/app

三、进入 slime 安装目录下的 /slime/contrib,删除其中的 elc 文件socket

cd /path/slime/contrib
find ./ -name '*.elc' | xargs rm -f

四、由于使用自动安装,致使缺乏 swank-loader.lisp,手动下载将其拷贝到 slime 的对应目录下,具体描述以下:oop

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.

自力更生研究报错信息

看来取巧的办法是不存在的,最终仍是得靠本身研究,先看看错误信息提示:gitlab

(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 文件里的这个配置行:post

;; 设置 slime 加载目录                                                                                                              
(add-to-list 'load-path "/opt/software/slime/")

恩,貌似有些明白了,上面的那个轮询提示是由于 slime 链接不到 swank 上,那么为何链接不上?CCL 提示 slime 版本跟 swank 版本不一致(目前看来,仍是 CCL 链接 slime 的错误提示最彻底)。this

在个人环境中 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

而后按照上面第二、第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

==结束==

相关文章
相关标签/搜索