Skip to content

Latest commit

 

History

History
234 lines (188 loc) · 7.05 KB

vim.md

File metadata and controls

234 lines (188 loc) · 7.05 KB

Gopls: Using Vim or Neovim

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": {
    "go": {
      "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 for more details.

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 native LSP client in Neovim, make sure you install Neovim v.0.5.0+, the nvim-lspconfig configuration helper plugin, and check the gopls configuration section there.

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:

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' .

nvim-lspconfig aims to provide reasonable defaults, so your setup can be very brief.

local lspconfig = require("lspconfig")
lspconfig.gopls.setup({})

However, you can also configure gopls for your preferences. Here's an example that enables unusedparams, staticcheck, and gofumpt.

local lspconfig = require("lspconfig")
lspconfig.gopls.setup({
  settings = {
    gopls = {
      analyses = {
        unusedparams = true,
      },
      staticcheck = true,
      gofumpt = true,
    },
  },
})

Use the following configuration to have your imports organized on save using the logic of goimports and your code formatted.

autocmd("BufWritePre", {
  pattern = "*.go",
  callback = function()
    local params = vim.lsp.util.make_range_params()
    params.context = {only = {"source.organizeImports"}}
    -- buf_request_sync defaults to a 1000ms timeout. Depending on your
    -- machine and codebase, you may want longer. Add an additional
    -- argument after params if you find that you have to write the file
    -- twice for changes to be saved.
    -- E.g., vim.lsp.buf_request_sync(0, "textDocument/codeAction", params, 3000)
    local result = vim.lsp.buf_request_sync(0, "textDocument/codeAction", params)
    for cid, res in pairs(result or {}) do
      for _, r in pairs(res.result or {}) do
        if r.edit then
          local enc = (vim.lsp.get_client_by_id(cid) or {}).offset_encoding or "utf-16"
          vim.lsp.util.apply_workspace_edit(r.edit, enc)
        end
      end
    end
    vim.lsp.buf.format({async = false})
  end
})

In Neovim v0.8.1 and later if you don't set the option omnifunc, it will auto set to v:lua.vim.lsp.omnifunc. If you are using an earlier version, you can configure it manually:

local on_attach = function(client, bufnr)
  -- Enable completion triggered by <c-x><c-o>
  vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
end
require('lspconfig').gopls.setup({
   on_attach = on_attach
})