终极解决方案:Emacs+Slime+Lisp启动错误:Polling /tmp/slime.50
2019獨角獸企業重金招聘Python工程師標準>>>
終極解決方案:Emacs+Slime+Lisp啟動錯誤:Polling "/tmp/slime.5000 .. 25 (Abort with 'M-x slime-abort-connection'.) [730 times]"
目錄
- 問題描述
- 嘗試搜索無果
- 自力更生研究報錯信息
- 問題解決方案
- ECL的小尾巴
問題描述
在樹莓派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 -f4、因為使用自動安裝,導致缺少 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 -fcd ~/.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
總結
以上是生活随笔為你收集整理的终极解决方案:Emacs+Slime+Lisp启动错误:Polling /tmp/slime.50的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软牛津计划介绍——屌爆了的自然数据处理
- 下一篇: GPU/DRM 简介