Elm Language Server

Language server implementation for Elm
Alternatives To Elm Language Server
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Language Server Protocol9,928
10 hours ago239cc-by-4.0HTML
Defines a common protocol for language servers.
Nvim Lspconfig8,095
a day ago57apache-2.0Lua
Quickstart configs for Nvim LSP
a month ago75gpl-3.0Emacs Lisp
A client for Language Server Protocol servers
Vscode Java1,927
16 hours ago838epl-2.0TypeScript
Java Language Support for Visual Studio Code
Kotlin Language Server1,287
10 days ago1March 10, 2021168mitKotlin
Kotlin code completion, linting and more for any editor/IDE using the Language Server Protocol
5 days ago9October 23, 202229gpl-3.0Rust
An implementation of the Language Server Protocol for LaTeX
Vim Lsp Settings1,146
4 days ago78mitVim Script
Auto configurations for Language Server for vim-lsp
Go Langserver1,1139172 years ago7August 24, 202160mitGo
Go language server to add Go support to editors and other tools that use the Language Server Protocol (LSP)
Language Tools1,0733,6432 days ago231September 19, 2023230mitTypeScript
The Svelte Language Server, and official extensions which use it
Php Language Server1,0612612 years ago64November 13, 2018267iscPHP
PHP Implementation of the VS Code Language Server Protocol 🆚↔🖥
Alternatives To Elm Language Server
Select To Compare

Alternative Project Comparisons


Matrix Build Status Open in Visual Studio Code

Packaging status

This is the language server implementation for the Elm programming language.

Table of Contents


Note for VSCode users: The plugin contains the language-server. No installation necessary.

The server can be installed via npm (or from source).

npm install -g @elm-tooling/elm-language-server

Then, you should be able to run the language server with the following command:


You might need to use this, if your using powershell:


Follow the instructions below to integrate the language server into your editor.

Alternative: Compile and install from source

First, clone this repo and compile it. npm link will add elm-language-server to the PATH.

git clone [email protected]:elm-tooling/elm-language-server.git
cd elm-language-server
npm install
npm run compile
npm link

Alternative: Install with Nix

elm-languager-server and its dependencies are available in nixpkgs.

nix-env -i -A nixpkgs.elmPackages.elm-language-server


You will need to install elm and elm-test to get all diagnostics and elm-format for formatting. Alternatively you can also just install these to your local npm package.json.

npm install -g elm elm-test elm-format

If you want to use elm-review:

npm install -g elm-review

Or use local versions from your node_modules directory, if you want to do that you need to set the paths, via the settings (e.g. set elmPath to ./node_modules/.bin/elm).


We used to have a file called elm-tooling.json where you could specifiy "entrypoints". Thats not needed anymore the language server finds the entrypoints automatically.

If all you had in elm-tooling.json was "entrypoints", you can safely remove that file.

Currently, no configuration at all is needed.


The Elm Language Server has built-in support for linting. Check out the documentation for configuring the linter.


Supports Elm 0.19 and up

Feature Description
diagnostics Provided via elm, elm-test and our own type inference and linter
formatting Provided via elm-format and post-processed to only return a diff of changes. This way it should not be as intrusive as running elm-format normal
codeLenses Currently only shows if a type alias, custom type or function is exposed from that module
completions Show completions for the current file and snippets
definitions Enables you to jump to the definition of a type alias, module, custom type or function
documentSymbols Identifies all symbols in a document.
folding Let's you fold the code on certain Elm constructs
hover Shows type annotations and documentation for a type alias, module, custom type or function
linkedEditing Enables auto renaming a function name when the type annotation name is edited, or vice versa
references Lists all references to a type alias, module, custom type or function
rename Enables you to rename a type alias, module, custom type or function
workspaceSymbols Identifies all symbols in the current workspace
selectionRange Enables navigation by selectionRange (extend selection for e.g.)

Server Settings

This server contributes the following settings:

  • elmLS.trace.server: Enable/disable trace logging of client and server communication
  • elmLS.elmPath: The path to your elm executable. Should be empty by default, in that case it will assume the name and try to first get it from a local npm installation or a global one. If you set it manually it will not try to load from the npm folder.
  • elmLS.elmReviewPath: The path to your elm-review executable. Should be empty by default, in that case it will assume the name and try to first get it from a local npm installation or a global one. If you set it manually it will not try to load from the npm folder.
  • elmLS.elmReviewDiagnostics: Configure linting diagnostics from elm-review. Possible values: off, warning, error.
  • elmLS.elmFormatPath: The path to your elm-format executable. Should be empty by default, in that case it will assume the name and try to first get it from a local npm installation or a global one. If you set it manually it will not try to load from the npm folder.
  • elmLS.elmTestPath: The path to your elm-test executable. Should be empty by default, in that case it will assume the name and try to first get it from a local npm installation or a global one. If you set it manually it will not try to load from the npm folder.
  • elmLS.disableElmLSDiagnostics: Enable/Disable linting diagnostics from the language server.
  • elmLS.skipInstallPackageConfirmation: Skip confirmation for the Install Package code action.
  • elmLS.onlyUpdateDiagnosticsOnSave: Only update compiler diagnostics on save, not on document change.

Settings may need a restart to be applied.

Editor Support

Editor Diagnostics Formatting Code Lenses Completions Definitions Document Symbols Folding Hover Linked Editing References Rename Workspace Symbols
VSCode ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
VIM CoC ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
VIM LanguageClient ✔️ ✔️ ✔️
VIM ALE ✔️ ✔️ ✔️ ✔️ ✔️
Kakoune ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Emacs ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Sublime ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️


Just install the elm-tooling/elm-language-client-vscode plugin from the VSCode MarketPlace

To enable linked editing in VSCode, use the setting "editor.linkedEditing": true.


There are general setup instructions and FAQ for Vim.

It's recommended to install syntax highlighting, which also adds the required detection of elm as filetype. An example vim configuration can be found in elm-vim/vim-config-example.


To enable support with coc.nvim, run :CocConfig and add the language server config below.

If needed, you can set the paths to elm, elm-test, elm-review and elm-format with the elmPath, elmTestPath, elmReviewPath and elmFormatPath variables.

  "languageserver": {
    "elmLS": {
      "command": "elm-language-server",
      "filetypes": ["elm"],
      "rootPatterns": ["elm.json"]
  // If you use neovim you can enable codelenses with this
  "codeLens.enable": true

Much of this is covered in the Example vim configuration section in Coc's readme.

Feature How to use it
Diagnostics :CocList diagnostics
Configure refresh with "diagnostic.refreshAfterSave": false
Formatting :call CocAction('format')
CodeLenses Requires Neovim. Add "coc.preferences.codeLens.enable": true to your coc-settings.json through :CocConfig
Completions On by default, see Completion with sources for customizations
Definitions Provided as <Plug> mapping so that you can set it yourself, e.g.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
DocumentSymbols :CocList outline
Folding You must set foldmethod=manual in your vimrc, one set Coc will handle folding with the usual commands, zc, zo, etc
Hover :call CocAction('doHover')
References Provided as a <Plug> mapping, e.g. nmap <silent> gr <Plug>(coc-references)
Rename Provided as a <Plug> mapping, e.g. nmap <leader>rn <Plug>(coc-rename)
Workspace Symbols :CocList symbols


ALE contains the elm_ls linter.

let g:ale_linters = { 'elm': ['elm_ls'] }

If needed, you can set the paths to elm, elm-test, elm-review and elm-format. The configuration can be found here

let g:ale_elm_ls_use_global = 1
let g:ale_elm_ls_executable = "/path/to/elm-language-server"
let g:ale_elm_ls_elm_path = "/path/to/elm"
let g:ale_elm_ls_elm_format_path = "/path/to/elm-format"
let g:ale_elm_ls_elm_test_path = "/path/to/elm-test"
Feature How to use it
Diagnostics :ALENext/:ALEPrevious
Configure refresh with let g:ale_lint_on_text_changed = 0
let g:ale_lint_on_insert_leave = 1
let g:ale_lint_on_save = 1
Formatting ALE doesn't currently support this through the language server integration, but elm-format is a supported ALE Fixer
CodeLenses Not currently supported
Completions On by default, see :h ale-completion for more info
Definitions :ALEGoToDefinition, :ALEGoToTypeDefinition, see :h ale-go-to-definition and :h ale-go-to-type-definition
DocumentSymbols Only workspace symbols are currently supported
Folding Not currently supported
Hover :ALEHover
References :ALEFindReferences
Rename Not currently supported
Workspace Symbols :ALESymbolSearch <query>


To use this language server with LanguageClient add the following configuration to your neovim/vim.

let g:LanguageClient_serverCommands = {
  \ 'elm': ['elm-language-server'],
  \ }

let g:LanguageClient_rootMarkers = {
  \ 'elm': ['elm.json'],
  \ }



First install kak-lsp, and enable it in the kakrc. One way would be to add these lines to your .config/kak/kakrc file:

eval %sh{kak-lsp --kakoune -s $kak_session}

Then, assuming installation of elm-language-server, elm-format, and elm-test, add this section to your .config/kak-lsp/kak-lsp.toml file:

filetypes = ["elm"]
roots = ["elm.json"]
command = "elm-language-server"


The language client is included in lsp-mode, specifically here. See specifically this section for a minimal use-package configuration for lsp-mode.

Emacs Doom

  • Uncomment lsp and elm in your configuration file .doom.d/init.el and add the +lsp feature flag to the elm layer:
(elm +lsp)
(after! lsp-ui
  (setq lsp-ui-doc-max-width 100)
  (setq lsp-ui-doc-max-height 30)
  (setq lsp-ui-sideline-show-code-actions nil)
  (setq lsp-ui-doc-enable nil)
  (setq lsp-ui-doc-show-with-cursor nil)
  (setq lsp-ui-doc-show-with-mouse nil)
  (setq lsp-lens-enable nil)
  (setq lsp-enable-symbol-highlighting nil)

You can also enable or disable more features: https://emacs-lsp.github.io/lsp-mode/tutorials/how-to-turn-off

  • Run ~/.emacs.d/bin/doom sync
Feature How to use it
Diagnostics On by default
Formatting On save
CodeLenses lsp-lens-mode, lsp-show-lens
Completions On by default
Definitions lsp-find-definition, lsp-ui-peek-find-definitions
DocumentSymbols lsp-ui-imenu
Folding +fold/open, +fold/close
Hover lsp-ui-sideline-mode, lsp-ui-doc-mode, lsp-ui-show-doc
References lsp-ui-peek-find-references, lsp-find-references
Rename lsp-rename
SelectionRange lsp-extend-selection


  1. Install Elm Syntax Highlighting, LSP and LSP-elm from Package Control.
  2. Restart Sublime.

You should now be able to use the integrations from Sublime. You might want to read about the features offered

Awesome libraries this is based on


Please do :) As the best thing about a language server is that multiple clients will improve that way.

Popular Server Projects
Popular Language Server Projects
Popular Networking Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Elm Lang
Language Server
Language Server Protocol