終極解決方案: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

==結束==

相關文章
相關標籤/搜索