| # 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.work", "go.mod", ".vim/", ".git/", ".hg/"], | 
 |       "filetypes": ["go"], | 
 |       "initializationOptions": { | 
 |         "usePlaceholders": true | 
 |       } | 
 |     } | 
 |   } | 
 | ``` | 
 |  | 
 | If you use `go.work` files, you may want to set the | 
 | `workspace.workspaceFolderCheckCwd` option. This will force coc.nvim to search | 
 | parent directories for `go.work` files, even if the current open directory has | 
 | a `go.mod` file. See the | 
 | [coc.nvim documentation](https://github.com/neoclide/coc.nvim/wiki/Using-workspaceFolders) | 
 | for more details. | 
 |  | 
 | 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 native LSP client in Neovim, make sure you | 
 | [install][nvim-install] Neovim v.0.5.0+, | 
 | 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" | 
 |   util = require "lspconfig/util" | 
 |  | 
 |   lspconfig.gopls.setup { | 
 |     cmd = {"gopls", "serve"}, | 
 |     filetypes = {"go", "gomod"}, | 
 |     root_dir = util.root_pattern("go.work", "go.mod", ".git"), | 
 |     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 OrgImports(wait_ms) | 
 |     local params = vim.lsp.util.make_range_params() | 
 |     params.context = {only = {"source.organizeImports"}} | 
 |     local result = vim.lsp.buf_request_sync(0, "textDocument/codeAction", params, wait_ms) | 
 |     for _, res in pairs(result or {}) do | 
 |       for _, r in pairs(res.result or {}) do | 
 |         if r.edit then | 
 |           vim.lsp.util.apply_workspace_edit(r.edit, "UTF-8") | 
 |         else | 
 |           vim.lsp.buf.execute_command(r.command) | 
 |         end | 
 |       end | 
 |     end | 
 |   end | 
 | EOF | 
 |  | 
 | autocmd BufWritePre *.go lua OrgImports(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/doc/server_configurations.md#gopls | 
 | [nvim-lspconfig-imports]: https://github.com/neovim/nvim-lspconfig/issues/115 |