Gopls: Использование Vim или Neovim

vim-go

Используйте vim-go версии 1.20+, со следующей конфигурацией:

<code class="language-vim">let g:go_def_mode='gopls'
let g:go_info_mode='gopls'
</code>

LanguageClient-neovim

Используйте LanguageClient-neovim, со следующей конфигурацией:

<code class="language-vim">" Запуск gopls при использовании файлов Go
let g:LanguageClient_serverCommands = {
  \ 'go': ['gopls']
  \ }
  " Запуск gofmt при сохранении
  autocmd BufWritePre *.go :call LanguageClient#textDocument_formatting_sync()
  </code>

Ale

Используйте ale:

<code class="language-vim">let g:ale_linters = {
  \ 'go': ['gopls'],
  \}
  </code>

см. эту проблему

vim-lsp

Используйте prabirshrestha/vim-lsp, со следующей конфигурацией:

<code class="language-vim">augroup LspGo
au!
autocmd User lsp_setup call lsp#register_server({
  \ 'name': 'gopls',
  \ '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
  </code>

vim-lsc

Используйте natebosch/vim-lsc, со следующей конфигурацией:

<code class="language-vim">let g:lsc_server_commands = {
  \  "go": {
    \    "command": "gopls serve",
    \    "log_level": -1,
    \    "suppress_stderr": v:true,
    \  },
    \}
    </code>

Части log_level и suppress_stderr необходимы для предотвращения сбоев, связанных с логированием. См. #180 и #213.

coc.nvim

Используйте coc.nvim с приведённой ниже конфигурацией coc-settings.json:

<code class="language-json">  "languageserver": {
  "go": {
    "command": "gopls",
    "rootPatterns": ["go.work", "go.mod", ".vim/", ".git/", ".hg/"],
    "filetypes": ["go"],
    "initializationOptions": {
      "usePlaceholders": true
    }
  }
}
</code>

Если вы используете файлы go.work, возможно, стоит установить опцию workspace.workspaceFolderCheckCwd. Это заставит coc.nvim искать файлы go.work в родительских директориях, даже если в текущей открытой директории имеется файл go.mod. См. документацию coc.nvim для получения дополнительной информации.

Другие настройки также могут быть добавлены в initializationOptions.

Действие кода editor.action.organizeImport будет автоматически форматировать код и добавлять недостающие импорты. Чтобы запускать это автоматически при сохранении, добавьте следующую строку в ваш init.vim:

<code class="language-vim">autocmd BufWritePre *.go :call CocAction('runCommand', 'editor.action.organizeImport')
</code>

govim

Только в классическом vim, используйте экспериментальный govim, просто следуйте инструкциям по установке.

Neovim v0.5.0+

Чтобы использовать новый нативный клиент LSP в Neovim, убедитесь, что вы установили Neovim v.0.5.0+, плагин-помощник для конфигурации nvim-lspconfig и ознакомьтесь с разделом конфигурации gopls.

Установка

Можно использовать нативную систему плагинов Neovim. В Unix-системе это можно сделать, клонировав репозиторий nvim-lspconfig в нужную директорию:

<code class="language-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' .
</code>

Конфигурация

nvim-lspconfig стремится предоставить разумные значения по умолчанию, поэтому ваша настройка может быть очень краткой.

<code class="language-lua">local lspconfig = require("lspconfig")
lspconfig.gopls.setup({})
</code>

Тем не менее, вы также можете настроить gopls под свои предпочтения. Ниже приведён пример, который включает unusedparams, staticcheck и gofumpt.

<code class="language-lua">local lspconfig = require("lspconfig")
lspconfig.gopls.setup({
  settings = {
    gopls = {
      analyses = {
        unusedparams = true,
      },
      staticcheck = true,
      gofumpt = true,
    },
  },
})
</code>

Импорты и форматирование

Используйте следующую конфигурацию, чтобы ваши импорты автоматически упорядочивались при сохранении с использованием логики goimports и ваш код форматировался.

<code class="language-lua">autocmd("BufWritePre", {
  pattern = "*.go",
  callback = function()
  local params = vim.lsp.util.make_range_params()
  params.context = {only = {"source.organizeImports"}}
  -- buf_request_sync по умолчанию имеет таймаут в 1000 мс. В зависимости от вашей
  -- машины и размера проекта, возможно, вам понадобится увеличить время ожидания. Добавьте дополнительный
  -- аргумент после params, если вы обнаружите, что изменения не сохраняются до второго сохранения файла.
  -- Например, 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
})
</code>

Omnifunc

В Neovim v0.8.1 и выше, если вы не установите опцию omnifunc, она будет автоматически установлена в v:lua.vim.lsp.omnifunc. Если вы используете более раннюю версию, вы можете настроить её вручную:

<code class="language-lua">local on_attach = function(client, bufnr)
-- Включить автозаполнение при помощи <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
})
</code>

Исходные файлы этой документации можно найти в golang.org/x/tools/gopls/doc.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang