很久沒更新博客了,在北京工作,忙碌并且充實。目前來說,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)
最后,期待大家不吝分享你的心得。