很久没更新博客了,在北京工作,忙碌并且充实。目前来说,Clojure最好的开发编辑器应该是Emacs +
Slime的组合,利用
swank-clojure这个项目,加上clojure-mode,可以完美地运行slime。编译、运行、跳转、文档和引用查看甚至
debug都可以搞定。具体配置恕不重复,看swank-clojure的文档即可自己安装起来,或者这篇
中文博客,
windows上配置。
分享几个Tip,也期待大家分享你们的使用心得。
首先是自动在打开clj后缀文件的时候启动执行clojure-jack-in与slime连接,可以在emacs配置里加上个callback:
(eval-after-load "clojure-mode"
'(progn
(require 'slime)
(require 'clojure-mode)
(unless (slime-connected-p)
(save-excursion (clojure-jack-in)))))
这样在打开clj为后缀的文件的时候,将自动启动clojure-mode执行clojure-jack-in函数并且连接slime。
将clj后缀的文件自动关联到clojure-mode:
(setq auto-mode-alist (cons '("\\.clj$" . clojure-mode) auto-mode-alist))
通常来说如果你是利用
marmalade安装的,会自动关联的。
另外,启动自动匹配括号、字符串引号等的paredit模式一定要启动:
(defun paredit-mode-enable () (paredit-mode 1))
(add-hook 'clojure-mode-hook 'paredit-mode-enable)
(add-hook 'clojure-test-mode-hook 'paredit-mode-enable)
在使用clojure-mode或者clojure-test-mode的时候自动启用paredit模式,括号再也不是问题。括号匹配提示一般是开启的,如果没有,强制开启:
;; 显示括号匹配
(show-paren-mode t)
(setq show-paren-style 'parentheses)
slime更多配置,启用IO重定向(多线程IO输出都定向到SLIME repl)以及设置通讯字符编码等:
(eval-after-load "slime"
'(progn
(slime-setup '(slime-repl slime-fuzzy))
;;(setq slime-truncate-lines t)
(setq swank:*globally-redirect-io* t)
;; (setq slime-complete-symbol-function ' slime-fuzzy-complete-symbol)
(setq slime-net-coding-system 'utf-8-unix)))
细心的朋友可能注意到我注释了slime-fuzzy-complete的配置,这是一个支持更好的自动补全功能的SLIME插件(可以用缩写来自动补全),可惜在我机器上没有尝试配置成功,有兴趣你可以尝试下。
在REPL里支持语法高亮,一定要配置上:
(add-hook 'slime-repl-mode-hook
(defun clojure-mode-slime-font-lock ()
(require 'clojure-mode)
(let (font-lock-mode)
(clojure-mode-font-lock-setup))))
单独在clojure-mode(在其他mode里这些快捷键不会起作用)里配置快捷键可以这样:
(eval-after-load "clojure-mode"
'(progn
(require 'slime)
(require 'clojure-mode)
(define-key clojure-mode-map (kbd "M-/") (quote slime-complete-symbol))
(define-key clojure-mode-map (kbd "C-c s") (quote slime-selector)))
例如我这里将M-/作为自动补全的快捷键,因为meta键在我的Mac机器上设置为command键,因此自动补全的操作习惯就跟Eclipse类似。而
slime-selector是一个非常有用的函数,用来跳转到slime的一系列buffer,因此我绑定了C-c s快捷键。
额外一提,在Mac osx下,将command作为meta键:
;;; I prefer cmd key for meta
(setq mac-option-key-is-meta nil
mac-command-key-is-meta t
mac-command-modifier 'meta
mac-option-modifier 'none)
最后,期待大家不吝分享你的心得。