Home

Awesome

vim-lsp-settings

Actions Status Actions Status

Auto configurations for Language Servers for vim-lsp.

Introduction

Language Servers are not easy to install. Visual Studio Code provides easy ways to install and update Language Servers and Language Server Client. This plugin provides the same feature for Vim.

Installation

Using the vim-plug plugin manager:

Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'

You need to install both vim-lsp and vim-lsp-settings.

Usage

While editing a file with a supported filetype:

:LspInstallServer

To uninstall server:

:LspUninstallServer server-name

Because there is no way to update a server, please run :LspInstallServer again, the newer version will be installed.

Auto-complete

If you want to use auto-completion, you can use one of the following.

asyncomplete.vim

Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'

ddc.vim

Plug 'Shougo/ddc.vim'
Plug 'shun/ddc-vim-lsp'

LSP server download directory

This is where LSP servers are placed on your system after you download them with :LspInstallServer

Windows

%LOCALAPPDATA%\vim-lsp-settings\servers

MacOS/Linux

$HOME/.local/share/vim-lsp-settings/servers

If you define $XDG_DATA_HOME:

$XDG_DATA_HOME/vim-lsp-settings/servers

You can change the directory to install servers by set g:lsp_settings_servers_dir option in full path.

Supported Languages

LanguageLanguage ServerInstallerLocal Install
Apex/VisualForceapex-jorje-lspYesYes
Astroastro-lsYesYes
AstrobiomeYesYes
Bashbash-language-serverYesYes
C#omnisharpYesYes
C/C++clangdYesYes
COBOLcobol-language-supportYesYes
CSScss-languageserverYesYes
CSStailwindcss-intellisenseYesYes
Clojureclojure-lspYesYes
Clojureclj-kondo-lspYesYes
Cmakecmake-language-serverYesYes
DdlsYesNo
Dserve-dYesNo
Dartanalysis-server-dart-snapshotYesYes
Dockerfiledockerfile-language-server-nodejsYesYes
Dotdot-language-serverYesYes
Elixirelixir-lsYesYes
Elmelm-language-serverYesYes
Erlangerlang-lsYesYes
F#fsautocompleteYesYes
F#fsharp-language-serverYesYes
FortranfortlsYesYes
GogoplsYesYes
Gogolangci-lint-langserverYesYes
GraphQLgraphql-language-service-cliYesYes
GraphQLgql-language-serverYesYes
Groovygroovy-language-serverYesYes
Haskellhaskell-ide-engineNoNo
Haskellhaskell-language-serverNoNo
Helmhelm-lsYesYes
HTMLhtml-languageserverYesYes
HTMLangular-language-serverYesYes
HTMLtailwindcss-intellisenseYesYes
HyhyugaYesNo
JSONjson-languageserverYesYes
JSONromeYesYes
JSONbiomeYesYes
Jsonnetjsonnet-language-serverYesYes
Javaeclipse-jdt-lsYesYes
Javajava-language-serverNoYes
JavaScripttypescript-language-serverYesYes
JavaScriptvtslsYesYes
JavaScriptjavascript-typescript-stdioYesYes
JavaScriptromeYesYes
JavaScriptflowYesYes
JavaScripteslint-language-serverYesYes
JavaScriptbiomeYesYes
JuliaLanguageServer.jlYesNo
Kotlinkotlin-language-serverYesYes
Lispcl-lspYesNo
Luaemmylua-lsYesYes
Luasumneko-lua-language-serverYesYes
Markdown (remark)remark-language-serverYesYes
MarkdownMarksmanYesYes
NimnimlsNoNo
NixnixdYesYes
NixnilYesYes
PHPintelephenseYesYes
PHPpsalm-language-serverYesYes
OCamlocaml-lspUNIX OnlyYes
ProtobufbuflsYesYes
Puppetpuppet-languageserverYesYes
PureScriptpurescript-language-serverYesYes
Pythonpyls-all (pyls with dependencies)YesYes
Pythonpyls (pyls without dependencies)YesYes
Pythonpyls-ms (Microsoft Version)YesYes
Pythonjedi-language-serverYesYes
Pythonpyright-langserverYesYes
Pythonpylsp-all (pylsp with dependencies)YesYes
Pythonpylsp (pylsp without dependencies)YesYes
PythonpylyzerYesYes
PythonruffYesYes
Pythonruff-lspYesYes
Prismaprisma-language-serverYesYes
RlanguageserverYesNo
Racketracket-lspYesNo
Reasonreason-language-serverYesYes
Rubyruby-lspUNIX OnlyYes
RubysolargraphYesYes
RubysteepYesYes
RubytypeprofYesYes
Rubyrubocop (lsp mode)YesNo
RubysorbetYesNo
RustrlsYesNo
Rustrust-analyzerYesYes
SphinxesbonioYesYes
SQLsql-language-serverYesYes
SQLsqlsYesYes
SQLplpgsql-serverUNIX OnlyYes
StarlarkstarplsYesYes
ScalaMetalsYesYes
Sveltesvelte-language-serverYesYes
Sveltetailwindcss-intellisenseYesYes
SveltebiomeYesYes
Swiftsourcekit-lspYesNo
SystemVerilogverible-verilog-lsUNIX OnlyYes
SystemVerilogsvlsYesYes
TeXtexlabYesYes
TeXdigestifYesNo
Terraformterraform-lspYesYes
Terraformterraform-lsYesYes
TOMLtaplo-lspNoYes
TTCN-3nttYesYes
TypeScripttypescript-language-serverYesYes
TypeScriptvtslsYesYes
TypeScriptdenoYesYes
TypeScriptromeYesYes
TypeScripteslint-language-serverYesYes
TypeScriptbiomeYesYes
Typsttypst-lspYesYes
TypsttinymistYesYes
Vimvim-language-serverYesYes
Valavala-language-serverNoNo
Verilogverible-verilog-lsUNIX OnlyYes
Verylveryl-lsYesYes
Vuevolar-server (Vue Language Tools)YesYes
VuevlsYesYes
VuebiomeYesYes
Vv-analyzerYesYes
Vvlang-vlsYesYes
XMLlemminxYesYes
YAMLyaml-language-serverYesYes
YAMLaws-lsp-yamlYesYes
YANGyang-lspYesYes
ZIGzlsYesYes
*efm-langserverYesYes

Notes

clangd (C/C++)

There is a Linux OS/version that does not run the locally installed clangd due to zlib version mismatch. If you want to use clangd, please install clangd on your system.

rls (Rust)

If you installed rls already, you can use rls without configurations. But if you have not installed rls yet, you can install it by following these instructions.

rust-analyzer

If you want to configure many of the rust-analyzer configuration options, you need to you insert a initialization_options dictionary between rust-analyzer and subdictionaries (cargo, completion, procMacro, etc.) in your .vim-lsp-settings/settings.json.

{
    "rust-analyzer": {
        "initialization_options": {
            "server.extraEnv": {
                "RUSTUP_TOOLCHAIN": "nightly"
            },
            "cargo": {
                "target": "aarch64-apple-ios-sim"
            },
            "completion": { "autoimport": {"enable": false } },
            "procMacro": { "enable": true }
        }
    }
}

LSP Extensions Support

Extension NameStatus
initializationOptions
Snippet TextEdit
CodeAction Groups
Parent Module
Join Lines✔️
On Enter
Structural Search Replace (SSR)
Matching Brace✔️
Runnables
Test explorer
Open External Documentation✔️
Analyzer Status✔️
Reload Workspace✔️
Rebuild proc-macros
Unindexed Project
Server Status
Syntax Tree
View Hir
View Mir
Interpret Function
View File Text
View ItemTree
View Crate Graph
Shuffle Crate Graph
Expand Macro✔️
Hover Actions
Open Cargo.toml✔️
Related tests
Hover Range
Move Item
Workspace Symbols Filtering
Client Commands
Colored Diagnostic Output
Dependency Tree
View Recursive Memory Layout

deno (TypeScript)

To use deno, deno.json(c) should located on the project directory or traversing the filesystem upwards.

If deno.json does not located, node_modules should not located on the project directory or traversing the filesystem upwards.

When editing Node projects, the following warning message is shown.

server "deno" is disabled since "node_modules" is found

If you want to disable warning message, you may put .vim-lsp-settings/settings.json in your project root directory.

{
  "deno": {
    "disabled": true
  }
}

To use importMap, default file name is import_map.json.

If you don't want to use import_map.json, you may put .vim-lsp-settings/settings.json in your project root directory and set importMap whatever you want.

{
  "deno": {
    "initialization_options": {
      "enable": true,
      "lint": true,
      "unstable": true,
      "importMap": "your_own_import_map.json"
    }
  }
}

Recommend to add let g:markdown_fenced_languages = ['ts=typescript'] to your vimrc for hover(preview) Deno's library.

Note that deno language server is specified.

let g:lsp_settings_filetype_typescript = ['typescript-language-server', 'eslint-language-server', 'deno']

flow (JavaScript)

To use flow, the .flowconfig has to be located on the top of project directory.

graphql-language-service-cli(GraphQL)

To use graphql-language-service-cli, the GraphQL Config has to be located on the top of project directory. The schema must be pointed to the schema file correctly.

{
  "schema": "./schema.graphql"
}

gql-language-server (GraphQL)

To use gql-language-server, the .gqlconfig has to be located on the top of project directory. The schema must be pointed to the schema file correctly.

{
  schema: {
    files: 'path/to/schema.graphql'
  }
}

Finally, you have to install @playlyfe/gql into your project.

$ npm install @playlyfe/gql --save-dev

dart analysis server (Dart)

If you have a separate existing installation of the dart analysis server and want it to be used, it must either exist in your path, or you must specify its location. See 'Configurations' below.

haskell ide engine (Haskell)

If you installed hie with stack, you can use hie without configurations. But if you have not installed hie yet, you can install it by following these steps.

golangci-lint-langserver (Go)

To use older version golangci-lint, please run :LspSettingsGlobalEdit and put bellow configuration.

"golangci-lint-langserver": {
    "initialization_options": {
        "command": [
            "golangci-lint", "run", "--enable-all", "--disable", "lll", "--out-format", "json"
        ]
    }
}

kotlin-language-server

To resolve issue about proper '-jvm-target' (INLINE_FROM_HIGHER_PLATFORM) read more

let g:lsp_settings = {
\  'kotlin-language-server': {
\    'workspace_config': {
\      'kotlin': {'compiler': {'jvm': {'target': '17'}}}
\    }
\  }
\}

rubocop lsp mode (Ruby)

To use rubocop-lsp-mode, you need to install rubocop in your Ruby project using bundler.

sorbet (Ruby)

To use sorbet, you need to install rubocop in your Ruby project using bundler. Also, Watchman is required to watch file changes. For more details, please see Sorbet and Watchman documentations.

volar (Vue Language Tools)

To enable full Vue support, both typescript-language-server and volar-server should be installed and enabled in vue filetype.

let g:lsp_settings_filetype_vue = ['typescript-language-server', 'volar-server']

Extra Configurations

Most of the configurations are not required.

If you installed clangd already, you can use clangd for C/C++ without any configuration. But if you installed clang with the name clangd-6.0, you can replace executable with the following config:

let g:lsp_settings = {
\  'clangd': {'cmd': ['clangd-6.0']},
\  'efm-langserver': {'disabled': v:false}
\}

Or put .vim-lsp-settings/settings.json in your project root directory.

{
  "clangd": {
    "cmd": ["clangd-6.0"]
  },
  "efm-langserver": {
    "disabled": false
  }
}

If you already have the dart analysis server installed but it is not in your path, you can still configure the settings to use it. Use the vimscript below to change the command to start the server. Note the command has two parts: the path to your 'dart' executable, and a subcommand 'language-server.

let g:lsp_settings = {
    \ 'analysis-server-dart-snapshot': {
    \     'cmd': [
    \         '/path/to/your/dart-sdk/bin/dart',
    \         'language-server'
    \     ],
    \ },
\ }

To edit the project local settings.json, do :LspSettingsLocalEdit.

Overridable keys are:

If you have some Language Servers and want to use specified the server:

let g:lsp_settings_filetype_perl = 'slp'
let g:lsp_settings_filetype_html = ['html-languageserver', 'angular-language-server']
let g:lsp_settings_filetype_typescript = ['typescript-language-server', 'eslint-language-server']

When the servers are specified in a list, these will all be started.

If you want to configure Language Server to use flake8 rather than pycodestyle, the following can be added to your ~/.vimrc file. Note that pylsp-all was the automatically registered server name. Check with :LspStatus.

let g:lsp_settings = {
\   'pylsp-all': {
\     'workspace_config': {
\       'pylsp': {
\         'configurationSources': ['flake8']
\       }
\     }
\   },
\}

If you want to disable a Language Server:

let g:lsp_settings = {
\  'perl-languageserver': {
\    'disabled': 1,
\   }
\}

When resolving the root directory for a language server, this plugin will look for directories containing special root markers defined in g:lsp_settings_root_markers.

By default, this is set to:

let g:lsp_settings_root_markers = [
\   '.git',
\   '.git/',
\   '.svn',
\   '.hg',
\   '.bzr'
\ ]

If you need to specify alternative root markers:

let g:lsp_settings_root_markers = ['.projections.json', '.git', '.git/']

This would look for a custom .projections.json, a git submodule .git or a git root .git/ starting from the current directory upwards.

License

MIT

Author

Yasuhiro Matsumoto (a.k.a. mattn)