Я не знаю ни одного способа, чтобы базовый REPL Clojure, запускаемый чем-то вроде java -cp clojure.jar clojure.main
, делал подсветку синтаксиса. Однако, если вы используете Emacs & SLIME (среда разработки, которую выбирает большая часть сообщества Clojure!), Вы можете использовать синтаксис подсветки SLIME REPL, как clojure-mode
делает.
Во-первых, вам нужно поднять некоторый код из функции clojure-mode
(определенной в верхней части clojure-mode.el
):
;;; all code in this function lifted from the clojure-mode function
;;; from clojure-mode.el
(defun clojure-font-lock-setup ()
(interactive)
(set (make-local-variable 'lisp-indent-function)
'clojure-indent-function)
(set (make-local-variable 'lisp-doc-string-elt-property)
'clojure-doc-string-elt)
(set (make-local-variable 'font-lock-multiline) t)
(add-to-list 'font-lock-extend-region-functions
'clojure-font-lock-extend-region-def t)
(when clojure-mode-font-lock-comment-sexp
(add-to-list 'font-lock-extend-region-functions
'clojure-font-lock-extend-region-comment t)
(make-local-variable 'clojure-font-lock-keywords)
(add-to-list 'clojure-font-lock-keywords
'clojure-font-lock-mark-comment t)
(set (make-local-variable 'open-paren-in-column-0-is-defun-start) nil))
(setq font-lock-defaults
'(clojure-font-lock-keywords ; keywords
nil nil
(("+-*/.<>=!?$%_&~^:@" . "w")) ; syntax alist
nil
(font-lock-mark-block-function . mark-defun)
(font-lock-syntactic-face-function
. lisp-font-lock-syntactic-face-function))))
Затем добавьте его к slime-repl-mode-hook
:
(add-hook 'slime-repl-mode-hook
(lambda ()
(font-lock-mode nil)
(clojure-font-lock-setup)
(font-lock-mode t)))
Et voilà, при следующем подключении к SLIME REPL будет доступна подсветка синтаксиса clojure-mode
. Если вы используете SLIME и для Common Lisp, вам нужно настроить его так, чтобы он не пытался делать подсветку Clojure с помощью CL. Кроме того, это только первое приближение; одна из разновидностей прерываний - подсвечивание подсказки (вещь namespace>
больше не будет подсвечиваться). Хотя я не опытный font-lock
хакер, если уж на то пошло воображение, поэтому я оставлю это на этом. : -)