local Remap = require("halfdan.keymap") local nnoremap = Remap.nnoremap local inoremap = Remap.inoremap -- TODO figure out why this don't work vim.fn.sign_define( "LspDiagnosticsSignError", {texthl = "LspDiagnosticsSignError", text = "", numhl = "LspDiagnosticsSignError"} ) vim.fn.sign_define( "LspDiagnosticsSignWarning", {texthl = "LspDiagnosticsSignWarning", text = "", numhl = "LspDiagnosticsSignWarning"} ) vim.fn.sign_define( "LspDiagnosticsSignHint", {texthl = "LspDiagnosticsSignHint", text = "", numhl = "LspDiagnosticsSignHint"} ) vim.fn.sign_define( "LspDiagnosticsSignInformation", {texthl = "LspDiagnosticsSignInformation", text = "", numhl = "LspDiagnosticsSignInformation"} ) -- Set Default Prefix. -- Note: You can set a prefix per lsp server in the lv-globals.lua file vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with( vim.lsp.diagnostic.on_publish_diagnostics, { virtual_text = { prefix = "", spacing = 1, }, signs = true, underline = true, } ) -- symbols for autocomplete vim.lsp.protocol.CompletionItemKind = { "  (Text) ", "  (Method)", "  (Function)", "  (Constructor)", " ﴲ (Field)", "[] (Variable)", "  (Class)", " ﰮ (Interface)", "  (Module)", " 襁 (Property)", "  (Unit)", "  (Value)", " 練 (Enum)", "  (Keyword)", "  (Snippet)", "  (Color)", "  (File)", "  (Reference)", "  (Folder)", "  (EnumMember)", " ﲀ (Constant)", " ﳤ (Struct)", "  (Event)", "  (Operator)", "  (TypeParameter)" } local function documentHighlight(client, bufnr) -- Set autocommands conditional on server_capabilities if client.resolved_capabilities.document_highlight then vim.api.nvim_exec( [[ hi LspReferenceRead cterm=bold ctermbg=red guibg=#464646 hi LspReferenceText cterm=bold ctermbg=red guibg=#464646 hi LspReferenceWrite cterm=bold ctermbg=red guibg=#464646 augroup lsp_document_highlight autocmd! * autocmd CursorHold lua vim.lsp.buf.document_highlight() autocmd CursorMoved lua vim.lsp.buf.clear_references() augroup END ]], false ) end end -- needed for the LSP to recognize elixir files (alternativly just use elixir-editors/vim-elixir) vim.cmd([[ au BufRead,BufNewFile *.ex,*.exs set filetype=elixir au BufRead,BufNewFile *.eex,*.leex,*.sface set filetype=eelixir au BufRead,BufNewFile mix.lock set filetype=elixir ]]) -- Diagnostic keymaps vim.api.nvim_set_keymap('n', 'e', 'lua vim.diagnostic.open_float()', { noremap = true, silent = true }) vim.api.nvim_set_keymap('n', 'q', 'lua vim.diagnostic.setloclist()', { noremap = true, silent = true }) -- LSP settings local lspconfig = require 'lspconfig' local function config(_config) return vim.tbl_deep_extend("force", { capabilities = require("cmp_nvim_lsp").update_capabilities(vim.lsp.protocol.make_client_capabilities()), on_attach = function() -- local opts = { noremap = true, silent = true } nnoremap("gd", function() vim.lsp.buf.definition() end) nnoremap("gD", function() vim.lsp.buf.declaration() end) nnoremap("K", function() vim.lsp.buf.hover() end) nnoremap("gW", function() vim.lsp.buf.workspace_symbol() end) nnoremap("vd", function() vim.diagnostic.open_float() end) nnoremap("[d", function() vim.diagnostic.goto_next() end) nnoremap("]d", function() vim.diagnostic.goto_prev() end) nnoremap("ca", function() vim.lsp.buf.code_action() end) nnoremap("rr", function() vim.lsp.buf.references() end) nnoremap("rn", function() vim.lsp.buf.rename() end) nnoremap("cl", function() vim.lsp.codelens.run() end) inoremap("", function() vim.lsp.buf.signature_help() end) --vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gi', 'lua vim.lsp.buf.implementation()', opts) -- vim.api.nvim_buf_set_keymap(bufnr, 'n', '', 'lua vim.lsp.buf.signature_help()', opts) -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'D', 'lua vim.lsp.buf.type_definition()', opts) -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'ca', 'lua vim.lsp.buf.code_action()', opts) -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'so', [[lua require('telescope.builtin').lsp_document_symbols()]], opts) -- vim.cmd [[ command! Format execute 'lua vim.lsp.buf.formatting()' ]] end, }, _config or {}) end local elixir = require('elixir') elixir.setup(config({ cmd = {"/home/halfdan/opt/elixir-ls/bin/language_server.sh"}, settings = elixir.settings({ dialyzerEnabled = true, fetchDeps = false, enableTestLenses = true, suggestSpecs = false, }), })) -- Enable the following language servers local servers = { 'gopls', 'julials', 'rust_analyzer', 'pyright' } for _, lsp in ipairs(servers) do lspconfig[lsp].setup(config()) end require('rust-tools').setup({ tools = { inlay_hints = { parameter_hints_prefix = "← ", other_hints_prefix = "➜ ", } } }) --vim.cmd([[ --augroup --autocmd! --autocmd BufWritePre *.go lua vim.lsp.buf.formatting_sync(nil, 100) --autocmd BufWritePre *.rs lua vim.lsp.buf.formatting_sync(nil, 100) --autocmd BufWritePre *.ex,*.exs lua vim.lsp.buf.formatting_sync(nil, 100) --autocmd BufWritePre *.py lua vim.lsp.buf.formatting_sync(nil, 100) --augroup END --]])