4.9 KiB
Vim / Neovim
vim-go
Use vim-go ver 1.20+, with the following configuration:
let g:go_def_mode='gopls'
let g:go_info_mode='gopls'
LanguageClient-neovim
Use LanguageClient-neovim, with the following configuration:
" 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
Use ale:
let g:ale_linters = {
\ 'go': ['gopls'],
\}
see this issue
vim-lsp
Use prabirshrestha/vim-lsp, with the following configuration:
augroup LspGo
au!
autocmd User lsp_setup call lsp#register_server({
\ 'name': 'go-lang',
\ '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
Use natebosch/vim-lsc, with the following configuration:
let g:lsc_server_commands = {
\ "go": {
\ "command": "gopls serve",
\ "log_level": -1,
\ "suppress_stderr": v:true,
\ },
\}
The log_level and suppress_stderr parts are needed to prevent breakage from logging. See
issues #180 and
#213.
coc.nvim
Use coc.nvim, with the following coc-settings.json configuration:
"languageserver": {
"golang": {
"command": "gopls",
"rootPatterns": ["go.mod", ".vim/", ".git/", ".hg/"],
"filetypes": ["go"],
"initializationOptions": {
"usePlaceholders": true
}
}
}
Other settings can be added in initializationOptions too.
The editor.action.organizeImport code action will auto-format code and add missing imports. To run this automatically on save, add the following line to your init.vim:
autocmd BufWritePre *.go :call CocAction('runCommand', 'editor.action.organizeImport')
govim
In vim classic only, use the experimental govim, simply follow the install steps.
Neovim v0.5.0+
To use the new (still experimental) native LSP client in Neovim, make sure you
install the prerelease v0.5.0 version of Neovim (aka “nightly”),
the nvim-lspconfig configuration helper plugin, and check the
gopls configuration section there.
Custom configuration
You can add custom configuration using Lua. Here is an example of enabling the
unusedparams check as well as staticcheck:
lua <<EOF
nvim_lsp = require "nvim_lsp"
nvim_lsp.gopls.setup {
cmd = {"gopls", "serve"},
settings = {
gopls = {
analyses = {
unusedparams = true,
},
staticcheck = true,
},
},
}
EOF
Imports
To get your imports ordered on save, like goimports does, you can define
a helper function in Lua:
lua <<EOF
-- …
function goimports(timeoutms)
local context = { source = { organizeImports = true } }
vim.validate { context = { context, "t", true } }
local params = vim.lsp.util.make_range_params()
params.context = context
local method = "textDocument/codeAction"
local resp = vim.lsp.buf_request_sync(0, method, params, timeoutms)
if resp and resp[1] then
local result = resp[1].result
if result and result[1] then
local edit = result[1].edit
vim.lsp.util.apply_workspace_edit(edit)
end
end
vim.lsp.buf.formatting()
end
EOF
autocmd BufWritePre *.go lua goimports(1000)
(Taken from the discussion on Neovim issue tracker.)
Omnifunc
To make your Ctrl+x,Ctrl+o work, add
this to your init.vim:
autocmd FileType go setlocal omnifunc=v:lua.vim.lsp.omnifunc