在樹莓派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
下,包括舊版本的 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
而後按照上面第二、第3所說的清除相關文件
再次運行
emacs M - - M - x slime clisp
很好,編譯一段時間後,鏈接成功, CLISP
下的 polling
信息消失了!
繼續啓動 CCL
和 SBCL
檢查,所有 ok!看來問題初步獲得瞭解決。
Emacs + Slime + Common Lisp
最好能本身獨立下載安裝,而後花點時間手動配置,不然用默認安裝的話極可能會出現各類奇怪的問題。不過 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
==結束==