spacemacs/layers/+lang/clojure/funcs.el
yuhan0 f13f99d967 Enable clojure-mode refactorings without clj-refactor
- Add clojure-mode refactorings and which-key prefixes in default layer
configuration.

- Improve discoverability of the refactoring features which are not enabled
by default. When clj-refactor is installed, "SPC mr?" runs
cljr-describe-refactoring

- Refactor out repeated dolist clauses into `forall-clojure-modes` macro
which executes body forms for all clojure derived modes, and adds missing
functionality of parinfer, fancify-symbols and evil-cleverparens to
cider-repl-mode and cider-clojure-interaction-mode.
2018-11-16 19:51:21 +00:00

212 lines
6.9 KiB
EmacsLisp

;;; funcs.el --- Clojure Layer functions File for Spacemacs
;;
;; Copyright (c) 2012-2018 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(defun clojure/fancify-symbols (mode)
"Pretty symbols for Clojure's anonymous functions and sets,
like (λ [a] (+ a 5)), ƒ(+ % 5), and ∈{2 4 6}."
(font-lock-add-keywords mode
`(("(\\(fn\\)[[[:space:]]"
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "λ")
nil)))
("(\\(partial\\)[[[:space:]]"
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "Ƥ")
nil)))
("(\\(comp\\)[[[:space:]]"
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "")
nil)))
("\\(#\\)("
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "ƒ")
nil)))
("\\(#\\){"
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "")
nil))))))
(defun spacemacs//cider-eval-in-repl-no-focus (form)
"Insert FORM in the REPL buffer and eval it."
(while (string-match "\\`[ \t\n\r]+\\|[ \t\n\r]+\\'" form)
(setq form (replace-match "" t t form)))
(with-current-buffer (cider-current-connection)
(let ((pt-max (point-max)))
(goto-char pt-max)
(insert form)
(indent-region pt-max (point))
(cider-repl-return))))
(defun spacemacs/cider-send-last-sexp-to-repl ()
"Send last sexp to REPL and evaluate it without changing
the focus."
(interactive)
(spacemacs//cider-eval-in-repl-no-focus (cider-last-sexp)))
(defun spacemacs/cider-send-last-sexp-to-repl-focus ()
"Send last sexp to REPL and evaluate it and switch to the REPL in
`insert state'."
(interactive)
(cider-insert-last-sexp-in-repl t)
(evil-insert-state))
(defun spacemacs/cider-send-region-to-repl (start end)
"Send region to REPL and evaluate it without changing
the focus."
(interactive "r")
(spacemacs//cider-eval-in-repl-no-focus
(buffer-substring-no-properties start end)))
(defun spacemacs/cider-send-region-to-repl-focus (start end)
"Send region to REPL and evaluate it and switch to the REPL in
`insert state'."
(interactive "r")
(cider-insert-in-repl
(buffer-substring-no-properties start end) t)
(evil-insert-state))
(defun spacemacs/cider-send-function-to-repl ()
"Send current function to REPL and evaluate it without changing
the focus."
(interactive)
(spacemacs//cider-eval-in-repl-no-focus (cider-defun-at-point)))
(defun spacemacs/cider-send-function-to-repl-focus ()
"Send current function to REPL and evaluate it and switch to the REPL in
`insert state'."
(interactive)
(cider-insert-defun-in-repl t)
(evil-insert-state))
(defun spacemacs/cider-send-ns-form-to-repl ()
"Send buffer's ns form to REPL and evaluate it without changing
the focus."
(interactive)
(spacemacs//cider-eval-in-repl-no-focus (cider-ns-form)))
(defun spacemacs/cider-send-ns-form-to-repl-focus ()
"Send ns form to REPL and evaluate it and switch to the REPL in
`insert state'."
(interactive)
(cider-insert-ns-form-in-repl t)
(evil-insert-state))
(defun spacemacs/cider-send-buffer-in-repl-and-focus ()
"Send the current buffer in the REPL and switch to the REPL in
`insert state'."
(interactive)
(cider-load-buffer)
(cider-switch-to-repl-buffer)
(evil-insert-state))
(defun spacemacs/cider-test-run-focused-test ()
"Run test around point."
(interactive)
(cider-load-buffer)
(cider-test-run-test))
(defalias 'spacemacs/cider-test-run-all-tests #'spacemacs/cider-test-run-ns-tests
"ns tests are not actually *all* tests;
cider-test-run-project-tests would be better here, but
there currently is a bug with the function. Replace once
it gets fixed.")
(defun spacemacs/cider-test-run-ns-tests ()
"Run namespace test."
(interactive)
(cider-load-buffer)
(cider-test-run-ns-tests nil))
(defun spacemacs/cider-test-run-loaded-tests ()
"Run loaded tests."
(interactive)
(cider-load-buffer)
(cider-test-run-loaded-tests))
(defun spacemacs/cider-test-run-project-tests ()
"Run project tests."
(interactive)
(cider-load-buffer)
(cider-test-run-project-tests))
(defun spacemacs/cider-test-rerun-failed-tests ()
"Rerun failed tests."
(interactive)
(cider-load-buffer)
(cider-test-rerun-failed-tests))
(defun spacemacs/cider-display-error-buffer (&optional arg)
"Displays the *cider-error* buffer in the current window.
If called with a prefix argument, uses the other-window instead."
(interactive "P")
(let ((buffer (get-buffer cider-error-buffer)))
(when buffer
(funcall (if (equal arg '(4))
'switch-to-buffer-other-window
'switch-to-buffer)
buffer))))
(defun spacemacs/cider-toggle-repl-pretty-printing ()
"Toggle REPL pretty printing on and off."
(interactive)
(setq cider-repl-use-pretty-printing
(if cider-repl-use-pretty-printing nil t))
(message "Cider REPL pretty printing: %s"
(if cider-repl-use-pretty-printing "ON" "OFF")))
(defun spacemacs/cider-toggle-repl-font-locking ()
"Toggle font locking in REPL."
(interactive)
(setq cider-repl-use-clojure-font-lock
(if cider-repl-use-pretty-printing nil t))
(message "Cider REPL clojure-mode font-lock: %s"
(if cider-repl-use-clojure-font-lock "ON" "OFF")))
(defun spacemacs/cider-debug-setup ()
"Initialize debug mode."
(when (memq dotspacemacs-editing-style '(hybrid vim))
(evil-make-overriding-map cider--debug-mode-map 'normal)
(evil-normalize-keymaps)))
(defun spacemacs/clj-find-var ()
"Attempts to jump-to-definition of the symbol-at-point. If CIDER fails, or not available, falls back to dumb-jump"
(interactive)
(let ((var (cider-symbol-at-point)))
(if (and (cider-connected-p) (cider-var-info var))
(unless (eq 'symbol (type-of (cider-find-var nil var)))
(dumb-jump-go))
(dumb-jump-go))))
(defun spacemacs/clj-describe-missing-refactorings ()
"Inform the user to add clj-refactor to configuration"
(interactive)
(with-help-window (help-buffer)
(princ "The package clj-refactor is disabled by default.
To enable it, add the following variable to the clojure layer
in your Spacemacs configuration:
dotspacemacs-configuration-layers
'(...
(clojure :variables
clojure-enable-clj-refactor t)
) ")))
(defmacro spacemacs|forall-clojure-modes (m &rest body)
"Executes BODY with M bound to all clojure derived modes."
(declare (indent 1))
`(dolist (,m '(clojure-mode
clojurec-mode
clojurescript-mode
clojurex-mode
cider-repl-mode
cider-clojure-interaction-mode))
,@body))