Use vim-go ver 1.20+, with the following configuration:
let g:go_def_mode='gopls' let g:go_info_mode='gopls'
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()
Use ale:
let g:ale_linters = { \ 'go': ['gopls'], \}
see this issue
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
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.
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')
In vim classic only, use the experimental govim
, simply follow the install steps.
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.
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
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.)
To make your Ctrl+x,Ctrl+o work, add this to your init.vim
:
autocmd FileType go setlocal omnifunc=v:lua.vim.lsp.omnifunc