Gopls:在 Vim 或 Neovim 中使用
vim-go
使用 vim-go ver 1.20+,并进行以下配置
let g:go_def_mode='gopls'
let g:go_info_mode='gopls'
LanguageClient-neovim
使用 LanguageClient-neovim,并进行以下配置
" Launch gopls when Go files are in use
let g:LanguageClient_serverCommands = {
\ 'go': ['gopls']
\ }
" Run gofmt on save
autocmd BufWritePre *.go :call LanguageClient#textDocument_formatting_sync()
Ale
使用 ale
let g:ale_linters = {
\ 'go': ['gopls'],
\}
请参见 此问题
vim-lsp
使用 prabirshrestha/vim-lsp,并进行以下配置
augroup LspGo
au!
autocmd User lsp_setup call lsp#register_server({
\ 'name': 'gopls',
\ 'cmd': {server_info->['gopls']},
\ 'whitelist': ['go'],
\ })
autocmd FileType go setlocal omnifunc=lsp#complete
"autocmd FileType go nmap <buffer> gd <plug>(lsp-definition)
"autocmd FileType go nmap <buffer> ,n <plug>(lsp-next-error)
"autocmd FileType go nmap <buffer> ,p <plug>(lsp-previous-error)
augroup END
vim-lsc
使用 natebosch/vim-lsc,并进行以下配置
let g:lsc_server_commands = {
\ "go": {
\ "command": "gopls serve",
\ "log_level": -1,
\ "suppress_stderr": v:true,
\ },
\}
需要 log_level
和 suppress_stderr
部分,以防止日志记录导致的问题。请参阅问题 #180 和 #213。
coc.nvim
使用 coc.nvim,并进行以下 coc-settings.json
配置
"languageserver": {
"go": {
"command": "gopls",
"rootPatterns": ["go.work", "go.mod", ".vim/", ".git/", ".hg/"],
"filetypes": ["go"],
"initializationOptions": {
"usePlaceholders": true
}
}
}
如果您使用 go.work
文件,您可能需要设置 workspace.workspaceFolderCheckCwd
选项。这将强制 coc.nvim 在父目录中搜索 go.work
文件,即使当前打开的目录包含 go.mod
文件。有关更多详细信息,请参阅 coc.nvim 文档。
您也可以在 initializationOptions
中添加其他 设置。
editor.action.organizeImport
代码操作将自动格式化代码并添加缺失的导入。要在保存时自动执行此操作,请在您的 init.vim
中添加以下行
autocmd BufWritePre *.go :call CocAction('runCommand', 'editor.action.organizeImport')
govim
仅在 vim classic 中,使用实验性的 govim
,只需按照 安装步骤 进行操作。
Neovim v0.5.0+
要使用 Neovim 中新的原生 LSP 客户端,请确保您已 安装 Neovim v.0.5.0+,nvim-lspconfig
配置辅助插件,并查看其中的 gopls
配置部分。
安装
您可以使用 Neovim 的原生插件系统。在 Unix 系统上,您可以通过将 nvim-lspconfig
仓库克隆到正确的目录来实现
dir="${HOME}/.local/share/nvim/site/pack/nvim-lspconfig/opt/nvim-lspconfig/"
mkdir -p "$dir"
cd "$dir"
git clone 'https://github.com/neovim/nvim-lspconfig.git' .
配置
nvim-lspconfig 旨在提供合理的默认设置,因此您的设置可以非常简洁。
local lspconfig = require("lspconfig")
lspconfig.gopls.setup({})
但是,您也可以根据自己的偏好配置 gopls
。以下示例启用了 unusedparams
、staticcheck
和 gofumpt
。
local lspconfig = require("lspconfig")
lspconfig.gopls.setup({
settings = {
gopls = {
analyses = {
unusedparams = true,
},
staticcheck = true,
gofumpt = true,
},
},
})
导入和格式化
使用以下配置,在保存时使用 goimports
的逻辑整理您的导入并格式化您的代码。
autocmd("BufWritePre", {
pattern = "*.go",
callback = function()
local params = vim.lsp.util.make_range_params()
params.context = {only = {"source.organizeImports"}}
-- buf_request_sync defaults to a 1000ms timeout. Depending on your
-- machine and codebase, you may want longer. Add an additional
-- argument after params if you find that you have to write the file
-- twice for changes to be saved.
-- E.g., vim.lsp.buf_request_sync(0, "textDocument/codeAction", params, 3000)
local result = vim.lsp.buf_request_sync(0, "textDocument/codeAction", params)
for cid, res in pairs(result or {}) do
for _, r in pairs(res.result or {}) do
if r.edit then
local enc = (vim.lsp.get_client_by_id(cid) or {}).offset_encoding or "utf-16"
vim.lsp.util.apply_workspace_edit(r.edit, enc)
end
end
end
vim.lsp.buf.format({async = false})
end
})
Omnifunc
在 Neovim v0.8.1 及更高版本中,如果您不设置 omnifunc
选项,它将自动设置为 v:lua.vim.lsp.omnifunc
。如果您使用的是早期版本,可以手动配置它
local on_attach = function(client, bufnr)
-- Enable completion triggered by <c-x><c-o>
vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
end
require('lspconfig').gopls.setup({
on_attach = on_attach
})
附加链接
本文档的源代码可以在 golang.org/x/tools/gopls/doc 下找到。