Metals

Metals

  • Docs
  • Blog
  • GitHub

›Text Editors

Text Editors

  • Overview
  • Visual Studio Code
  • Atom
  • Vim
  • Sublime Text
  • Emacs
  • Eclipse

Build Tools

  • Overview
  • Bloop
  • Gradle
  • Maven
  • Mill
  • sbt

Contributing

  • Integrating a new build tool
  • Integrating a new editor
  • Tree View Protocol
  • Project Goals
  • Contributing to Metals
  • Contributing to the website
  • Making a release
Edit

Text Editors

Metals works with the following text editors with varying degree of functionality.

Visual Studio Code Atom Vim Sublime Text 3 Emacs Eclipse
Installation Single click Single click Few steps Few steps Few steps Few steps
Build import ✅ ✅ ✅ ✅ ✅ Requires browser
Diagnostics ✅ ✅ ✅ ✅ ✅ ✅
Goto definition ✅ ✅ ✅ ✅ ✅ ✅
Completions ✅ ✅* ✅* ✅ ✅ ✅
Hover ✅ ✅ ✅ ✅ ✅ ✅
Parameter hints ✅ ✅ ✅ ✅
Find references ✅ ✅ ✅ ✅ ✅ ✅
Document symbols ✅ ✅ Flat Flat ✅ ✅
Workspace symbols ✅ ✅ ✅ ✅
Formatting ✅ ✅ ✅ ✅ ✅ ✅*
Folding ✅ ✅ ✅ ✅
Highlight ✅ ✅ ✅ ✅ ✅ ✅
Metals Extensions ✅ Status bar Status bar Status bar Status bar, Slow task

Metals is a new project with limited features. If you are learning Scala or are looking for a rich IDE experience it is recommended to use IntelliJ instead.

Installation

Single click: Metals is easy to install and requires minimal configuration out-of-the-box.

Few steps: installing Metals requires a few custom steps and minimal configuration to work.

Compile from source: installing Metals requires building an editor plugin from source.

Build import

✅: it is possible to import a build such as an sbt project directly from the editor.

Requires browser: importing a build requires additional steps in a web browser using a localhost server. It is not possible to import a build within the editor.

Diagnostics

✅: Diagnostics are correctly published on compile.

Compile errors are reported as red squiggles in the editor. Compilation is triggered on file save for the build target (project/module) containing the focused text file.

Diagnostics

Known limitations

  • Slow feedback for type errors. Syntax errors are published as you type but type errors are handled by the build tool, meaning diagnostics may take a while to publish for large projects.

Goto definition

Navigate to symbol definitions for project sources and Scala/Java library dependencies.

Symbols are resolved according to the last successful compilation in the build tool and navigation continues to work despite syntax errors in the open unsaved buffer.

Goto Definition

Known limitations

  • Navigation does not work for buffers that do not tokenize, for example due to unclosed string literals.
  • scalameta/scalameta#1802 reflective invocations (methods calls on structural types) do not resolve to a definition.

Completions

✅ Atom: no auto-import and string interpolator completions produce invalid code.

✅ Vim: auto-import and snippets require coc.nvim client.

Use code completions to explore APIs, implement interfaces, generate exhaustive pattern matches and more.

2019-04-12 14 19 39

  • Auto-import: imports are inserted at the bottom of the global import list. Imports still need to be sorted and grouped manually, we are exploring ways to automate this workflow in the future.
  • Override def: implement methods from the super class.
  • Exhaustive match: generate an exhaustive pattern match for sealed types.
  • String interpolator: automatically convert string literals into string interpolators.
  • Filename: complete classnames based on the enclosing file.
  • Documentation: read the docstring for method symbols by pressing ctrl+space in VS Code.

Known limitations

  • completion results don't include symbols that have just been typed in separate files without a successful compilation in the build tool.

Hover (aka. type at point)

See the expression type and symbol signature under the cursor.

  • Expression type: shows the non-generic type of the highlighted expression.
  • Symbol signature: shows the generic signature of symbol under the cursor along with its docstring, if available.

Signature help (aka. parameter hints)

View a method signature and method overloads as you fill in the arguments.

Find references

Find symbol references in project sources. References include implicits, inferred .apply, desugared .flatMap from for comprehensions and other symbols that may not be explicitly written in source, making it possible to discover usages of difficult-to-grep symbols. The Metals navigation index is low-overhead and should only require a few megabytes of memory even for large projects.

Find references

Known limitations

  • References to overridden methods are not included in the results. For example, if you run "find references" on the method Dog.name() then it won't include references to the super method Animal.name().

Document symbols

✅: Document symbols are displayed in a hierarchical outline.

Flat: Document symbols are displayed in a flat outline.

Document Symbols

Workspace symbols

Fuzzy search a symbol in the workspace of library dependencies by its name.

  • All-lowercase queries are treated as case-insensitive searches.
  • Queries ending with a dot . list nested symbols.
  • Queries containing a semicolon ; search library dependencies.

Fuzzy symbol search example

Formatting

Metals uses Scalafmt to respond to formatting requests from the editor, according to the configuration defined in .scalafmt.conf.

Learn how to configure Scalafmt at https://scalameta.org/scalafmt/docs/configuration.html.

✅ Eclipse: .scalafmt.conf must be created manually and the editor will not ask to create .scalafmt.conf if it doesn't exist.

Formatting

Code folding

Fold ranges such as large multi-line expressions, import groups and comments.

Document highlight

Highlight references to the same symbol in the open file.

Package explorer

Browse packages, classes and methods in the workspace and library dependencies using the Metals sidebar. This feature is only implemented in VS Code.

Metals Extensions

Status bar: Editor client implements the metals/status notification.

Tree view: Editor client implements the Tree View Protocol.

Did focus: Editor client implements the metals/didFocus notification.

Slow task: Editor client implements the metals/slowTask request.

Input box: Editor client implements the metals/inputBox request.

Window state: Editor client implements the metals/windowStateDidChange notification.

✅: Editor implements all Metals extension endpoints.

The Metals language server supports custom extensions that are not part of the Language Server Protocol (LSP). These extensions are not necessary for Metals to function but they improve the user experience. To learn more about Metals extensions, see integrating a new editor.

Unsupported features

Metals does not support the following features:

  • Rename symbol
  • Organize imports
  • Run test
  • Debugging
  • Refactoring: move class, extract/inline value, convert to block
Visual Studio Code →
  • Installation
  • Build import
  • Diagnostics
    • Known limitations
  • Goto definition
    • Known limitations
  • Completions
    • Known limitations
  • Hover (aka. type at point)
  • Signature help (aka. parameter hints)
  • Find references
    • Known limitations
  • Document symbols
  • Workspace symbols
  • Formatting
  • Code folding
  • Document highlight
  • Package explorer
  • Metals Extensions
  • Unsupported features
Metals
Overview
Text EditorsBuild ToolsProject GoalsContributing
Editors
Visual Studio CodeAtomVimSublime TextEmacsEclipse
Social
Copyright © 2019 Metals