summaryrefslogtreecommitdiffstats
path: root/after/plugin/lsp.lua
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--after/plugin/lsp.lua105
1 files changed, 105 insertions, 0 deletions
diff --git a/after/plugin/lsp.lua b/after/plugin/lsp.lua
new file mode 100644
index 0000000..50b6201
--- /dev/null
+++ b/after/plugin/lsp.lua
@@ -0,0 +1,105 @@
+local status_ok, lspconfig = pcall(require, "lspconfig")
+if not status_ok then
+ return
+end
+
+local function lsp_keymaps(bufnr)
+ local map = function(m, lhs, rhs)
+ local opts = {remap = false, silent = true, buffer = bufnr}
+ vim.keymap.set(m, lhs, rhs, opts)
+ end
+
+ -- LSP actions
+ map('n', 'K', '<cmd>lua vim.lsp.buf.hover()<cr>')
+ map('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<cr>')
+ map('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>')
+ map('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<cr>')
+ map('n', 'go', '<cmd>lua vim.lsp.buf.type_definition()<cr>')
+ map('n', 'gr', '<cmd>lua vim.lsp.buf.references()<cr>')
+ map('n', '<S-Tab>', '<cmd>lua vim.lsp.buf.signature_help()<cr>')
+ map('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<cr>')
+ map('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>')
+
+ -- Diagnostics
+ map('n', '<Tab>', '<cmd>lua vim.diagnostic.open_float()<cr>')
+ map('n', '[d', '<cmd>lua vim.diagnostic.goto_prev()<cr>')
+ map('n', ']d', '<cmd>lua vim.diagnostic.goto_next()<cr>')
+end
+
+local function lsp_settings()
+ local sign = function(opts)
+ vim.fn.sign_define(opts.name, {
+ texthl = opts.name,
+ text = opts.text,
+ numhl = ''
+ })
+ end
+
+ sign({name = 'DiagnosticSignError', text = 'x'})
+ sign({name = 'DiagnosticSignWarn', text = '!'})
+ sign({name = 'DiagnosticSignHint', text = 'h'})
+ sign({name = 'DiagnosticSignInfo', text = 'i'})
+
+ vim.diagnostic.config({
+ virtual_text = false,
+ signs = true,
+ update_in_insert = false,
+ underline = true,
+ severity_sort = true,
+ float = {
+ focusable = false,
+ show_header = true,
+ style = 'minimal',
+ border = 'shadow',
+ source = 'always',
+ header = '',
+ prefix = '* ',
+ },
+ })
+
+ vim.lsp.handlers['textDocument/hover'] = vim.lsp.with( vim.lsp.handlers.hover,
+ { border = 'shadow', }
+ )
+
+ vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(
+ vim.lsp.handlers.signature_help,
+ {border = 'shadow'}
+ )
+
+ local command = vim.api.nvim_create_user_command
+
+ command('LspWorkspaceAdd', function()
+ vim.lsp.buf.add_workspace_folder()
+ end, {desc = 'Add folder to workspace'})
+
+ command('LspWorkspaceList', function()
+ vim.notify(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+ end, {desc = 'List workspace folders'})
+
+ command('LspWorkspaceRemove', function()
+ vim.lsp.buf.remove_workspace_folder()
+ end, {desc = 'Remove folder from workspace'})
+end
+
+local function lsp_attach(client, bufnr)
+ local buf_command = vim.api.nvim_buf_create_user_command
+
+ lsp_keymaps(bufnr)
+
+ buf_command(bufnr, 'LspFormat', function()
+ vim.lsp.buf.format()
+ end, {desc = 'Format buffer with language server'})
+end
+
+lsp_settings()
+
+require('mason').setup({})
+require('mason-lspconfig').setup({})
+
+local get_servers = require('mason-lspconfig').get_installed_servers
+for _, server_name in ipairs(get_servers()) do
+ lspconfig[server_name].setup({
+ on_attach = lsp_attach,
+ capabilities = require('cmp_nvim_lsp').default_capabilities(),
+ })
+end