npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@elm-tooling/elm-language-server

v2.8.0

Published

Implementation of an elm language server in node.

Downloads

1,142

Readme

elm-language-server

Matrix Build Status Open in Visual Studio Code

Packaging status

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

Table of Contents

Installation

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:

elm-language-server

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

elm-language-server.cmd

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

Requirements

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).

Configuration

We used to have a file called elm-tooling.json where you could specifiy "entrypoints". That’s 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.

Linting

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

Features

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 | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | VIM CoC | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | VIM LanguageClient | :heavy_check_mark: | :heavy_check_mark: | :grey_question: | :heavy_check_mark: | :grey_question: | :grey_question: | :grey_question: | :grey_question: | :x: | :grey_question: | :grey_question: | :grey_question: | | VIM ALE | :heavy_check_mark: | :x: | :x: | :grey_question: | :heavy_check_mark: | :x: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | :heavy_check_mark: | | Kakoune | :heavy_check_mark: | :heavy_check_mark: | :grey_question: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :grey_question: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :grey_question: | | Emacs | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :grey_question: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | | Sublime | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |

VSCode

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.

Vim

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.

coc.nvim

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 diagnosticsConfigure 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

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/:ALEPreviousConfigure refresh with let g:ale_lint_on_text_changed = 0let 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> |

LanguageClient

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'],
  \ }

Kakoune

kak-lsp

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}
lsp-enable

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

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

Emacs

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:
lsp
(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 |

Sublime

  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

Contributing

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