From e2d9e32e92e49a777b4a486f65b950c0948d0c91 Mon Sep 17 00:00:00 2001 From: Rodolfo Hansen Date: Fri, 26 Apr 2019 12:34:11 +0200 Subject: [PATCH] Add lsp-scala and metals as a language backend for scala --- CHANGELOG.develop | 2 ++ layers/+lang/scala/README.org | 41 +++++++++++++++++++++--- layers/+lang/scala/config.el | 11 +++++-- layers/+lang/scala/funcs.el | 12 +++++++ layers/+lang/scala/img/scalameta.png | Bin 0 -> 7021 bytes layers/+lang/scala/layers.el | 2 +- layers/+lang/scala/packages.el | 46 +++++++++++++++++++++------ 7 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 layers/+lang/scala/img/scalameta.png diff --git a/CHANGELOG.develop b/CHANGELOG.develop index 10f56072f..5e5230f45 100644 --- a/CHANGELOG.develop +++ b/CHANGELOG.develop @@ -2430,6 +2430,8 @@ Other: - Evilify =ensime= search in insert/normal mode (thanks to Diego Alvarez) - Remove duplicated code (thanks to Tetsuro Takemoto) - Added ENSIME jump handlers (thanks to Joao Azevedo) +- Added scala-lsp and metals as an additional backend for scala + (thanks to Rodolfo Hansen) **** Scheme - Added missing =parinfer= package declaration (thanks to Kalle Lindqvist) - Update install docs for Chicken 5 changes (thanks to Grant Shangreaux) diff --git a/layers/+lang/scala/README.org b/layers/+lang/scala/README.org index d9c6c9e87..1ad890815 100644 --- a/layers/+lang/scala/README.org +++ b/layers/+lang/scala/README.org @@ -8,7 +8,9 @@ - [[#description][Description]] - [[#features][Features:]] - [[#layer-installation][Layer Installation]] -- [[#ensime][Ensime]] +- [[#backends][Backends]] + - [[#ensime][Ensime]] + - [[#metals][Metals]] - [[#scalastyle][Scalastyle]] - [[#use-java-doc-style][Use Java doc-style]] - [[#automatically-show-the-type-of-the-symbol-under-the-cursor][Automatically show the type of the symbol under the cursor]] @@ -22,6 +24,7 @@ This layer adds support for the Scala language to Spacemacs. ** Features: - Syntax highlighting +- Support for language backend. Either using [[https://ensime.github.io/][ENSIME]] or [[https://scalameta.org/metals/][Metals]] - Auto-completion - Syntax-checking - Refactoring @@ -31,7 +34,6 @@ This layer adds support for the Scala language to Spacemacs. - Eldoc integration - Test execution directly from Emacs - Automatic replacement of ASCII arrows with unicode ones -- Automatic starting/stopping of [[https://ensime.github.io/][ENSIME]] IDE server * Layer Installation To use this configuration layer, add it to your =~/.spacemacs=. You will need to @@ -46,7 +48,20 @@ version (Stable). Please add the following lines to =dotspacemacs/user-init=: (add-to-list 'package-pinned-packages '(ensime . "melpa-stable")) #+END_SRC -* Ensime +* Backends +The currently supported language backends are: +- scala-ensime (default) +- scala-metals + +To set your choice of backend, configure the layer variable =scala-backend=. + +#+BEGIN_SRC emacs-lisp + (setq-default dotspacemacs-configuration-layers + '((scala :variables scala-backend 'scala-ensime))) ;or 'scala-metals +#+END_SRC + + +** Ensime [[https://ensime.github.io/][ENSIME]] provides IDE-like features, such as refactoring, incremental compilation and project-wide type-checking. @@ -57,6 +72,22 @@ list) to generate these files. Installation instructions and usage can be found in the =Java= layer [[https://github.com/syl20bnr/spacemacs/tree/develop/layers/%2Blang/java/README.org#ensime][README.org]]. +** Metals +Currently, you must manually install the metals server. It is possible to do so via coursier; the latest version can be built using the following commands: + +#+BEGIN_SRC bash +./coursier bootstrap \ + --java-opt -Xss4m \ + --java-opt -Xms100m \ + --java-opt -Dmetals.client=emacs \ + org.scalameta:metals_2.12:0.5.1 \ + -r bintray:scalacenter/releases \ + -r sonatype:snapshots \ + -o /usr/local/bin/metals-emacs -f +#+END_SRC + +You will then have the common LSP keybindings; see http://develop.spacemacs.org/layers/+tools/lsp/README.html#key-bindings for more details. + * Scalastyle [[http://www.scalastyle.org/][Scalastyle]] provides style-checking and linting. The Emacs functionality is provided by Flycheck. @@ -128,12 +159,12 @@ the ascii arrows back. #+END_SRC * Auto-start -If you prefer to have Ensime start when you load a scala file, you can enable it +If you prefer to have the backend start when you load a scala file, you can enable it with #+BEGIN_SRC emacs-lisp (setq-default dotspacemacs-configuration-layers '( - (scala :variables scala-auto-start-ensime t))) + (scala :variables scala-auto-start-backend t))) #+END_SRC * Key bindings diff --git a/layers/+lang/scala/config.el b/layers/+lang/scala/config.el index da1e38b52..e6d089ac7 100644 --- a/layers/+lang/scala/config.el +++ b/layers/+lang/scala/config.el @@ -20,5 +20,12 @@ (defvar scala-use-unicode-arrows nil "If non-nil then `->`, `=>` and `<-` are replaced with unicode arrows.") -(defvar scala-auto-start-ensime nil - "If non nil then ensime will be started when a scala file is opened.") +(defconst scala-backends '(scala-ensime scala-metals) + "Backend server implementation to enable advanced IDE language features") + +(defvar scala-backend 'scala-ensime + "Backend used to trigger IDE language features. +`scala-ensime' or `scala-metals' are currently supported") + +(defvar scala-auto-start-backend nil + "If non nil then ensime/metals will be started when a scala file is opened.") diff --git a/layers/+lang/scala/funcs.el b/layers/+lang/scala/funcs.el index e08a1aedc..914d56374 100644 --- a/layers/+lang/scala/funcs.el +++ b/layers/+lang/scala/funcs.el @@ -14,9 +14,21 @@ (spacemacs//java-setup-ensime) (add-to-list 'spacemacs-jump-handlers-scala-mode 'ensime-edit-definition)) +(defun spacemacs//scala-setup-metals () + "Setup LSP metals for Scala." + (setq-local lsp-prefer-flymake nil)) + (defun spacemacs//scala-disable-flycheck-scala () (push 'scala flycheck-disabled-checkers)) +(defun spacemacs//scala-backend-ensime-p () + "Return true if the selected backend is ensime" + (eq scala-backend 'scala-ensime)) + +(defun spacemacs//scala-backend-metals-p () + "Return true if the selected backend is metals" + (eq scala-backend 'scala-metals)) + (defun spacemacs/scala-join-line () "Adapt `scala-indent:join-line' to behave more like evil's line join. diff --git a/layers/+lang/scala/img/scalameta.png b/layers/+lang/scala/img/scalameta.png new file mode 100644 index 0000000000000000000000000000000000000000..12842e8a2528cf5912956151ad1bce52f904eac4 GIT binary patch literal 7021 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