Emacs + Clojure配置的幾個Tip
很久沒更新博客了,在北京工作,忙碌並且充實。目前來說,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。'(progn
(require 'slime)
(require 'clojure-mode)
(unless (slime-connected-p)
(save-excursion (clojure-jack-in)))))
將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)
(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)
(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)))
'(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))))
(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)))
'(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)
(setq mac-option-key-is-meta nil
mac-command-key-is-meta t
mac-command-modifier 'meta
mac-option-modifier 'none)
最後,期待大家不吝分享你的心得
文章轉自莊周夢蝶 ,原文發布時間2012-05-19
最後更新:2017-05-18 20:37:00