spacemacs/layers/+lang/java/funcs.el
syl20bnr dd85084826 java: multiple backends support
Define multiple dispatch functions for each service:
- spacemacs//java-setup-backend
- spacemacs//java-setup-auto-completion
- spacemacs//java-setup-syntax-checking
- spacemacs//java-setup-spell-checking
- spacemacs//java-setup-eldoc

java: replace ensime-configure-keybindings function by a variable

It's not convenient to have key bindings in funcs.el file, instead of relying
on a function we define a private layer variable java--ensime-modes which
can be updated by other layers using a :pre-config use-package hook.

java: refactor key bindings

- define key bindings for meghanada back-end
- move ensime key bindings documentation from scala layer to java layer
- change SPC m d for daemon to SPC m D (since SPC m d is reserved for debugging)
2017-03-19 12:40:36 -04:00

296 lines
9.4 KiB
EmacsLisp
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; packages.el --- Java functions File for Spacemacs
;;
;; Copyright (c) 2012-2017 Sylvain Benner & Contributors
;;
;; Author: Lukasz Klich <klich.lukasz@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(defun spacemacs//java-define-command-prefixes ()
"Define command prefixes for java-mode."
(setq java/key-binding-prefixes '(("me" . "errors")
("md" . "eclimd")
("mf" . "find")
("mg" . "goto")
("mr" . "refactor")
("mh" . "documentation")
("mm" . "maven")
("ma" . "ant")
("mp" . "project")
("mt" . "test")))
(mapc (lambda(x) (spacemacs/declare-prefix-for-mode
'java-mode (car x) (cdr x)))
java/key-binding-prefixes))
(defun spacemacs//java-setup-backend ()
"Conditionally setup java backend."
(pcase java-backend
(`eclim (spacemacs//java-setup-eclim))
(`ensime (spacemacs//java-setup-ensime))
(`meghanada (spacemacs//java-setup-meghanada))))
(defun spacemacs//java-setup-company ()
"Conditionally setup company based on backend."
(pcase java-backend
(`eclim (spacemacs//java-setup-eclim-company))
(`ensime (spacemacs//java-setup-ensime-company))
(`meghanada (spacemacs//java-setup-meghanada-company))))
(defun spacemacs//java-setup-flycheck ()
"Conditionally setup flycheck based on backend."
(pcase java-backend
(`eclim (spacemacs//java-setup-eclim-flycheck))
(`ensime (spacemacs//java-setup-ensime-flycheck))
(`meghanada (spacemacs//java-setup-meghanada-flycheck))))
(defun spacemacs//java-setup-flyspell ()
"Conditionally setup flyspell based on backend."
(pcase java-backend
(`ensime (spacemacs//java-setup-ensime-flyspell))
(`meghanada (spacemacs//java-setup-meghanada-flyspell))))
(defun spacemacs//java-setup-eldoc ()
"Conditionally setup eldoc based on backend."
(pcase java-backend
(`ensime (spacemacs//java-setup-ensime-eldoc))
(`meghanada (spacemacs//java-setup-meghanada-eldoc))))
;; ensime
(autoload 'ensime-config-find-file "ensime-config")
(autoload 'ensime-config-find "ensime-config")
(autoload 'projectile-project-p "projectile")
(defun spacemacs//java-setup-ensime ()
"Setup ENSIME."
;; jump handler
(add-to-list 'spacemacs-jump-handlers 'ensime-edit-definition)
;; ensure the file exists before starting `ensime-mode'
(cond
((and (buffer-file-name) (file-exists-p (buffer-file-name)))
(ensime-mode))
((buffer-file-name)
(add-hook 'after-save-hook 'ensime-mode nil t))))
(defun spacemacs//java-setup-ensime-company ()
"Setup ENSIME auto-completion.")
(defun spacemacs//java-setup-ensime-flycheck ()
"Setup ENSIME syntax checking.")
(defun spacemacs//java-setup-ensime-flyspell ()
"Setup ENSIME spell checking."
(flyspell-mode)
(setq-local flyspell-generic-check-word-predicate
'spacemacs//ensime-flyspell-verify))
(defun spacemacs//java-setup-ensime-eldoc ()
"Setup ENSIME eldoc."
(setq-local eldoc-documentation-function
(lambda ()
(when (ensime-connected-p)
(ensime-print-type-at-point))))
(eldoc-mode))
(defun spacemacs//ensime-maybe-start ()
(when (buffer-file-name)
(let ((ensime-buffer (spacemacs//ensime-buffer-for-file (buffer-file-name)))
(file (ensime-config-find-file (buffer-file-name)))
(is-source-file (s-matches? (rx (or "/src/" "/test/"))
(buffer-file-name))))
(when (and is-source-file (null ensime-buffer))
(noflet ((ensime-config-find (&rest _) file))
(save-window-excursion
(ensime)))))))
(defun spacemacs//ensime-buffer-for-file (file)
"Find the Ensime server buffer corresponding to FILE."
(let ((default-directory (file-name-directory file)))
(-when-let (project-name (projectile-project-p))
(--first (-when-let (bufname (buffer-name it))
(and (s-contains? "inferior-ensime-server" bufname)
(s-contains? (file-name-nondirectory project-name)
bufname)))
(buffer-list)))))
(defun spacemacs//ensime-flyspell-verify ()
"Prevent common flyspell false positives in scala-mode."
(and (flyspell-generic-progmode-verify)
(not (s-matches? (rx bol (* space) "package") (current-line)))))
;; interactive functions
(defun spacemacs/ensime-gen-and-restart()
"Regenerate `.ensime' file and restart the ensime server."
(interactive)
(progn
(sbt-command ";ensimeConfig;ensimeConfigProject")
(ensime-shutdown)
(ensime)))
(defun spacemacs/ensime-inf-eval-buffer-switch ()
"Send buffer content to shell and switch to it in insert mode."
(interactive)
(ensime-inf-eval-buffer)
(ensime-inf-switch)
(evil-insert-state))
(defun spacemacs/ensime-inf-eval-region-switch (start end)
"Send region content to shell and switch to it in insert mode."
(interactive "r")
(ensime-inf-switch)
(ensime-inf-eval-region start end)
(evil-insert-state))
(defun spacemacs/ensime-refactor-accept ()
(interactive)
(funcall continue-refactor)
(ensime-popup-buffer-quit-function))
(defun spacemacs/ensime-refactor-cancel ()
(interactive)
(funcall cancel-refactor)
(ensime-popup-buffer-quit-function))
(defun spacemacs/ensime-completing-dot ()
"Insert a period and show company completions."
(interactive "*")
(when (s-matches? (rx (+ (not space)))
(buffer-substring (line-beginning-position) (point)))
(delete-horizontal-space t))
(company-abort)
(insert ".")
(company-complete))
(defun spacemacs/ensime-yank-type-at-point ()
"Yank to kill ring and print short type name at point to the minibuffer."
(interactive)
(ensime-type-at-point t nil))
(defun spacemacs/ensime-yank-type-at-point-full-name ()
"Yank to kill ring and print full type name at point to the minibuffer."
(interactive)
(ensime-type-at-point t t))
;; eclim
(defun spacemacs//java-setup-eclim ()
"Setup Eclim."
;; jump handler
(add-to-list 'spacemacs-jump-handlers '(eclim-java-find-declaration :async t))
;; enable eclim
(eclim-mode))
(defun spacemacs//java-setup-eclim-company ()
"Setup Eclim auto-completion."
(spacemacs|add-company-backends
:backends company-emacs-eclim
:modes eclim-mode
:hooks nil)
;; call manualy generated functions by the macro
(spacemacs//init-company-eclim-mode)
(set (make-variable-buffer-local 'company-idle-delay) 0.5)
(set (make-variable-buffer-local 'company-minimum-prefix-length) 1)
(company-mode))
(defun spacemacs//java-setup-eclim-flycheck ()
"Setup Eclim syntax checking."
(flycheck-eclim-setup)
(setq eclim-autoupdate-problems nil)
;; check syntax only when save
(set (make-local-variable 'flycheck-check-syntax-automatically)
'(save))
(flycheck-mode))
(defun spacemacs//java-eclim-save-buffer-no-flycheck (&rest args)
"Save buffer without triggering flycheck."
(when (buffer-modified-p)
(let ((backup-inhibited t)
flycheck-check-syntax-automatically
auto-save-default)
(save-buffer 0))))
(defun spacemacs/java-eclim-completing-dot ()
"Insert a period and show company completions."
(interactive "*")
(spacemacs//java-delete-horizontal-space)
(insert ".")
(company-emacs-eclim 'interactive))
(defun spacemacs/java-eclim-completing-double-colon ()
"Insert double colon and show company completions."
(interactive "*")
(spacemacs//java-delete-horizontal-space)
(insert ":")
(let ((curr (point)))
(when (s-matches? (buffer-substring (- curr 2) (- curr 1)) ":")
(company-emacs-eclim 'interactive))))
;; meghanada
(defun spacemacs//java-setup-meghanada ()
"Setup Meghanada."
(require 'meghanada)
;; jump handler
(add-to-list 'spacemacs-jump-handlers
'(meghanada-jump-declaration
:async spacemacs//java-meghanada-server-livep))
;; auto-install meghanada server
(let ((dest-jar (meghanada--locate-server-jar)))
(unless dest-jar
(meghanada-install-server)))
;; enable meghanada
(meghanada-mode))
(defun spacemacs//java-setup-meghanada-company ()
"Setup Meghanada auto-completion."
(meghanada-company-enable))
(defun spacemacs//java-setup-meghanada-flycheck ()
"Setup Meghanada syntax checking."
(spacemacs/add-flycheck-hook 'java-mode)
(require 'flycheck-meghanada)
(add-to-list 'flycheck-checkers 'meghanada)
(flycheck-mode))
(defun spacemacs//java-setup-meghanada-flyspell ()
"Setup Meghanada spell checking.")
(defun spacemacs//java-setup-meghanada-eldoc ()
"Setup Meghanada eldoc.")
(defun spacemacs//java-meghanada-server-livep ()
"Return non-nil if the Meghanada server is up."
(and meghanada--client-process (process-live-p meghanada--client-process)))
;; Maven
(defun spacemacs/java-maven-test ()
(interactive)
(eclim-maven-run "test"))
(defun spacemacs/java-maven-clean-install ()
(interactive)
(eclim-maven-run "clean install"))
(defun spacemacs/java-maven-install ()
(interactive)
(eclim-maven-run "install"))
;; Misc
(defun spacemacs//java-delete-horizontal-space ()
(when (s-matches? (rx (+ (not space)))
(buffer-substring (line-beginning-position) (point)))
(delete-horizontal-space t)))