Last active
May 29, 2024 08:22
-
-
Save sergii4/afd763bb378aec45aba17c20b3cf2115 to your computer and use it in GitHub Desktop.
Minimal nvim lsp go configuration
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
call plug#begin() | |
Plug 'neovim/nvim-lspconfig' | |
call plug#end() | |
lua require("lsp_config") | |
autocmd BufWritePre *.go lua vim.lsp.buf.formatting() | |
autocmd BufWritePre *.go lua goimports(1000) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
local nvim_lsp = require('lspconfig') | |
local capabilities = vim.lsp.protocol.make_client_capabilities() | |
capabilities.textDocument.completion.completionItem.snippetSupport = true | |
local on_attach = function(client, bufnr) | |
local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end | |
local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end | |
buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') | |
-- Mappings. | |
local opts = { noremap=true, silent=true } | |
buf_set_keymap('n', 'gD', '<Cmd>lua vim.lsp.buf.declaration()<CR>', opts) | |
buf_set_keymap('n', 'gd', '<Cmd>lua vim.lsp.buf.definition()<CR>', opts) | |
buf_set_keymap('n', 'ga', '<Cmd>lua vim.lsp.buf.code_action()<CR>', opts) | |
buf_set_keymap('n', 'K', '<Cmd>lua vim.lsp.buf.hover()<CR>', opts) | |
buf_set_keymap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opts) | |
buf_set_keymap('n', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts) | |
buf_set_keymap('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts) | |
buf_set_keymap('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts) | |
buf_set_keymap('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts) | |
buf_set_keymap('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts) | |
buf_set_keymap('n', '<space>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opts) | |
buf_set_keymap('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opts) | |
buf_set_keymap('n', '<space>e', '<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>', opts) | |
buf_set_keymap('n', '[d', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts) | |
buf_set_keymap('n', ']d', '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts) | |
buf_set_keymap('n', '<space>q', '<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>', opts) | |
-- Set some keybinds conditional on server capabilities | |
if client.resolved_capabilities.document_formatting then | |
buf_set_keymap("n", "ff", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts) | |
elseif client.resolved_capabilities.document_range_formatting then | |
buf_set_keymap("n", "ff", "<cmd>lua vim.lsp.buf.range_formatting()<CR>", opts) | |
end | |
-- Set autocommands conditional on server_capabilities | |
if client.resolved_capabilities.document_highlight then | |
vim.api.nvim_exec([[ | |
hi LspReferenceRead cterm=bold ctermbg=DarkMagenta guibg=LightYellow | |
hi LspReferenceText cterm=bold ctermbg=DarkMagenta guibg=LightYellow | |
hi LspReferenceWrite cterm=bold ctermbg=DarkMagenta guibg=LightYellow | |
augroup lsp_document_highlight | |
autocmd! * <buffer> | |
autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight() | |
autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references() | |
augroup END | |
]], false) | |
end | |
end | |
nvim_lsp.gopls.setup{ | |
cmd = {'gopls'}, | |
-- for postfix snippets and analyzers | |
capabilities = capabilities, | |
settings = { | |
gopls = { | |
experimentalPostfixCompletions = true, | |
analyses = { | |
unusedparams = true, | |
shadow = true, | |
}, | |
staticcheck = true, | |
}, | |
}, | |
on_attach = on_attach, | |
} | |
function goimports(timeoutms) | |
local context = { source = { organizeImports = true } } | |
vim.validate { context = { context, "t", true } } | |
local params = vim.lsp.util.make_range_params() | |
params.context = context | |
-- See the implementation of the textDocument/codeAction callback | |
-- (lua/vim/lsp/handler.lua) for how to do this properly. | |
local result = vim.lsp.buf_request_sync(0, "textDocument/codeAction", params, timeout_ms) | |
if not result or next(result) == nil then return end | |
local actions = result[1].result | |
if not actions then return end | |
local action = actions[1] | |
-- textDocument/codeAction can return either Command[] or CodeAction[]. If it | |
-- is a CodeAction, it can have either an edit, a command or both. Edits | |
-- should be executed first. | |
if action.edit or type(action.command) == "table" then | |
if action.edit then | |
vim.lsp.util.apply_workspace_edit(action.edit) | |
end | |
if type(action.command) == "table" then | |
vim.lsp.buf.execute_command(action.command) | |
end | |
else | |
vim.lsp.buf.execute_command(action) | |
end | |
end | |
--vim.lsp.set_log_level("debug") |
Author
sergii4
commented
Apr 14, 2021
•
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment