diff --git a/home/neovim.nix b/home/neovim.nix index 70b0751..5e91836 100644 --- a/home/neovim.nix +++ b/home/neovim.nix @@ -27,6 +27,108 @@ pkgs: { " temporary fix for broken popup menu colors " see here: https://github.com/nvim-telescope/telescope.nvim/issues/2145 hi NormalFloat ctermfg=LightGrey + + " trouble.nvim settings + nnoremap xx TroubleToggle + nnoremap xw TroubleToggle workspace_diagnostics + nnoremap xd TroubleToggle document_diagnostics + nnoremap xq TroubleToggle quickfix + nnoremap xl TroubleToggle loclist + nnoremap gR TroubleToggle lsp_references + + lua << EOF + require 'lspconfig' + + -- rust setup from https://sharksforarms.dev/posts/neovim-rust/ + -- Set completeopt to have a better completion experience + -- :help completeopt + -- menuone: popup even when there's only one match + -- noinsert: Do not insert text until a selection is made + -- noselect: Do not auto-select, nvim-cmp plugin will handle this for us. + vim.o.completeopt = "menuone,noinsert,noselect" + + -- Avoid showing extra messages when using completion + vim.opt.shortmess = vim.opt.shortmess + "c" + + local function on_attach(client, buffer) + -- This callback is called when the LSP is atttached/enabled for this buffer + -- we could set keymaps related to LSP, etc here. + end + + -- Configure LSP through rust-tools.nvim plugin. + -- rust-tools will configure and enable certain LSP features for us. + -- See https://github.com/simrat39/rust-tools.nvim#configuration + local opts = { + tools = { + runnables = { + use_telescope = true, + }, + inlay_hints = { + auto = true, + show_parameter_hints = true, + parameter_hints_prefix = "", + other_hints_prefix = "", + }, + virt_text = {{"demo", "IncSearch"}}, + virt_text_pos = 'overlay', + }, + + -- all the opts to send to nvim-lspconfig + -- these override the defaults set by rust-tools.nvim + -- see https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md#rust_analyzer + server = { + -- on_attach is a callback called when the language server attachs to the buffer + on_attach = on_attach, + settings = { + -- to enable rust-analyzer settings visit: + -- https://github.com/rust-analyzer/rust-analyzer/blob/master/docs/user/generated_config.adoc + ["rust-analyzer"] = { + -- enable clippy on save + checkOnSave = { + command = "clippy", + }, + }, + }, + }, + } + + require("rust-tools").setup(opts) + + -- Setup Completion + -- See https://github.com/hrsh7th/nvim-cmp#basic-configuration + local cmp = require("cmp") + cmp.setup({ + preselect = cmp.PreselectMode.None, + snippet = { + expand = function(args) + vim.fn["vsnip#anonymous"](args.body) + end, + }, + mapping = { + [""] = cmp.mapping.select_prev_item(), + [""] = cmp.mapping.select_next_item(), + -- Add tab support + [""] = cmp.mapping.select_prev_item(), + [""] = cmp.mapping.select_next_item(), + [""] = cmp.mapping.scroll_docs(-4), + [""] = cmp.mapping.scroll_docs(4), + [""] = cmp.mapping.complete(), + [""] = cmp.mapping.close(), + [""] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Insert, + select = true, + }), + }, + + -- Installed sources + sources = { + { name = "nvim_lsp" }, + { name = "vsnip" }, + { name = "path" }, + { name = "buffer" }, + }, + }) + EOF ''; plugins = with pkgs.vimPlugins; [ #context-vim @@ -38,6 +140,19 @@ pkgs: { telescope-fzf-native-nvim #nvim-treesitter vim-nix + + # rust stuff + nvim-lspconfig + nvim-cmp + cmp-nvim-lsp + cmp-vsnip + cmp-path + cmp-buffer + vim-vsnip + rust-tools-nvim + trouble-nvim + nvim-web-devicons ]; vimAlias = true; + withPython3 = true; }