summaryrefslogtreecommitdiff
path: root/.config/nvim/lua/lsp_config.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/lua/lsp_config.lua')
-rw-r--r--.config/nvim/lua/lsp_config.lua264
1 files changed, 264 insertions, 0 deletions
diff --git a/.config/nvim/lua/lsp_config.lua b/.config/nvim/lua/lsp_config.lua
new file mode 100644
index 0000000..20eecd1
--- /dev/null
+++ b/.config/nvim/lua/lsp_config.lua
@@ -0,0 +1,264 @@
+-- show diagnostic messages in quickfix list with <M-q>
+vim.diagnostic.config({
+ virtual_text = false,
+ signs = true,
+ float = { border = 'single' },
+})
+vim.keymap.set("n", "<M-q>", function()
+ -- toggle quickfix list
+ local windows = vim.fn.getwininfo()
+ local qf_opened = false
+ for i = 1, #windows, 1 do
+ local window = windows[i]
+ if window.quickfix == 1 then
+ qf_opened = true
+ break
+ end
+ end
+ if qf_opened then
+ vim.api.nvim_command("cclose")
+ else
+ vim.diagnostic.setqflist()
+ end
+end)
+
+-- setup and config nvim-cmp completion
+local cmp = require("cmp")
+cmp.register_source("nvim_lsp_signature_help", require("cmp_nvim_lsp_signature_help").new())
+
+cmp.setup({
+ -- set vim-vsnip as snippet engine for nvim-cmp completion
+ snippet = {
+ expand = function(args)
+ vim.fn["vsnip#anonymous"](args.body)
+ end,
+ },
+ mapping = cmp.mapping.preset.insert {
+ ['<CR>'] = cmp.mapping.confirm({ select = true }),
+ ['<C-Down>'] = cmp.mapping.scroll_docs(4),
+ ['<C-Up>'] = cmp.mapping.scroll_docs(-4),
+ },
+ -- complete based on LSP, Snippets and Buffer
+ sources = cmp.config.sources({
+ { name = 'nvim_lsp' },
+ { name = 'vsnip' },
+ }, {
+ { name = 'buffer' },
+ })
+})
+
+-- Jump forward or backward to snippet placeholders in insert mode
+vim.api.nvim_set_keymap("i", "<C-l>", "<Plug>(vsnip-jump-next)", { noremap = false })
+vim.api.nvim_set_keymap("s", "<C-l>", "<Plug>(vsnip-jump-next)", { noremap = false })
+vim.api.nvim_set_keymap("i", "<C-h>", "<Plug>(vsnip-jump-prev)", { noremap = false })
+vim.api.nvim_set_keymap("s", "<C-h>", "<Plug>(vsnip-jump-prev)", { noremap = false })
+
+
+-- complete text in search based on buffer
+cmp.setup.cmdline('/', {
+ mapping = cmp.mapping.preset.cmdline(),
+ sources = {
+ { name = 'buffer' }
+ }
+})
+
+-- compete path in commandline
+cmp.setup.cmdline(':', {
+ mapping = cmp.mapping.preset.cmdline(),
+ sources = cmp.config.sources({
+ { name = 'path' }
+ }, {
+ { name = 'cmdline' }
+ }),
+})
+
+-- add additional completion capabilities
+local capabilities = require('cmp_nvim_lsp').default_capabilities()
+
+
+-- attaches settings after language server attaches to current buffer
+local on_attach = function(client, bufnr)
+ local bufopts = { noremap = true, silent = true, buffer = bufnr }
+ vim.keymap.set("n", "gd", vim.lsp.buf.definition, bufopts)
+ vim.keymap.set("n", "gr", vim.lsp.buf.references, bufopts)
+ vim.keymap.set("n", "gi", vim.lsp.buf.implementation, bufopts)
+ vim.keymap.set("n", "K", vim.lsp.buf.hover, bufopts)
+ vim.api.nvim_create_autocmd("BufWritePre", {
+ pattern = "*",
+ callback = function()
+ vim.lsp.buf.format {
+ async = false
+ }
+ end,
+ })
+end
+
+for _, method in ipairs({ 'textDocument/diagnostic', 'workspace/diagnostic' }) do
+ local default_diagnostic_handler = vim.lsp.handlers[method]
+ vim.lsp.handlers[method] = function(err, result, context, config)
+ if err ~= nil and err.code == -32802 then
+ return
+ end
+ return default_diagnostic_handler(err, result, context, config)
+ end
+end
+
+-- Language Servers
+
+-- Rust
+vim.lsp.config('rust_analyzer', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+ settings = {
+ ["rust-analyzer"] = {
+ checkOnSave = {
+ command = "clippy"
+ },
+ assist = {
+ importGranularity = "module",
+ importPrefix = "by_self",
+ },
+ cargo = {
+ loadOutDirsFromCheck = true
+ },
+ procMacro = {
+ enable = true
+ },
+ },
+ },
+})
+vim.lsp.enable('rust_analyzer')
+
+-- Bash
+vim.lsp.config('bashls', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('bashls')
+
+-- Python
+vim.lsp.config('jedi_language_server', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('jedi_language_server')
+
+-- HTML
+vim.lsp.config('html', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('html')
+
+-- CSS
+vim.lsp.config('cssls', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('cssl')
+
+-- Tex
+vim.lsp.config('texlab', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('texlab')
+
+-- Svelte
+vim.lsp.config('svelte', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('svelte')
+
+-- Typescript & Javascript
+vim.lsp.config('ts_ls', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+ filetypes = { "typescript", "javascript" },
+})
+vim.lsp.enable('ts_ls')
+
+-- JSON
+vim.lsp.config('jsonls', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('jsonls')
+
+-- Lua
+vim.lsp.config('lua_ls', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+ settings = {
+ Lua = {
+ diagnostics = {
+ globals = { "vim", "on_attach" }
+ },
+ workspace = {
+ library = vim.api.nvim_get_runtime_file("", true),
+ }
+ }
+ }
+})
+vim.lsp.enable('lua_ls')
+
+-- Java
+vim.lsp.config('jdtls', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('jdtls')
+
+-- C lang
+vim.lsp.config('clangd', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('clangd')
+
+-- Nushell
+vim.lsp.config('nushell', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('nushell')
+
+-- Go
+vim.lsp.config('gopls', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+})
+vim.lsp.enable('gopls')
+
+-- Tailwind
+vim.lsp.config('tailwindcss', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+ init_options = {
+ userLanguages = {
+ rust = "html",
+ }
+ },
+ filetypes = {
+ "html",
+ "svelte",
+ "rust"
+ }
+})
+vim.lsp.enable('tailwindcss')
+
+-- Elixir
+vim.lsp.config('expert', {
+ capabilities = capabilities,
+ on_attach = on_attach,
+ --cmd = { 'bash', '/home/thev2/expert/apps/expert/_build/prod/rel/plain/bin/start_expert', '--stdio' },
+ cmd = { 'expert', '--stdio' },
+ root_markers = { 'mix.exs', '.git' },
+ filetypes = { 'elixir', 'eelixir', 'heex' },
+})
+vim.lsp.enable('expert')
+
+
+-- show nvim-lsp progress
+require "fidget".setup {}