1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
|
# Vim / Neovim
* [vim-go](#vimgo)
* [LanguageClient-neovim](#lcneovim)
* [Ale](#ale)
* [vim-lsp](#vimlsp)
* [vim-lsc](#vimlsc)
* [coc.nvim](#cocnvim)
* [govim](#govim)
* [Neovim v0.5.0+](#neovim)
* [Installation](#neovim-install)
* [Custom Configuration](#neovim-config)
* [Imports](#neovim-imports)
* [Omnifunc](#neovim-omnifunc)
* [Additional Links](#neovim-links)
## <a href="#vimgo" id="vimgo">vim-go</a>
Use [vim-go] ver 1.20+, with the following configuration:
```vim
let g:go_def_mode='gopls'
let g:go_info_mode='gopls'
```
## <a href="#lcneovim" id="lcneovim">LanguageClient-neovim</a>
Use [LanguageClient-neovim], with the following configuration:
```vim
" 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()
```
## <a href="#ale" id="ale">Ale</a>
Use [ale]:
```vim
let g:ale_linters = {
\ 'go': ['gopls'],
\}
```
see [this issue][ale-issue-2179]
## <a href="#vimlsp" id="vimlsp">vim-lsp</a>
Use [prabirshrestha/vim-lsp], with the following configuration:
```vim
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
```
## <a href="#vimlsc" id="vimlsc">vim-lsc</a>
Use [natebosch/vim-lsc], with the following configuration:
```vim
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](https://github.com/natebosch/vim-lsc/issues/180) and
[#213](https://github.com/natebosch/vim-lsc/issues/213).
## <a href="#cocnvim" id="cocnvim">coc.nvim</a>
Use [coc.nvim], with the following `coc-settings.json` configuration:
```json
"languageserver": {
"golang": {
"command": "gopls",
"rootPatterns": ["go.mod", ".vim/", ".git/", ".hg/"],
"filetypes": ["go"],
"initializationOptions": {
"usePlaceholders": true
}
}
}
```
Other [settings](settings.md) 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`:
```vim
autocmd BufWritePre *.go :call CocAction('runCommand', 'editor.action.organizeImport')
```
## <a href="#govim" id="govim">govim</a>
In vim classic only, use the experimental [`govim`], simply follow the [install steps][govim-install].
## <a href="#neovim" id="neovim">Neovim v0.5.0+</a>
To use the new (still experimental) native LSP client in Neovim, make sure you
[install][nvim-install] the prerelease v0.5.0 version of Neovim (aka “nightly”),
the `nvim-lspconfig` configuration helper plugin, and check the
[`gopls` configuration section][nvim-lspconfig] there.
### <a href="#neovim-install" id="neovim-install">Installation</a>
You can use Neovim's native plugin system. On a Unix system, you can do that by
cloning the `nvim-lspconfig` repository into the correct directory:
```sh
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' .
```
### <a href="#neovim-config" id="neovim-config">Custom Configuration</a>
You can add custom configuration using Lua. Here is an example of enabling the
`unusedparams` check as well as `staticcheck`:
```vim
lua <<EOF
lspconfig = require "lspconfig"
lspconfig.gopls.setup {
cmd = {"gopls", "serve"},
settings = {
gopls = {
analyses = {
unusedparams = true,
},
staticcheck = true,
},
},
}
EOF
```
### <a href="#neovim-imports" id="neovim-imports">Imports</a>
To get your imports ordered on save, like `goimports` does, you can define
a helper function in Lua:
```vim
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][nvim-lspconfig-imports] on Neovim issue tracker.)
### <a href="#neovim-omnifunc" id="neovim-omnifunc">Omnifunc</a>
To make your <kbd>Ctrl</kbd>+<kbd>x</kbd>,<kbd>Ctrl</kbd>+<kbd>o</kbd> work, add
this to your `init.vim`:
```vim
autocmd FileType go setlocal omnifunc=v:lua.vim.lsp.omnifunc
```
### <a href="#neovim-links" id="neovim-links">Additional Links</a>
* [Neovim's official LSP documentation][nvim-docs].
[vim-go]: https://github.com/fatih/vim-go
[LanguageClient-neovim]: https://github.com/autozimu/LanguageClient-neovim
[ale]: https://github.com/w0rp/ale
[ale-issue-2179]: https://github.com/w0rp/ale/issues/2179
[prabirshrestha/vim-lsp]: https://github.com/prabirshrestha/vim-lsp/
[natebosch/vim-lsc]: https://github.com/natebosch/vim-lsc/
[natebosch/vim-lsc#180]: https://github.com/natebosch/vim-lsc/issues/180
[coc.nvim]: https://github.com/neoclide/coc.nvim/
[`govim`]: https://github.com/myitcv/govim
[govim-install]: https://github.com/myitcv/govim/blob/master/README.md#govim---go-development-plugin-for-vim8
[nvim-docs]: https://neovim.io/doc/user/lsp.html
[nvim-install]: https://github.com/neovim/neovim/wiki/Installing-Neovim
[nvim-lspconfig]: https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md#gopls
[nvim-lspconfig-imports]: https://github.com/neovim/nvim-lspconfig/issues/115
|