diff --git a/nix/home.nix b/nix/home.nix index 39fd1e4..77b96e7 100644 --- a/nix/home.nix +++ b/nix/home.nix @@ -48,7 +48,8 @@ let }; }; -in { +in +{ home.packages = with pkgs; [ git-plan htop @@ -148,103 +149,109 @@ in { vim-commentary vim-airline - { plugin = rainbow; - config = '' -let g:rainbow_conf = { -\ 'guifgs': ['RoyalBlue3', 'SeaGreen3', 'DarkOrchid3', 'firebrick3', 'RoyalBlue3', 'SeaGreen3', 'DarkOrchid3', 'firebrick3', 'RoyalBlue3', 'DarkOrchid3', 'firebrick3', 'RoyalBlue3', 'SeaGreen3', 'DarkOrchid3', 'firebrick3'], -\ 'ctermfgs': ['red', 'brown', 'blue', 'gray', 'green', 'magenta', 'cyan', 'darkred', 'brown', 'darkblue', 'gray', 'darkgreen', 'darkmagenta', 'darkcyan', 'red'], -\ 'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'] -\} -let g:rainbow_active = 1 + { + plugin = rainbow; + config = '' + let g:rainbow_conf = { + \ 'guifgs': ['RoyalBlue3', 'SeaGreen3', 'DarkOrchid3', 'firebrick3', 'RoyalBlue3', 'SeaGreen3', 'DarkOrchid3', 'firebrick3', 'RoyalBlue3', 'DarkOrchid3', 'firebrick3', 'RoyalBlue3', 'SeaGreen3', 'DarkOrchid3', 'firebrick3'], + \ 'ctermfgs': ['red', 'brown', 'blue', 'gray', 'green', 'magenta', 'cyan', 'darkred', 'brown', 'darkblue', 'gray', 'darkgreen', 'darkmagenta', 'darkcyan', 'red'], + \ 'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'] + \} + let g:rainbow_active = 1 ''; - } + } vim-signify vim-indent-guides 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 + { + plugin = easymotion; + config = '' + map / (easymotion-sn) + omap / (easymotion-tn) + map n (easymotion-next) + map N (easymotion-prev) + let g:EasyMotion_landing_highlight = 0 ''; - } + } vinegar undotree - { plugin = vim-test; - config = '' -nmap t :TestNearest -nmap T :TestFile -nmap a :TestSuite -nmap l :TestLast -nmap g :TestVisit -let test#strategy = "neovim" + { + plugin = vim-test; + config = '' + nmap t :TestNearest + nmap T :TestFile + nmap a :TestSuite + nmap l :TestLast + nmap g :TestVisit + let test#strategy = "neovim" ''; - } - { plugin = ale; - config = '' -let g:ale_fix_on_save = 1 -let g:ale_elixir_credo_strict = 1 -let g:ale_fixers = { - \ 'elm': ['elm-format', 'format'], - \ 'javascript': ['prettier'], - \ 'javascript.jsx': ['prettier'], - \ 'javascriptreact': ['prettier'], - \ 'typescriptreact': ['prettier'], - \ 'typescript': ['prettier'], - \ 'ruby': ['sorbet'], - \ 'rust': ['rustfmt'], - \ 'elixir': ['mix_format'] - \} -let g:ale_linters_explicit = 1 + } + { + plugin = ale; + config = '' + let g:ale_fix_on_save = 1 + let g:ale_elixir_credo_strict = 1 + let g:ale_fixers = { + \ 'javascript': ['prettier'], + \ 'javascript.jsx': ['prettier'], + \ 'javascriptreact': ['prettier'], + \ 'ruby': ['sorbet'], + \ 'rust': ['rustfmt'], + \} + let g:ale_linters_explicit = 1 ''; - } + } fzf-vim fzfWrapper - { plugin = nvim-compe; - 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 + { + plugin = nvim-compe; + 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 + 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 ''; - } + } vim-goyo - { plugin = nvim-lspconfig ; - config = '' - lua << EOF - require'lspconfig'.elmls.setup{} - require'lspconfig'.tsserver.setup{} - require'lspconfig'.elixirls.setup{ - cmd = { "${pkgs.elixir_ls}/bin/elixir-ls" }; + { + plugin = nvim-lspconfig; + config = '' + lua << EOF + ${readFile ( + pkgs.substituteAll { + src = ./vim/nvim-lspconfig.lua; + # since both of these are used for actually configuring the system, + # we'll probably always want them around. + lua_ls = pkgs.sumneko-lua-language-server; + rnix_lsp = pkgs.rnix-lsp; } - EOF + ) } + EOF ''; - } + } ]; extraConfig = readFile ./vim/init.vim; diff --git a/nix/vim/nvim-lspconfig.lua b/nix/vim/nvim-lspconfig.lua new file mode 100644 index 0000000..91e7378 --- /dev/null +++ b/nix/vim/nvim-lspconfig.lua @@ -0,0 +1,91 @@ +local nvim_lsp = require("lspconfig") + +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) + end +end + +nvim_lsp.diagnosticls.setup { + on_attach = on_attach +} + +nvim_lsp.elmls.setup{ + on_attach = on_attach; +} +nvim_lsp.tsserver.setup { + on_attach = function(client) + -- Avoid conflict with prettier + client.resolved_capabilities.document_formatting = false + on_attach(client) + end +} +nvim_lsp.elixirls.setup{ + cmd = { "elixir-ls" }; + on_attach = on_attach; +} +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.sumneko_lua.setup{ + cmd = { "@lua_ls@/bin/lua-language-server" }; + on_attach = on_attach; + settings = { + Lua = { + diagnostics = { + globals = { 'vim' } + } + } + }; +}