Bloop integration for Emacs
;;; bloop --- bloop minor mode | |
;; Author: Philipp Fehre <philipp@fehre.co.uk> | |
;; Keywords: scala, bloop, tools, convenience | |
;;; Commentary: | |
;; Helpers to integrate better with bloop, inspired by emacs-bloop | |
;; https://github.com/tues/emacs-bloop/blob/master/bloop.el | |
;; C-c M-j jack-in a bloop project running a new Ammonite REPL buffer | |
;; C-c M-z switch to an active Ammonite REPL | |
;; C-c b c Compile a bloop project backed by projectile-compile-project | |
;; C-c b t Test a bloop project backed by projectile-test-project | |
;; C-c b r Run a bloop project | |
;; Changelog: | |
;; - 25/8/2020 - Added run command mapping bloop-run (C-c b r) | |
;; - 1/5/2020 - initial working version | |
;;; Code: | |
(require 'projectile) | |
(require 'scala-mode) | |
(require 'ammonite-term-repl) | |
(require 's) | |
(defgroup bloop nil | |
"Bloop integration for emacs" | |
:group 'tools | |
:group 'convenience | |
:link '(url-link :tag "Gist" "https://gist.github.com/sideshowcoder/a9b2ceaca38cdf0ea95f29bf0130b171")) | |
(defcustom bloop-program-name "bloop" | |
"Program used to run bloop commands, default to whatever is in the path." | |
:type 'string | |
:group 'bloop) | |
(defcustom bloop-reporter "scalac" | |
"Either bloop or scalac. | |
The main difference is that bloop shows errors in reverse order. | |
Emacs generally assumes the first error in the output is the most | |
relevant so the scalac reporter will most likely be preferred. | |
This is used for test and compile." | |
:type 'string | |
:group 'bloop) | |
(defun bloop--command (&rest args) | |
"Build a bloop command for ARGS." | |
(s-join " " (cons bloop-program-name args))) | |
(defun bloop--available-projects () | |
"Get a list of currently available projects from bloop." | |
(projectile-with-default-dir (projectile-project-root) | |
(let ((projects-string (shell-command-to-string (bloop--command "projects")))) | |
(split-string projects-string)))) | |
(defun bloop-switch-to-ammonite () | |
"Switch to the running Ammonite REPL." | |
(interactive) | |
(if-let ((ammonite-buffer (get-buffer ammonite-term-repl-buffer-name))) | |
(switch-to-buffer ammonite-buffer) | |
(message "Ammonite is not running try C-c M-j to start an Ammonite REPL for bloop."))) | |
(defun bloop-run-ammonite (project) | |
"Run Ammonite for a bloop PROJECT." | |
(interactive (list (completing-read "Run Ammonite REPL for project: " (bloop--available-projects)))) | |
(projectile-with-default-dir (projectile-project-root) | |
(let ((ammonite-term-repl-program bloop-program-name) | |
(ammonite-term-repl-program-args (list "console" project))) | |
(run-ammonite)))) | |
(defun bloop-compile (project) | |
"Compile a bloop PROJECT." | |
(interactive (list (completing-read "Compile bloop project: " (bloop--available-projects)))) | |
(let ((command (bloop--command "compile" project))) | |
(projectile--run-project-cmd command projectile-compilation-cmd-map | |
:show-prompt 't | |
:prompt-prefix "Compile command: " | |
:save-buffers t))) | |
(defun bloop-test (project) | |
"Test a bloop PROJECT." | |
(interactive (list (completing-read "Test bloop project: " (bloop--available-projects)))) | |
(let ((test-command (bloop--command "test" "--reporter" bloop-reporter project))) | |
(projectile--run-project-cmd test-command projectile-test-cmd-map | |
:show-prompt 't | |
:prompt-prefix "Test command: " | |
:save-buffers t))) | |
(defun bloop-run (project) | |
"Run a bloop PROJECT." | |
(interactive (list (completing-read "Run bloop project: " (bloop--available-projects)))) | |
(let ((run-command (bloop--command "run" project))) | |
(projectile--run-project-cmd run-command projectile-run-cmd-map | |
:show-prompt 't | |
:prompt-prefix "Run command: " | |
:save-buffers t))) | |
;;;###autoload | |
(define-minor-mode bloop-mode | |
"Bloop integration for emacs." | |
:lighter " bloop" | |
:keymap (let ((map (make-sparse-keymap))) | |
(define-key map (kbd "C-c M-j") #'bloop-run-ammonite) | |
(define-key map (kbd "C-c M-z") #'bloop-switch-to-ammonite) | |
(define-key map (kbd "C-c b c") #'bloop-compile) | |
(define-key map (kbd "C-c b t") #'bloop-test) | |
(define-key map (kbd "C-c b r") #'bloop-run) | |
map)) | |
;;;###autoload | |
(add-hook 'scala-mode-hook 'bloop-mode) | |
(provide 'bloop) | |
;;; bloop.el ends here |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment