vim-lsp 
适用于 vim8 和 neovim 的异步 Language Server Protocol 插件。
安装
安装 vim-plug 然后:
Plug 'prabirshrestha/vim-lsp'
性能
Vim 脚本中的某些瓶颈已通过 lua 实现。如果您希望利用这些性能提升, 请使用编译了 lua 的 vim 或 neovim v0.4.0+
注册服务器
if executable('pylsp')
" pip install python-lsp-server
au User lsp_setup call lsp#register_server({
\ 'name': 'pylsp',
\ 'cmd': {server_info->['pylsp']},
\ 'allowlist': ['python'],
\ })
endif
function! s:on_lsp_buffer_enabled() abort
setlocal omnifunc=lsp#complete
setlocal signcolumn=yes
if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif
nmap <buffer> gd <plug>(lsp-definition)
nmap <buffer> gs <plug>(lsp-document-symbol-search)
nmap <buffer> gS <plug>(lsp-workspace-symbol-search)
nmap <buffer> gr <plug>(lsp-references)
nmap <buffer> gi <plug>(lsp-implementation)
nmap <buffer> gt <plug>(lsp-type-definition)
nmap <buffer> <leader>rn <plug>(lsp-rename)
nmap <buffer> [g <plug>(lsp-previous-diagnostic)
nmap <buffer> ]g <plug>(lsp-next-diagnostic)
nmap <buffer> K <plug>(lsp-hover)
nnoremap <buffer> <expr><c-f> lsp#scroll(+4)
nnoremap <buffer> <expr><c-d> lsp#scroll(-4)
let g:lsp_format_sync_timeout = 1000
autocmd! BufWritePre *.rs,*.go call execute('LspDocumentFormatSync')
" refer to doc to add more commands
endfunction
augroup lsp_install
au!
" call s:on_lsp_buffer_enabled only for languages that has the server registered.
autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END
请参阅 vim-lsp-settings 了解如何使用 vim-lsp 轻松自动设置语言服务器。
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
自动补全
请参阅有关配置 omnifunc 或 asyncomplete.vim 的文档。
Snippets
vim-lsp does not support snippets by default. If you want snippet integration, you will first have to install a third-party snippet plugin and a plugin that integrates it in vim-lsp. At the moment, you have following options:
- vim-vsnip together with vim-vsnip-integ
- UltiSnips together with vim-lsp-ultisnips
- neosnippet.vim together with vim-lsp-neosnippet
有关更多信息,请参阅相应插件的 readme 和文档。
折叠
你可以让语言服务器自动为你处理折叠。要启用此功能,你必须设置 'foldmethod'、'foldexpr' 和(可选地)'foldtext':
set foldmethod=expr
\ foldexpr=lsp#ui#vim#folding#foldexpr()
\ foldtext=lsp#ui#vim#folding#foldtext()
如果您希望全局禁用折叠,可以在配置中添加以下内容:
let g:lsp_fold_enabled = 0
另见 :h vim-lsp-folding。
语义高亮
vim-lsp 支持 LSP 协议中用于语义高亮的非官方扩展(https://github.com/microsoft/vscode-languageserver-node/pull/367)。
此功能需要 Neovim 高亮,或启用 textprop 功能的 Vim。
您还需要将语言服务器的语义作用域链接到 Vim 高亮组。
更多信息请参阅 :h vim-lsp-semantic。
支持的命令
注意:
- 某些服务器可能仅支持部分命令。
- 虽然可以为同一文件类型注册多个服务器,但某些命令只会选择第一个支持该命令的服务器。例如,将重命名和格式化命令发送到多个服务器是没有意义的。
| 命令 | 描述 |
|---|---|
:LspAddTreeCallHierarchyIncoming | 查找光标下符号的传入调用层次结构,但将结果添加到当前列表 |
:LspCallHierarchyIncoming | 查找光标下符号的传入调用层次结构 |
:LspCallHierarchyOutgoing | 查找光标下符号的传出调用层次结构 |
:LspCodeAction | 获取可应用于文件以进行修复(快速修复)的可能命令列表 |
:LspCodeLens | 获取可在当前文档上执行的可能命令列表 |
:LspDeclaration | 跳转到光标下单词的声明,并在当前窗口中打开 |
:LspDefinition | 跳转到光标下单词的定义,并在当前窗口中打开 |
:LspDocumentDiagnostics | 获取当前文档的诊断信息 |
:LspDocumentFormat | 格式化整个文档 |
:LspDocumentRangeFormat | 格式化文档选区 |
:LspDocumentSymbol | 显示文档符号 |
:LspHover | 显示悬停信息 |
:LspImplementation | 在当前窗口中显示接口的实现 |
:LspNextDiagnostic | 跳转到下一个诊断(包括错误、警告、信息、提示) |
:LspNextError | 跳转到下一个错误 |
:LspNextReference | 跳转到光标下符号的下一个引用 |
:LspNextWarning | 跳转到下一个警告 |
:LspPeekDeclaration | 跳转到光标下单词的声明,但在预览窗口中打开 |
:LspPeekDefinition | 跳转到光标下单词的定义,但在预览窗口中打开 |
:LspPeekImplementation | 跳转到接口的实现,但在预览窗口中打开 |
:LspPeekTypeDefinition | 跳转到光标下单词的类型定义,但在预览窗口中打开 |
:LspPreviousDiagnostic | 跳转到上一个诊断(包括错误、警告、信息、提示) |
:LspPreviousError | 跳转到上一个错误 |
:LspPreviousReference | 跳转到光标下符号的上一个引用 |
:LspPreviousWarning | 跳转到上一个警告 |
:LspReferences | 查找引用 |
:LspRename | 重命名符号 |
:LspStatus | 显示语言服务器状态 |
:LspTypeDefinition | 跳转到光标下单词的类型定义,并在当前窗口打开 |
:LspTypeHierarchy | 查看光标下符号的类型层次结构 |
:LspWorkspaceSymbol | 搜索/显示工作区符号 |
诊断
文档诊断(例如警告、错误)默认启用,但如果你
希望关闭它们并改用其他插件(例如
Neomake 或
ALE,请将 g:lsp_diagnostics_enabled 设置为
0:
let g:lsp_diagnostics_enabled = 0 " disable diagnostics support
高亮引用
高亮光标下方符号的引用(默认启用)。 您可以通过添加来禁用
let g:lsp_document_highlight_enabled = 0
到你的配置中。
若要更改高亮的样式,你可以设置或链接 lspReference
高亮组,例如:
highlight lspReference ctermfg=red guifg=red ctermbg=green guibg=green
调试
要启用文件日志记录,请设置 g:lsp_log_file。
let g:lsp_log_verbose = 1
let g:lsp_log_file = expand('~/vim-lsp.log')
" for asyncomplete.vim log
let g:asyncomplete_log_file = expand('~/asyncomplete.log')
您可以使用 vim 上的插件通过 :CheckHealth 获取服务器的详细状态:
if !has('nvim') | Plug 'rhysd/vim-healthcheck' | endif
CheckHealth
测试
vim-themis 用于测试。要运行 集成测试,gopls 可执行文件必须在路径中。
维护者
- Prabir Shrestha (作者, 维护者)
- mattn (维护者)
- hrsh7th (维护者)
- Thomas Faingnaert (维护者)
- rhysd (维护者)
支持者
通过每月捐赠支持我们,帮助我们继续开展活动。[成为支持者]
赞助者
成为赞助者,让您的 Logo 出现在我们 GitHub 上的 README 中,并附上指向您网站的链接。[成为赞助者]