Emacs + Clojure配置的幾個(gè)Tip
Posted on 2012-05-19 00:57 dennis 閱讀(15311) 評(píng)論(11) 編輯 收藏 所屬分類: Clojure 、工具和命令很久沒更新博客了,在北京工作,忙碌并且充實(shí)。目前來(lái)說(shuō),Clojure最好的開發(fā)編輯器應(yīng)該是Emacs + Slime的組合,利用swank-clojure這個(gè)項(xiàng)目,加上clojure-mode,可以完美地運(yùn)行slime。編譯、運(yùn)行、跳轉(zhuǎn)、文檔和引用查看甚至debug都可以搞定。具體配置恕不重復(fù),看swank-clojure的文檔即可自己安裝起來(lái),或者這篇中文博客,windows上配置。
分享幾個(gè)Tip,也期待大家分享你們的使用心得。
首先是自動(dòng)在打開clj后綴文件的時(shí)候啟動(dòng)執(zhí)行clojure-jack-in與slime連接,可以在emacs配置里加上個(gè)callback:
(eval-after-load "clojure-mode"
'(progn
(require 'slime)
(require 'clojure-mode)
(unless (slime-connected-p)
(save-excursion (clojure-jack-in)))))
這樣在打開clj為后綴的文件的時(shí)候,將自動(dòng)啟動(dòng)clojure-mode執(zhí)行clojure-jack-in函數(shù)并且連接slime。'(progn
(require 'slime)
(require 'clojure-mode)
(unless (slime-connected-p)
(save-excursion (clojure-jack-in)))))
將clj后綴的文件自動(dòng)關(guān)聯(lián)到clojure-mode:
(setq auto-mode-alist (cons '("\\.clj$" . clojure-mode) auto-mode-alist))
通常來(lái)說(shuō)如果你是利用marmalade安裝的,會(huì)自動(dòng)關(guān)聯(lián)的。另外,啟動(dòng)自動(dòng)匹配括號(hào)、字符串引號(hào)等的paredit模式一定要啟動(dòng):
(defun paredit-mode-enable () (paredit-mode 1))
(add-hook 'clojure-mode-hook 'paredit-mode-enable)
(add-hook 'clojure-test-mode-hook 'paredit-mode-enable)
(add-hook 'clojure-mode-hook 'paredit-mode-enable)
(add-hook 'clojure-test-mode-hook 'paredit-mode-enable)
在使用clojure-mode或者clojure-test-mode的時(shí)候自動(dòng)啟用paredit模式,括號(hào)再也不是問題。括號(hào)匹配提示一般是開啟的,如果沒有,強(qiáng)制開啟:
;; 顯示括號(hào)匹配
(show-paren-mode t)
(setq show-paren-style 'parentheses)
(show-paren-mode t)
(setq show-paren-style 'parentheses)
slime更多配置,啟用IO重定向(多線程IO輸出都定向到SLIME repl)以及設(shè)置通訊字符編碼等:
(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)))
'(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)))
細(xì)心的朋友可能注意到我注釋了slime-fuzzy-complete的配置,這是一個(gè)支持更好的自動(dòng)補(bǔ)全功能的SLIME插件(可以用縮寫來(lái)自動(dòng)補(bǔ)全),可惜在我機(jī)器上沒有嘗試配置成功,有興趣你可以嘗試下。
在REPL里支持語(yǔ)法高亮,一定要配置上:
(add-hook 'slime-repl-mode-hook
(defun clojure-mode-slime-font-lock ()
(require 'clojure-mode)
(let (font-lock-mode)
(clojure-mode-font-lock-setup))))
(defun clojure-mode-slime-font-lock ()
(require 'clojure-mode)
(let (font-lock-mode)
(clojure-mode-font-lock-setup))))
單獨(dú)在clojure-mode(在其他mode里這些快捷鍵不會(huì)起作用)里配置快捷鍵可以這樣:
(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)))
'(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-/作為自動(dòng)補(bǔ)全的快捷鍵,因?yàn)閙eta鍵在我的Mac機(jī)器上設(shè)置為command鍵,因此自動(dòng)補(bǔ)全的操作習(xí)慣就跟Eclipse類似。而slime-selector是一個(gè)非常有用的函數(shù),用來(lái)跳轉(zhuǎn)到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)
(setq mac-option-key-is-meta nil
mac-command-key-is-meta t
mac-command-modifier 'meta
mac-option-modifier 'none)
最后,期待大家不吝分享你的心得。