golang.org/x/tools/gopls@v0.15.3/doc/vim.md (about)

     1  # Vim / Neovim
     2  
     3  * [vim-go](#vimgo)
     4  * [LanguageClient-neovim](#lcneovim)
     5  * [Ale](#ale)
     6  * [vim-lsp](#vimlsp)
     7  * [vim-lsc](#vimlsc)
     8  * [coc.nvim](#cocnvim)
     9  * [govim](#govim)
    10  * [Neovim v0.5.0+](#neovim)
    11    * [Installation](#neovim-install)
    12    * [Custom Configuration](#neovim-config)
    13    * [Imports](#neovim-imports)
    14    * [Omnifunc](#neovim-omnifunc)
    15    * [Additional Links](#neovim-links)
    16  
    17  ## <a href="#vimgo" id="vimgo">vim-go</a>
    18  
    19  Use [vim-go] ver 1.20+, with the following configuration:
    20  
    21  ```vim
    22  let g:go_def_mode='gopls'
    23  let g:go_info_mode='gopls'
    24  ```
    25  
    26  ## <a href="#lcneovim" id="lcneovim">LanguageClient-neovim</a>
    27  
    28  Use [LanguageClient-neovim], with the following configuration:
    29  
    30  ```vim
    31  " Launch gopls when Go files are in use
    32  let g:LanguageClient_serverCommands = {
    33         \ 'go': ['gopls']
    34         \ }
    35  " Run gofmt on save
    36  autocmd BufWritePre *.go :call LanguageClient#textDocument_formatting_sync()
    37  ```
    38  
    39  ## <a href="#ale" id="ale">Ale</a>
    40  
    41  Use [ale]:
    42  
    43  ```vim
    44  let g:ale_linters = {
    45    \ 'go': ['gopls'],
    46    \}
    47  ```
    48  
    49  see [this issue][ale-issue-2179]
    50  
    51  ## <a href="#vimlsp" id="vimlsp">vim-lsp</a>
    52  
    53  Use [prabirshrestha/vim-lsp], with the following configuration:
    54  
    55  ```vim
    56  augroup LspGo
    57    au!
    58    autocmd User lsp_setup call lsp#register_server({
    59        \ 'name': 'go-lang',
    60        \ 'cmd': {server_info->['gopls']},
    61        \ 'whitelist': ['go'],
    62        \ })
    63    autocmd FileType go setlocal omnifunc=lsp#complete
    64    "autocmd FileType go nmap <buffer> gd <plug>(lsp-definition)
    65    "autocmd FileType go nmap <buffer> ,n <plug>(lsp-next-error)
    66    "autocmd FileType go nmap <buffer> ,p <plug>(lsp-previous-error)
    67  augroup END
    68  ```
    69  
    70  ## <a href="#vimlsc" id="vimlsc">vim-lsc</a>
    71  
    72  Use [natebosch/vim-lsc], with the following configuration:
    73  
    74  ```vim
    75  let g:lsc_server_commands = {
    76  \  "go": {
    77  \    "command": "gopls serve",
    78  \    "log_level": -1,
    79  \    "suppress_stderr": v:true,
    80  \  },
    81  \}
    82  ```
    83  
    84  The `log_level` and `suppress_stderr` parts are needed to prevent breakage from logging. See
    85  issues [#180](https://github.com/natebosch/vim-lsc/issues/180) and
    86  [#213](https://github.com/natebosch/vim-lsc/issues/213).
    87  
    88  ## <a href="#cocnvim" id="cocnvim">coc.nvim</a>
    89  
    90  Use [coc.nvim], with the following `coc-settings.json` configuration:
    91  
    92  ```json
    93    "languageserver": {
    94      "go": {
    95        "command": "gopls",
    96        "rootPatterns": ["go.work", "go.mod", ".vim/", ".git/", ".hg/"],
    97        "filetypes": ["go"],
    98        "initializationOptions": {
    99          "usePlaceholders": true
   100        }
   101      }
   102    }
   103  ```
   104  
   105  If you use `go.work` files, you may want to set the
   106  `workspace.workspaceFolderCheckCwd` option. This will force coc.nvim to search
   107  parent directories for `go.work` files, even if the current open directory has
   108  a `go.mod` file. See the
   109  [coc.nvim documentation](https://github.com/neoclide/coc.nvim/wiki/Using-workspaceFolders)
   110  for more details.
   111  
   112  Other [settings](settings.md) can be added in `initializationOptions` too.
   113  
   114  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`:
   115  
   116  ```vim
   117  autocmd BufWritePre *.go :call CocAction('runCommand', 'editor.action.organizeImport')
   118  ```
   119  
   120  ## <a href="#govim" id="govim">govim</a>
   121  
   122  In vim classic only, use the experimental [`govim`], simply follow the [install steps][govim-install].
   123  
   124  ## <a href="#neovim" id="neovim">Neovim v0.5.0+</a>
   125  
   126  To use the new native LSP client in Neovim, make sure you
   127  [install][nvim-install] Neovim v.0.5.0+,
   128  the `nvim-lspconfig` configuration helper plugin, and check the
   129  [`gopls` configuration section][nvim-lspconfig] there.
   130  
   131  ### <a href="#neovim-install" id="neovim-install">Installation</a>
   132  
   133  You can use Neovim's native plugin system.  On a Unix system, you can do that by
   134  cloning the `nvim-lspconfig` repository into the correct directory:
   135  
   136  ```sh
   137  dir="${HOME}/.local/share/nvim/site/pack/nvim-lspconfig/opt/nvim-lspconfig/"
   138  mkdir -p "$dir"
   139  cd "$dir"
   140  git clone 'https://github.com/neovim/nvim-lspconfig.git' .
   141  ```
   142  
   143  ### <a href="#neovim-config" id="neovim-config">Configuration</a>
   144  
   145  nvim-lspconfig aims to provide reasonable defaults, so your setup can be very
   146  brief.
   147  
   148  ```lua
   149  local lspconfig = require("lspconfig")
   150  lspconfig.gopls.setup({})
   151  ```
   152  
   153  However, you can also configure `gopls` for your preferences. Here's an
   154  example that enables `unusedparams`, `staticcheck`, and `gofumpt`.
   155  
   156  ```lua
   157  local lspconfig = require("lspconfig")
   158  lspconfig.gopls.setup({
   159    settings = {
   160      gopls = {
   161        analyses = {
   162          unusedparams = true,
   163        },
   164        staticcheck = true,
   165        gofumpt = true,
   166      },
   167    },
   168  })
   169  ```
   170  
   171  ### <a href="#neovim-imports" id="neovim-imports">Imports and Formatting</a>
   172  
   173  Use the following configuration to have your imports organized on save using
   174  the logic of `goimports` and your code formatted.
   175  
   176  ```lua
   177  autocmd("BufWritePre", {
   178    pattern = "*.go",
   179    callback = function()
   180      local params = vim.lsp.util.make_range_params()
   181      params.context = {only = {"source.organizeImports"}}
   182      -- buf_request_sync defaults to a 1000ms timeout. Depending on your
   183      -- machine and codebase, you may want longer. Add an additional
   184      -- argument after params if you find that you have to write the file
   185      -- twice for changes to be saved.
   186      -- E.g., vim.lsp.buf_request_sync(0, "textDocument/codeAction", params, 3000)
   187      local result = vim.lsp.buf_request_sync(0, "textDocument/codeAction", params)
   188      for cid, res in pairs(result or {}) do
   189        for _, r in pairs(res.result or {}) do
   190          if r.edit then
   191            local enc = (vim.lsp.get_client_by_id(cid) or {}).offset_encoding or "utf-16"
   192            vim.lsp.util.apply_workspace_edit(r.edit, enc)
   193          end
   194        end
   195      end
   196      vim.lsp.buf.format({async = false})
   197    end
   198  })
   199  ```
   200  
   201  ### <a href="#neovim-omnifunc" id="neovim-omnifunc">Omnifunc</a>
   202  
   203  In Neovim v0.8.1 and later if you don't set the option `omnifunc`, it will auto
   204  set to `v:lua.vim.lsp.omnifunc`. If you are using an earlier version, you can
   205  configure it manually:
   206  
   207  ```lua
   208  local on_attach = function(client, bufnr)
   209    -- Enable completion triggered by <c-x><c-o>
   210    vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
   211  end
   212  require('lspconfig').gopls.setup({
   213     on_attach = on_attach
   214  })
   215  ```
   216  
   217  ### <a href="#neovim-links" id="neovim-links">Additional Links</a>
   218  
   219  * [Neovim's official LSP documentation][nvim-docs].
   220  
   221  [vim-go]: https://github.com/fatih/vim-go
   222  [LanguageClient-neovim]: https://github.com/autozimu/LanguageClient-neovim
   223  [ale]: https://github.com/w0rp/ale
   224  [ale-issue-2179]: https://github.com/w0rp/ale/issues/2179
   225  [prabirshrestha/vim-lsp]: https://github.com/prabirshrestha/vim-lsp/
   226  [natebosch/vim-lsc]: https://github.com/natebosch/vim-lsc/
   227  [natebosch/vim-lsc#180]: https://github.com/natebosch/vim-lsc/issues/180
   228  [coc.nvim]: https://github.com/neoclide/coc.nvim/
   229  [`govim`]: https://github.com/myitcv/govim
   230  [govim-install]: https://github.com/myitcv/govim/blob/master/README.md#govim---go-development-plugin-for-vim8
   231  [nvim-docs]: https://neovim.io/doc/user/lsp.html
   232  [nvim-install]: https://github.com/neovim/neovim/wiki/Installing-Neovim
   233  [nvim-lspconfig]: https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#gopls
   234  [nvim-lspconfig-imports]: https://github.com/neovim/nvim-lspconfig/issues/115