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.