require 'andr3.lsp_adds.prettier' require 'andr3.lsp_adds.null-ls' require 'andr3.lsp_adds.lsp_signature' local icons = require 'andr3.lsp_adds.icons' vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with( vim.lsp.diagnostic.on_publish_diagnostics, { -- Enable underline, use default values underline = true, -- Enable virtual text, override spacing to 4 virtual_text = { spacing = 4, prefix = '~', }, -- Use a function to dynamically turn signs off -- and on, using buffer local variables signs = function(bufnr, client_id) local ok, result = pcall(vim.api.nvim_buf_get_var, bufnr, 'show_signs') -- No buffer local variable set, so just enable by default if not ok then return true end return result end, -- Disable a feature update_in_insert = false, } ) -- vim.diagnostic.config({ virtual_text = { prefix = '🅰', } }) for type, icon in pairs(icons.signs) do local hl = "DiagnosticSign" .. type vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl }) end -- lspkind require('lspkind').init({ mode = 'symbol_text', preset = 'codicons', symbol_map = icons.kind_icons, }) -- Saga local keymap = vim.keymap.set local saga = require'lspsaga' local signs = icons.signs -- saga.init_lsp_saga{ saga.setup{ border_style = "single", saga_winblend = 0, move_in_saga = { prev = '',next = ''}, diagnostic_header = { signs.Error, signs.Warn, signs.Hint, signs.Info }, max_preview_lines = 10, code_action_icon = signs.CodeAction, code_action_num_shortcut = true, code_action_lightbulb = { enable = true, enable_in_insert = true, cache_code_action = true, sign = true, icon = signs.CodeAction, update_time = 150, sign_priority = 20, virtual_text = true, }, finder_icons = { def = ' ', ref = '諭 ', link = ' ', }, finder_request_timeout = 1500, finder_action_keys = { open = {'o', ''}, vsplit = 's', split = 'i', tabe = 't', quit = {'q', ''}, }, code_action_keys = { quit = 'q', exec = '', }, definition_action_keys = { edit = 'o', vsplit = 'v', split = 'i', tabe = 't', quit = 'q', }, rename_action_quit = '', rename_in_select = true, symbol_in_winbar = { in_custom = false, enable = true, separator = ' ', show_file = true, file_formatter = "", click_support = false, }, show_outline = { win_position = 'right', win_with = '', win_width = 30, auto_enter = true, auto_preview = true, virt_text = '┃', jump_key = 'o', auto_refresh = true, }, custom_kind = {}, server_filetype_map = {}, ui = { code_action = signs.CodeAction, } } keymap("n", "sf", "Lspsaga lsp_finder", { silent = true }) keymap("n", "t", "terminal", { silent = true }) keymap({"n","v"}, "ca", function () saga.code_action() end, {}) keymap("n", "gr", "Lspsaga rename", { silent = true }) keymap("n", "gd", "Lspsaga peek_definition", { silent = true }) keymap("n", "cd", "Lspsaga show_cursor_diagnostics", { silent = true }) keymap("n", "cr", "Lspsaga rename", { silent = true }) keymap('n', 'e', 'lua vim.diagnostic.open_float()', { silent = true }) keymap("n", "[e", "Lspsaga diagnostic_jump_prev", { silent = true }) keymap("n", "]e", "Lspsaga diagnostic_jump_next", { silent = true }) keymap("n", "[E", function() require("lspsaga.diagnostic").goto_prev({ severity = vim.diagnostic.severity.ERROR }) end, { silent = true }) keymap("n", "]E", function() require("lspsaga.diagnostic").goto_next({ severity = vim.diagnostic.severity.ERROR }) end, { silent = true }) -- keymap("n","o", "LSoutlineToggle",{ silent = true }) keymap("n", "K", "Lspsaga hover_doc", { silent = true }) keymap("n", "", "Lspsaga open_floaterm", { silent = true }) keymap("n", "", "Lspsaga open_floaterm lazygit", { silent = true }) keymap("t", "", [[Lspsaga close_floaterm]], { silent = true }) -- Comp local cmp = require'cmp' cmp.setup{ snippet = { expand = function(args) vim.fn["vsnip#anonymous"](args.body) end, }, window = { completion = { winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None", col_offset = -3, side_padding = 0, }, }, formatting = { fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) local kind = require("lspkind").cmp_format({ mode = "symbol_text", maxwidth = 50 })(entry, vim_item) local strings = vim.split(kind.kind, "%s", { trimempty = true }) kind.kind = " " .. strings[1] .. " " if entry.completion_item.detail then kind.menu = ' "'..entry.completion_item.detail..'"' end kind.menu = (kind.menu or "").." (" .. strings[2] .. ") " return kind end, }, mapping = cmp.mapping.preset.insert({ [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.abort(), [''] = cmp.mapping.confirm({ select = true }), }), sources = cmp.config.sources({ { name = 'nvim_lsp' }, { name = 'vsnip' }, }, { { name = 'buffer' }, }) } -- Use buffer source for `/` and `?` (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline({ '/', '?' }, { mapping = cmp.mapping.preset.cmdline(), sources = { { name = 'buffer' } } }) -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). cmp.setup.cmdline(':', { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'path' } }, { { name = 'cmdline' } }) }) -- Set up lspconfig. local capabilities = require('cmp_nvim_lsp').default_capabilities() -- Mappings. -- See `:help vim.diagnostic.*` for documentation on any of the below functions local opts = { noremap=true, silent=true } vim.keymap.set('n', 'e', vim.diagnostic.open_float, opts) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) vim.keymap.set('n', 'q', vim.diagnostic.setloclist, opts) -- Use an on_attach function to only map the following keys -- after the language server attaches to the current buffer local on_attach = function(client, bufnr) require "lsp_signature".on_attach({ bind = true, handler_opts = { border = "rounded" } }, bufnr) -- Enable completion triggered by vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. -- See `:help vim.lsp.*` for documentation on any of the below functions local bufopts = { noremap=true, silent=true, buffer=bufnr } vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts) vim.keymap.set('n', '', vim.lsp.buf.signature_help, bufopts) vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, bufopts) vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, bufopts) vim.keymap.set('n', 'wl', function() print(vim.inspect(vim.lsp.buf.list_workspace_folders())) end, bufopts) vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, bufopts) vim.keymap.set('n', 'rn', vim.lsp.buf.rename, bufopts) vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, bufopts) vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) vim.keymap.set('n', 'gf', function() vim.lsp.buf.format { async = true } end, bufopts) end local lsp_flags = { -- This is the default in Nvim 0.7+ debounce_text_changes = 150, } require 'andr3.langs.rust'.setup(on_attach, lsp_flags, capabilities) require 'andr3.langs.ts'.setup(on_attach, lsp_flags, capabilities) require 'andr3.langs.prisma'.setup(on_attach, lsp_flags, capabilities) require 'andr3.langs.svelte'.setup(on_attach, lsp_flags, capabilities) require 'andr3.langs.ccls'.setup(on_attach, lsp_flags, capabilities) require 'andr3.langs.python'.setup(on_attach, lsp_flags, capabilities) require 'andr3.langs.bash'.setup(on_attach, lsp_flags, capabilities) require 'andr3.langs.zig'.setup(on_attach, lsp_flags, capabilities) require 'andr3.langs.tex'.setup(on_attach, lsp_flags, capabilities) require 'andr3.langs.ocaml'.setup(on_attach, lsp_flags, capabilities)