spacemacs/layers/+lang/clojure/funcs.el
Brandon Adams 3663b29a48
Support optional set-namespace argument to Clojure layer's , s B
The spacemacs analogue of cider-load-buffer-and-switch-to-repl-buffer
doesn't accept an argument to set the namespace while you are switching
to the repl buffer. This adds support for an argument, invokable with
the universal argument, for setting up the namespace as well. This will
eliminate an extra `(in-ns ...)` or `, s n` call as long as you invoke
`, s B` prefixed by the universal argument: `SPC u , s B`.
2020-08-09 11:57:58 +02:00

242 lines
8 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-sexp-end-of-line ()
"Evaluate the last sexp at the end of the current line."
(interactive)
(save-excursion
(end-of-line)
(cider-eval-last-sexp)))
(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)
(with-selected-window (get-buffer-window (cider-current-connection))
(goto-char (point-max))))))
(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 (&optional set-namespace)
"Send the current buffer in the REPL and switch to the REPL in
`insert state'. When set-namespace, also change into the namespace of the buffer."
(interactive "P")
(cider-load-buffer)
(cider-switch-to-repl-buffer set-namespace)
(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-project-tests
"Runs all tests in all project namespaces.")
(defun spacemacs/cider-test-run-ns-tests ()
"Run namespace test."
(interactive)
(cider-load-buffer)
(call-interactively #'cider-test-run-ns-tests))
(defun spacemacs/cider-test-run-loaded-tests ()
"Run loaded tests."
(interactive)
(cider-load-buffer)
(call-interactively #'cider-test-run-loaded-tests))
(defun spacemacs/cider-test-run-project-tests ()
"Run project tests."
(interactive)
(cider-load-buffer)
(call-interactively #'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 (sym-name &optional arg)
"Attempts to jump-to-definition of the symbol-at-point.
If CIDER fails, or not available, falls back to dumb-jump."
(interactive (list (cider-symbol-at-point)))
(if (and (cider-connected-p) (cider-var-info sym-name))
(unless (eq 'symbol (type-of (cider-find-var nil sym-name)))
(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))
(defun spacemacs//clj-repl-wrap-c-j ()
"Dynamically dispatch c-j to company or repl functions."
(interactive)
(if (company-tooltip-visible-p)
(company-select-next)
(cider-repl-next-input)))
(defun spacemacs//clj-repl-wrap-c-k ()
"Dynamically dispatch c-k to company or repl functions."
(interactive)
(if (company-tooltip-visible-p)
(company-select-previous)
(cider-repl-previous-input)))
(defun spacemacs/cider-find-and-clear-repl-buffer ()
"Calls cider-find-and-clear-repl-output interactively with C-u prefix
set so that it clears the whole REPL buffer, not just the output."
(interactive)
(let ((current-prefix-arg '(4)))
(call-interactively 'cider-find-and-clear-repl-output)))