我对 Emacs 和 Clojure 都是全新的,并且想设置提示和语法突出显示,类似于这里的视频。我已经安装了:
- Emacs 24.x
- 莱宁根 2.x
- 果酱
...然后在 Emacs 中并通过 Marmalade 安装以下软件包:
- 邪恶的
- clojure 模式
- nrepl
我的大问题是这些主要/次要模式如何相互作用,是否有一种“正确”的方式来设置这些东西?
我的小问题是如何获得漂亮的语法突出显示和代码提示?谢谢!
查看 Emacs Live,它是由 Sam Aaron 创建的完整的 emacs 配置。他对 Clojure 的分配进行了编码,因此这种“包含电池”的设置非常适合 Clojure 编码。
https://github.com/overtone/emacs-live
一旦你克隆了它并按照说明操作,你就可以使用 Clojure、nrepl、git 等等。
我列出了我的设置。有些东西是多余的,因为我有一段时间没有用 Clojure 编写了,但我检查了一下,它仍然有效。
clojure
启动 nrepl。在适当的目录中您可能会遇到一些问题project.clj
,但您应该弄清楚这一点。foo.clj
.nrepl-load-file
顺便说一下,这是将文件加载到劣质进程的规范快捷方式。它适用于 Common Lisp、Python 等。这是设置代码:
(require 'clojure-mode)
(defun set-syntax-parens ()
"highlight []{} etc."
(interactive)
(modify-syntax-entry ?[ "(]")
(modify-syntax-entry ?] ")[")
(modify-syntax-entry ?{ "(}")
(modify-syntax-entry ?} "){"))
(defvar clojure.jars '("clojure-1.3.0.jar"
"swank-clojure-1.4.2.jar"
"clojure-contrib-1.2.0.jar"))
(defvar clojure.jars.d (concat dropbox.d "source/clojure/lib/"))
(defvar clojure.classpath
(apply #'concat
(mapcar (lambda (jar) (concat clojure.jars.d jar path-separator))
clojure.jars)))
(setq clojure.classpath
(concat clojure.classpath
dropbox.d "source/clojure/include/"
path-separator))
;;;###autoload
(defun clojure ()
(interactive)
(nrepl-jack-in))
(defvar clojure-server-cmd
(concat "java -Xss4096k -cp " clojure.classpath " clojure.main &"))
(add-hook 'clojure-mode-hook
(lambda()
(set-syntax-parens)))
(require 'nrepl)
(add-hook 'nrepl-mode-hook
(lambda()
(define-key nrepl-mode-map (kbd "C-l") 'nrepl-clear-buffer)))
这是我最喜欢的 emacs 配置中的操作部分:
(when (not package-archive-contents)
(package-refresh-contents))
;; Add in your own as you wish:
(defvar my-packages '(starter-kit starter-kit-lisp starter-kit-bindings clojure-mode
nrepl auto-complete ac-nrepl org rainbow-delimiters)
"A list of packages to ensure are installed at launch.")
(dolist (p my-packages)
(when (not (package-installed-p p))
(package-install p)))
(require 'ac-nrepl)
(add-hook 'nrepl-mode-hook 'ac-nrepl-setup)
(add-hook 'nrepl-interaction-mode-hook 'ac-nrepl-setup)
(eval-after-load "auto-complete"
'(add-to-list 'ac-modes 'nrepl-mode))
(defun set-auto-complete-as-completion-at-point-function ()
(setq completion-at-point-functions '(auto-complete)))
(add-hook 'auto-complete-mode-hook 'set-auto-complete-as-completion-at-point-function)
(add-hook 'nrepl-mode-hook 'set-auto-complete-as-completion-at-point-function)
(add-hook 'nrepl-interaction-mode-hook 'set-auto-complete-as-completion-at-point-function)
(define-key nrepl-interaction-mode-map (kbd "C-c C-d") 'ac-nrepl-popup-doc)
(add-hook 'prog-mode-hook 'auto-complete-mode)
(add-hook 'nrepl-interaction-mode-hook
'nrepl-turn-on-eldoc-mode)
(add-hook 'nrepl-mode-hook 'paredit-mode)
这会在任何地方打开paredit-mode,虽然这完全值得,但需要一点时间来适应,因为paredit 并让 Clojure 的使用变得更加有趣。至少一旦你掌握了啜饮和呕吐的方法