diff options
| author | srdusr <trevorgray@srdusr.com> | 2022-10-12 23:55:30 +0200 |
|---|---|---|
| committer | srdusr <trevorgray@srdusr.com> | 2022-10-12 23:55:30 +0200 |
| commit | c349d1f7998d97f60d3a3945ce8da166b33bf1c8 (patch) | |
| tree | 44c5e071849d1b8cf1a7ad398ead42cfe75d6585 /lua/plugins/lsp.lua | |
| download | dotfiles-c349d1f7998d97f60d3a3945ce8da166b33bf1c8.tar.gz dotfiles-c349d1f7998d97f60d3a3945ce8da166b33bf1c8.zip | |
Initial commit
Diffstat (limited to 'lua/plugins/lsp.lua')
| -rw-r--r-- | lua/plugins/lsp.lua | 227 |
1 files changed, 227 insertions, 0 deletions
diff --git a/lua/plugins/lsp.lua b/lua/plugins/lsp.lua new file mode 100644 index 0000000..5e7a680 --- /dev/null +++ b/lua/plugins/lsp.lua @@ -0,0 +1,227 @@ +local fn = vim.fn +local api = vim.api +local keymap = vim.keymap +local lsp = vim.lsp + +local utils = require("utils") + +local custom_attach = function(client, bufnr) + -- Mappings. + local map = function(mode, l, r, opts) + opts = opts or {} + opts.silent = true + opts.buffer = bufnr + keymap.set(mode, l, r, opts) + end + + map("n", "gd", vim.lsp.buf.definition, { desc = "go to definition" }) + map("n", "<C-]>", vim.lsp.buf.definition) + map("n", "K", vim.lsp.buf.hover) + map("n", "<C-k>", vim.lsp.buf.signature_help) + map("n", "<space>rn", vim.lsp.buf.rename, { desc = "varialbe rename" }) + map("n", "gr", vim.lsp.buf.references, { desc = "show references" }) + map("n", "[d", vim.diagnostic.goto_prev, { desc = "previous diagnostic" }) + map("n", "]d", vim.diagnostic.goto_next, { desc = "next diagnostic" }) + map("n", "<space>q", function() + vim.diagnostic.setqflist({ open = true }) + end, { desc = "put diagnostic to qf" }) + map("n", "<space>ca", vim.lsp.buf.code_action, { desc = "LSP code action" }) + map("n", "<space>wa", vim.lsp.buf.add_workspace_folder, { desc = "add workspace folder" }) + map("n", "<space>wr", vim.lsp.buf.remove_workspace_folder, { desc = "remove workspace folder" }) + map("n", "<space>wl", function() + inspect(vim.lsp.buf.list_workspace_folders()) + end, { desc = "list workspace folder" }) + + -- Set some key bindings conditional on server capabilities + if client.server_capabilities.documentFormattingProvider then + map("n", "<space>f", vim.lsp.buf.format, { desc = "format code" }) + end + + api.nvim_create_autocmd("CursorHold", { + buffer = bufnr, + callback = function() + local float_opts = { + focusable = false, + close_events = { "BufLeave", "CursorMoved", "InsertEnter", "FocusLost" }, + border = "rounded", + source = "always", -- show source in diagnostic popup window + prefix = " ", + } + + if not vim.b.diagnostics_pos then + vim.b.diagnostics_pos = { nil, nil } + end + + local cursor_pos = api.nvim_win_get_cursor(0) + if + (cursor_pos[1] ~= vim.b.diagnostics_pos[1] or cursor_pos[2] ~= vim.b.diagnostics_pos[2]) + and #vim.diagnostic.get() > 0 + then + vim.diagnostic.open_float(nil, float_opts) + end + + vim.b.diagnostics_pos = cursor_pos + end, + }) + + -- The blow command will highlight the current variable and its usages in the buffer. + if client.server_capabilities.documentHighlightProvider then + vim.cmd([[ + hi! link LspReferenceRead Visual + hi! link LspReferenceText Visual + hi! link LspReferenceWrite Visual + 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 + ]]) + end + + if vim.g.logging_level == "debug" then + local msg = string.format("Language server %s started!", client.name) + vim.notify(msg, vim.log.levels.DEBUG, { title = "Nvim-config" }) + end +end + +local capabilities = lsp.protocol.make_client_capabilities() +capabilities = require("cmp_nvim_lsp").update_capabilities(capabilities) +capabilities.textDocument.completion.completionItem.snippetSupport = true + +local lspconfig = require("lspconfig") + +if utils.executable("pylsp") then + lspconfig.pylsp.setup({ + on_attach = custom_attach, + settings = { + pylsp = { + plugins = { + pylint = { enabled = true, executable = "pylint" }, + pyflakes = { enabled = false }, + pycodestyle = { enabled = false }, + jedi_completion = { fuzzy = true }, + pyls_isort = { enabled = true }, + pylsp_mypy = { enabled = true }, + }, + }, + }, + flags = { + debounce_text_changes = 200, + }, + capabilities = capabilities, + }) +else + vim.notify("pylsp not found!", vim.log.levels.WARN, { title = "Nvim-config" }) +end + +-- if utils.executable('pyright') then +-- lspconfig.pyright.setup{ +-- on_attach = custom_attach, +-- capabilities = capabilities +-- } +-- else +-- vim.notify("pyright not found!", vim.log.levels.WARN, {title = 'Nvim-config'}) +-- end + +if utils.executable("clangd") then + lspconfig.clangd.setup({ + on_attach = custom_attach, + capabilities = capabilities, + filetypes = { "c", "cpp", "cc" }, + flags = { + debounce_text_changes = 500, + }, + }) +else + vim.notify("clangd not found!", vim.log.levels.WARN, { title = "Nvim-config" }) +end + +-- set up vim-language-server +if utils.executable("vim-language-server") then + lspconfig.vimls.setup({ + on_attach = custom_attach, + flags = { + debounce_text_changes = 500, + }, + capabilities = capabilities, + }) +else + vim.notify("vim-language-server not found!", vim.log.levels.WARN, { title = "Nvim-config" }) +end + +-- set up bash-language-server +if utils.executable("bash-language-server") then + lspconfig.bashls.setup({ + on_attach = custom_attach, + capabilities = capabilities, + }) +end + +if utils.executable("lua-language-server") then + -- settings for lua-language-server can be found on https://github.com/sumneko/lua-language-server/wiki/Settings . + lspconfig.sumneko_lua.setup({ + on_attach = custom_attach, + settings = { + Lua = { + runtime = { + -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) + version = "LuaJIT", + }, + diagnostics = { + -- Get the language server to recognize the `vim` global + globals = { "vim" }, + }, + workspace = { + -- Make the server aware of Neovim runtime files, + -- see also https://github.com/sumneko/lua-language-server/wiki/Libraries#link-to-workspace . + -- Lua-dev.nvim also has similar settings for sumneko lua, https://github.com/folke/lua-dev.nvim/blob/main/lua/lua-dev/sumneko.lua . + library = { + fn.stdpath("data") .. "/site/pack/packer/opt/emmylua-nvim", + fn.stdpath("config"), + }, + maxPreload = 2000, + preloadFileSize = 50000, + }, + }, + }, + capabilities = capabilities, + }) +end + +-- Change diagnostic signs. +--fn.sign_define("DiagnosticSignError", { text = "✗", texthl = "DiagnosticSignError" }) +--fn.sign_define("DiagnosticSignWarn", { text = "!", texthl = "DiagnosticSignWarn" }) +--fn.sign_define("DiagnosticSignInformation", { text = "", texthl = "DiagnosticSignInfo" }) +--fn.sign_define("DiagnosticSignHint", { text = "", texthl = "DiagnosticSignHint" }) + +-- global config for diagnostic +vim.diagnostic.config({ + underline = false, + virtual_text = false, + signs = true, + severity_sort = true, +}) + +lsp.handlers["textDocument/publishDiagnostics"] = lsp.with(lsp.diagnostic.on_publish_diagnostics, { + underline = false, + virtual_text = false, + signs = true, + update_in_insert = false, +}) + +--local signs = { Error = " ", Warn = " ", Info = " ", Hint = " " } +local signs = { Error = "✘", Warn = "▲", Info = "", Hint = "⚑" } +for type, icon in pairs(signs) do + local hl = "DiagnosticSign" .. type + vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) +end + +--sign({name = 'DiagnosticSignError', text = '✘'}) +--sign({name = 'DiagnosticSignWarn', text = '▲'}) +--sign({name = 'DiagnosticSignHint', text = '⚑'}) +--sign({name = 'DiagnosticSignInfo', text = ''}) + +-- Change border of documentation hover window, See https://github.com/neovim/neovim/pull/13998. +lsp.handlers["textDocument/hover"] = lsp.with(vim.lsp.handlers.hover, { + border = "rounded", +}) |
