diff --git a/nix/home/programs/nvim/default.nix b/nix/home/programs/nvim/default.nix index 13659dd..ddcab67 100644 --- a/nix/home/programs/nvim/default.nix +++ b/nix/home/programs/nvim/default.nix @@ -69,51 +69,21 @@ with builtins; ''; } vim-surround - fugitive - { - plugin = easymotion; - config = '' - map / (easymotion-sn) - omap / (easymotion-tn) - map n (easymotion-next) - map N (easymotion-prev) - let g:EasyMotion_landing_highlight = 0 - ''; - } + neogit + gitsigns-nvim vinegar undotree + vim-goyo { - plugin = nvim-compe; + plugin = nvim-cmp; config = '' - set completeopt=menuone,noselect - let g:compe = {} - let g:compe.enabled = v:true - let g:compe.autocomplete = v:true - let g:compe.debug = v:false - let g:compe.min_length = 1 - let g:compe.preselect = 'enable' - let g:compe.throttle_time = 80 - let g:compe.source_timeout = 200 - let g:compe.resolve_timeout = 800 - let g:compe.incomplete_delay = 400 - let g:compe.max_abbr_width = 100 - let g:compe.max_kind_width = 100 - let g:compe.max_menu_width = 100 - let g:compe.documentation = v:true - - let g:compe.source = {} - let g:compe.source.path = v:true - let g:compe.source.buffer = v:true - let g:compe.source.calc = v:true - let g:compe.source.nvim_lsp = v:true - let g:compe.source.nvim_lua = v:true - let g:compe.source.vsnip = v:true - let g:compe.source.ultisnips = v:true - let g:compe.source.luasnip = v:true - let g:compe.source.emoji = v:true + lua << EOF + ${ readFile (./nvim-cmp.lua) } + EOF ''; } - vim-goyo + luasnip + cmp-nvim-lsp { plugin = nvim-lspconfig; config = '' diff --git a/nix/home/programs/nvim/nvim-cmp.lua b/nix/home/programs/nvim/nvim-cmp.lua new file mode 100644 index 0000000..b67113d --- /dev/null +++ b/nix/home/programs/nvim/nvim-cmp.lua @@ -0,0 +1,29 @@ +local cmp = require("cmp") + +cmp.setup({ + snippet = { + -- REQUIRED - you must specify a snippet engine + expand = function(args) + -- vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users. + require('luasnip').lsp_expand(args.body) -- For `luasnip` users. + -- require('snippy').expand_snippet(args.body) -- For `snippy` users. + -- vim.fn["UltiSnips#Anon"](args.body) -- For `ultisnips` users. + end, + }, + window = { + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered(), + }, + 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 }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + }), + sources = cmp.config.sources({ + { name = 'nvim_lsp' }, + }, { + { name = 'buffer' }, + }) +}) diff --git a/nix/home/programs/nvim/nvim-lspconfig.lua b/nix/home/programs/nvim/nvim-lspconfig.lua index 7864d66..abea89f 100644 --- a/nix/home/programs/nvim/nvim-lspconfig.lua +++ b/nix/home/programs/nvim/nvim-lspconfig.lua @@ -1,165 +1,158 @@ local nvim_lsp = require("lspconfig") +-- +-- https://vonheikemen.github.io/devlog/tools/setup-nvim-lspconfig-plus-nvim-cmp/ +local lsp_defaults = nvim_lsp.util.default_config +lsp_defaults.capabilities = vim.tbl_deep_extend( + 'force', + lsp_defaults.capabilities, + require("cmp_nvim_lsp").default_capabilities() +) --- local format_async = function(err, _, result, _, bufnr) --- if err ~= nil or result == nil then return end --- if not vim.api.nvim_buf_get_option(bufnr, "modified") then --- local view = vim.fn.winsaveview() --- vim.lsp.util.apply_text_edits(result, bufnr) --- vim.fn.winrestview(view) --- if bufnr == vim.api.nvim_get_current_buf() then --- vim.api.nvim_command("noautocmd :update") --- end --- end --- end --- vim.lsp.handlers["textDocument/formatting"] = format_async - -local on_attach = function(client, bufnr) - local buf_map = vim.api.nvim_buf_set_keymap - - vim.cmd("command! LspDef lua vim.lsp.buf.definition()") - vim.cmd("command! LspFormatting lua vim.lsp.buf.formatting()") - vim.cmd("command! LspCodeAction lua vim.lsp.buf.code_action()") - vim.cmd("command! LspHover lua vim.lsp.buf.hover()") - vim.cmd("command! LspRename lua vim.lsp.buf.rename()") - vim.cmd("command! LspOrganize lua lsp_organize_imports()") - vim.cmd("command! LspRefs lua vim.lsp.buf.references()") - vim.cmd("command! LspTypeDef lua vim.lsp.buf.type_definition()") - vim.cmd("command! LspImplementation lua vim.lsp.buf.implementation()") - vim.cmd("command! LspDiagPrev lua vim.lsp.diagnostic.goto_prev()") - vim.cmd("command! LspDiagNext lua vim.lsp.diagnostic.goto_next()") - vim.cmd("command! LspDiagLine lua vim.lsp.diagnostic.show_line_diagnostics()") - vim.cmd("command! LspSignatureHelp lua vim.lsp.buf.signature_help()") - - buf_map(bufnr, "n", "gd", ":LspDef", {silent = true}) - buf_map(bufnr, "n", "gr", ":LspRename", {silent = true}) - buf_map(bufnr, "n", "gR", ":LspRefs", {silent = true}) - buf_map(bufnr, "n", "gy", ":LspTypeDef", {silent = true}) - buf_map(bufnr, "n", "K", ":LspHover", {silent = true}) - buf_map(bufnr, "n", "gs", ":LspOrganize", {silent = true}) - buf_map(bufnr, "n", "[a", ":LspDiagPrev", {silent = true}) - buf_map(bufnr, "n", "]a", ":LspDiagNext", {silent = true}) - buf_map(bufnr, "n", "ga", ":LspCodeAction", {silent = true}) - buf_map(bufnr, "n", "a", ":LspDiagLine", {silent = true}) - buf_map(bufnr, "i", "", " LspSignatureHelp", {silent = true}) - - if client.resolved_capabilities.document_formatting then - vim.api.nvim_exec([[ - augroup LspAutocommands - autocmd! * - autocmd BufWritePost LspFormatting - augroup END - ]], true) +vim.api.nvim_create_autocmd("LspAttach", { + desc = "LSP actions", + callback = function() + local bufmap = function(mode, lhs, rhs) + local opts = { buffer = true } + vim.keymap.set(mode, lhs, rhs, opts) end -end + + -- Displays hover information about the symbol under the cursor + bufmap('n', 'K', 'lua vim.lsp.buf.hover()') + + -- Jump to the definition + bufmap('n', 'gd', 'lua vim.lsp.buf.definition()') + + -- Jump to declaration + bufmap('n', 'gD', 'lua vim.lsp.buf.declaration()') + + -- Lists all the implementations for the symbol under the cursor + bufmap('n', 'gi', 'lua vim.lsp.buf.implementation()') + + -- Jumps to the definition of the type symbol + bufmap('n', 'go', 'lua vim.lsp.buf.type_definition()') + + -- Lists all the references + bufmap('n', 'gr', 'lua vim.lsp.buf.references()') + + -- Displays a function's signature information + bufmap('n', '', 'lua vim.lsp.buf.signature_help()') + + -- Renames all references to the symbol under the cursor + bufmap('n', '', 'lua vim.lsp.buf.rename()') + + -- Selects a code action available at the current cursor position + bufmap('n', '', 'lua vim.lsp.buf.code_action()') + bufmap('x', '', 'lua vim.lsp.buf.range_code_action()') + + -- Show diagnostics in a floating window + bufmap('n', 'gl', 'lua vim.diagnostic.open_float()') + + -- Move to the previous diagnostic + bufmap('n', '[d', 'lua vim.diagnostic.goto_prev()') + + -- Move to the next diagnostic + bufmap('n', ']d', 'lua vim.diagnostic.goto_next()') + end +}) nvim_lsp.diagnosticls.setup { - on_attach = on_attach; - filetypes = { 'javascript', 'javascriptreact', 'typescript', 'typescriptreact', 'css', 'scss', 'markdown', 'pandoc' }, - init_options = { - linters = { - eslint = { - command = 'eslint', - rootPatterns = { '.git' }, - debounce = 100, - args = { '--stdin', '--stdin-filename', '%filepath', '--format', 'json' }, - sourceName = 'eslint', - parseJson = { - errorsRoot = '[0].messages', - line = 'line', - column = 'column', - endLine = 'endLine', - endColumn = 'endColumn', - message = '[eslint] ${message} [${ruleId}]', - security = 'severity' - }, - securities = { - [2] = 'error', - [1] = 'warning' - } + filetypes = { 'javascript', 'javascriptreact', 'typescript', 'typescriptreact', 'css', 'scss', 'markdown', 'pandoc' }, + init_options = { + linters = { + eslint = { + command = 'eslint', + rootPatterns = { '.git' }, + debounce = 100, + args = { '--stdin', '--stdin-filename', '%filepath', '--format', 'json' }, + sourceName = 'eslint', + parseJson = { + errorsRoot = '[0].messages', + line = 'line', + column = 'column', + endLine = 'endLine', + endColumn = 'endColumn', + message = '[eslint] ${message} [${ruleId}]', + security = 'severity' }, - markdownlint = { - command = 'markdownlint', - rootPatterns = { '.git' }, - isStderr = true, - debounce = 100, - args = { '--stdin' }, - offsetLine = 0, - offsetColumn = 0, - sourceName = 'markdownlint', - securities = { - undefined = 'hint' - }, - formatLines = 1, - formatPattern = { - '^.*:(\\d+)\\s+(.*)$', - { - line = 1, - column = -1, - message = 2, - } + securities = { + [2] = 'error', + [1] = 'warning' + } + }, + markdownlint = { + command = 'markdownlint', + rootPatterns = { '.git' }, + isStderr = true, + debounce = 100, + args = { '--stdin' }, + offsetLine = 0, + offsetColumn = 0, + sourceName = 'markdownlint', + securities = { + undefined = 'hint' + }, + formatLines = 1, + formatPattern = { + '^.*:(\\d+)\\s+(.*)$', + { + line = 1, + column = -1, + message = 2, } } - }, - filetypes = { - javascript = 'eslint', - javascriptreact = 'eslint', - typescript = 'eslint', - typescriptreact = 'eslint', - markdown = 'markdownlint', - pandoc = 'markdownlint' - }, - formatters = { - prettier = { - command = 'prettier', - args = { '--stdin-filepath', '%filename' } - } - }, - formatFiletypes = { - css = 'prettier', - javascript = 'prettier', - javascriptreact = 'prettier', - json = 'prettier', - scss = 'prettier', - typescript = 'prettier', - typescriptreact = 'prettier' } + }, + filetypes = { + javascript = 'eslint', + javascriptreact = 'eslint', + typescript = 'eslint', + typescriptreact = 'eslint', + markdown = 'markdownlint', + pandoc = 'markdownlint' + }, + formatters = { + prettier = { + command = 'prettier', + args = { '--stdin-filepath', '%filename' } + } + }, + formatFiletypes = { + css = 'prettier', + javascript = 'prettier', + javascriptreact = 'prettier', + json = 'prettier', + scss = 'prettier', + typescript = 'prettier', + typescriptreact = 'prettier' } + } } -nvim_lsp.elmls.setup{ - on_attach = on_attach; +nvim_lsp.elmls.setup { } nvim_lsp.tsserver.setup { - on_attach = function(client) - -- Avoid conflict with prettier and eslint - client.resolved_capabilities.document_formatting = false - on_attach(client) - end } -nvim_lsp.elixirls.setup{ +nvim_lsp.elixirls.setup { cmd = { "elixir-ls" }; - on_attach = on_attach; } -nvim_lsp.rnix.setup{ +nvim_lsp.rnix.setup { cmd = { "@rnix_lsp@/bin/rnix-lsp" }; - on_attach = on_attach; -} -nvim_lsp.rust_analyzer.setup{ - on_attach = on_attach; } +nvim_lsp.rust_analyzer.setup {} -nvim_lsp.sumneko_lua.setup{ +nvim_lsp.sumneko_lua.setup { cmd = { "@lua_ls@/bin/lua-language-server" }; - on_attach = on_attach; + single_file_support = true, + flags = { + debounce_text_changes = 150, + }, settings = { Lua = { diagnostics = { - globals = { 'vim' } + globals = { 'vim' } } } }; } -nvim_lsp.texlab.setup{ - on_attach = on_attach; -} +nvim_lsp.texlab.setup {}