A vim plugin for communicating with a language server
Adds language-aware tooling to vim by communicating with a language server following the language server protocol. For more information see langserver.org.
Install with your plugin management method of choice. If you don't have a preference check out vim-plug. Install a language server and ensure it is executable from your
$PATH.
vim-lsc is compatible with vim 8, and neovim.
Note: When using neovim be sure to use
set shortmess-=Fto avoid suppressing error messages from this plugin.
Map a filetype to the command that starts the language server for that filetype in your
vimrc.
let g:lsc_server_commands = {'dart': 'dart_language_server'}
To disable autocomplete in favor of manual completion also add
let g:lsc_enable_autocomplete = v:false
Most interactive features are triggered by commands. You can use
g:lsc_auto_mapto have them automatically mapped for the buffers which have a language server enabled. You can use the default mappings by setting it to
v:true, or specify your own mappings in a dict.
Most keys take strings or lists of strings which are the keys bound to that command in normal mode. The
'ShowHover'key can also be
v:truein which case it sets
keywordprginstead of a keybind (
keywordprgmaps
K). The 'Completion' key sets a completion function for manual invocation, and should be either
'completefunc'or
'omnifunc'(see
:help complete-functions).
" Use all the defaults (recommended): let g:lsc_auto_map = v:true" Apply the defaults with a few overrides: let g:lsc_auto_map = {'defaults': v:true, 'FindReferences': 'r'}
" Setting a value to a blank string leaves that command unmapped: let g:lsc_auto_map = {'defaults': v:true, 'FindImplementations': ''}
" ... or set only the commands you want mapped without defaults. " Complete default mappings are: let g:lsc_auto_map = { \ 'GoToDefinition': '', \ 'GoToDefinitionSplit': [']', ''], \ 'FindReferences': 'gr', \ 'NextReference': '', \ 'PreviousReference': '', \ 'FindImplementations': 'gI', \ 'FindCodeActions': 'ga', \ 'Rename': 'gR', \ 'ShowHover': v:true, \ 'DocumentSymbol': 'go', \ 'WorkspaceSymbol': 'gS', \ 'SignatureHelp': 'gm', \ 'Completion': 'completefunc', }
During the initialization call LSP supports a
traceargument which configures logging on the server. Set this with
g:lsc_trace_level. Valid values are
'off',
'messages', or
'verbose'. Defaults to
'off'.
The protocol does not require that every language server supports every feature so support may vary.
All communication with the server is asynchronous and will not block the editor. For requests that trigger an action the response might be silently ignored if it can no longer be used - you can abort most operations that are too slow by moving the cursor.
The client can be temporarily disabled for a session with
LSClientDisableand re-enabled with
LSClientEnable. At any time the server can be exited and restarted with
LSClientRestartServer- this sends a request for the server to exit rather than kill it's process so a completely unresponsive server should be killed manually instead.
Errors, warnings, and hints reported by the server are highlighted in the buffer. When the cursor is on a line with a diagnostic the message will be displayed. If there are multiple diagnostics on a line the one closest to the cursor will be displayed.
Diagnostics are also reported in the location list for each window which has the buffer open.
Run
:LSClientAllDiagnosticsto populate, and maintain, a list of all diagnostics across the project in the quickfix list.
When more than 3 word characters or a trigger character are typed a request for autocomplete suggestions is sent to the server. If the server responds before the cursor moves again the options will be provided using vim's built in completion.
Note: By default
completeoptincludes
previewand completion items include documentation in the preview window. Close the window after completion with or disable with
set completeopt-=preview. To automatically close the documentation window use the following:
autocmd CompleteDone * silent! pclose
Disable autocomplete with
let g:lsc_enable_autocomplete = v:false. A completion function is available at
lsc#complete#complete(set to
completefuncif applying the default keymap). This is synchronous and has a cap of 5 seconds to wait for the server to respond. It can be used whether autocomplete is enabled or not.
If the server supports the
textDocument/documentHighlightcall references to the element under the cursor throughout the document will be highlighted. Disable with
let g:lsc_reference_highlights = v:falseor customize the highlighting with the group
lscReference. Use (
:LSClientNextReference) or (
:LSClientPReviousReference) to jump to other reference to the currently highlighted element.
While the cursor is on any identifier call
LSClientGoToDefinition( if using the default mappings) to jump to the location of the definition. If the cursor moves before the server responds the response will be ignored.
While the cursor is on any identifier call
LSClientFindReferences(
grif using the default mappings) to populate the quickfix list with usage locations.
While the cursor is on any identifier call
LSClientFindImplementations(
gIif using the default mappings) to populate the quickfix list with implementation locations.
Call
LSClientDocumentSymbol(
goif using the default mappings) to populate the quickfix list with the locations of all symbols in that document.
Call
LSClientWorkspaceSymbolwith a no arguments, or with a single String argument. (
gSif using the default mappings) to query the server for symbols matching a search string. Results will populate the quickfix list.
While the cursor is on any identifier call
LSClientShowHover(
Kif using the default mappings, bound through
keywordprg) to request hover text and show it in a popup or preview window. Override the direction of the split by setting
g:lsc_preview_split_directionto either
'below'or
'above'. Quickly close the preview without switching buffers with . See
:help preview-window.
Call
LSClientFindCodeActions(
gaif using the default mappings) to look for code actions available at the cursor location and run one by entering the number of the chosen action.
Call
LSClientSignatureHelp(
gmif using the default mappings) to get help while writing a function call. The currently active parameter is highlighted with the group
lscCurrentParameter.