Last active
October 10, 2021 18:54
-
-
Save sideshowcoder/a9b2ceaca38cdf0ea95f29bf0130b171 to your computer and use it in GitHub Desktop.
Bloop integration for Emacs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;; bloop --- bloop minor mode | |
;; Author: Philipp Fehre <[email protected]> | |
;; 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