让 Lispbox 中的 Slime 交互开发环境支持中文文件(load 和 compile 带有中文字符的 LISP 源代码)
前几天在网上搜到一些设置方法,主要是如何让 LISP 识别中文,可以在 EVAL 中输入中文,但是对于使用EMACS的开发者来说,很多时候需要在LISP代码里使用中文,然后直接 compile 带有中文的源代码(EMACS下的快捷键是 C-c C-c),有时需要 load 这些带有中文符号的源代码,以上两种场景基本没有成功过,都是无法识别。(EMACS下的快捷键是 C-c C-l)
这个问题困扰了我一个礼拜,因为之前从来没有使用过 EMACS,所以尽管知道问题的根源应该是 EMACS 在打开文件时默认使用的编解码是 ISO-8859-1 ,但是不清楚在什么地方修改这个设置,找了很久的资料也没查到有设置方法,所以只能在代码里去找,但是 lispbox 总共包括了 EMACS、SLIME、CCL 和 QUICKLISP 四个部分,QUICKLISP应该没什么关系,前三个的代码都是一大堆....凄惨。
经过一番努力,尝试弄清楚 LISPBOX 的调用机制,而且在此期间还学会了自己更换新版本的SLIME和CCL--意外的收获。
终于,努力在今天得到了回报!
大量相关代码翻阅一遍后今天终于找到如何让这几个命令携带指定的参数值的方法,说起来也很简单:只需要修改 slime 目录(我的是 F:\lispbox-0.9\slime-2012-11-13\ )下的 slime.el 文件中的键图映射代码,涉及4个命令: slime-load-file slime-compile-and-load-file slime-compile slime-compile-defun 在这些命令后加个参数 :external-format :utf-8 ,指定使用 UTF-8 就可以了,具体代码如下:(defvar slime-prefix-bindings '(("\C-r" slime-eval-region) (":" slime-interactive-eval) ("\C-e" slime-interactive-eval) ("E" slime-edit-value) ("\C-l" slime-load-file :external-format :utf-8) ("\C-b" slime-interrupt) ("\M-d" slime-disassemble-symbol) ("\C-t" slime-toggle-trace-fdefinition) ("I" slime-inspect) ("\C-xt" slime-list-threads) ("\C-xn" slime-cycle-connections) ("\C-xc" slime-list-connections) ("<" slime-list-callers) (">" slime-list-callees) ;; Include DOC keys... ("\C-d" slime-doc-map) ;; Include XREF WHO-FOO keys... ("\C-w" slime-who-map) ))
(defvar slime-keys '( ;; Compiler notes ("\M-p" slime-previous-note) ("\M-n" slime-next-note) ("\C-c\M-c" slime-remove-notes) ("\C-c\C-k" slime-compile-and-load-file :external-format :utf-8) ("\C-c\M-k" slime-compile-file :external-format :utf-8) ("\C-c\C-c" slime-compile-defun :external-format :utf-8)))
如果是在EVAL下使用 load 函数,也需要加上额外的参数,如下所示:
(load "cnfile.lisp" :external-format :utf-8)
所有涉及文件打开操作的函数都有这个参数,比如 open 和 with-open-file 函数,使用形式如下所示:
(open "cnfile.lisp" :external-format :utf-8)(with-open-file :external-format :utf-8)