From 3add3d06af15c0457075f994e0b4a91289737c74 Mon Sep 17 00:00:00 2001 From: Minijackson Date: Wed, 15 May 2024 22:03:04 +0200 Subject: common/vim: switch to nixvim --- usecases/desktop/development.nix | 3 +- usecases/desktop/development/nixvim-dev.nix | 300 ++++++++++++++++++++++++++++ 2 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 usecases/desktop/development/nixvim-dev.nix (limited to 'usecases/desktop') diff --git a/usecases/desktop/development.nix b/usecases/desktop/development.nix index f919ae1..d32e5ec 100644 --- a/usecases/desktop/development.nix +++ b/usecases/desktop/development.nix @@ -30,8 +30,9 @@ inputs: { luaFormat = inputs.self.lib.generators.lua {}; in { imports = [ - (import ./development/latex.nix inputs) (import ./development/adb.nix inputs) + (import ./development/latex.nix inputs) + (import ./development/nixvim-dev.nix inputs) ]; options = with lib; diff --git a/usecases/desktop/development/nixvim-dev.nix b/usecases/desktop/development/nixvim-dev.nix new file mode 100644 index 0000000..83f5d10 --- /dev/null +++ b/usecases/desktop/development/nixvim-dev.nix @@ -0,0 +1,300 @@ +_inputs: _: + +# TODO: neodev +# TODO: pandoc +{ + programs.nixvim = { + # TODO: + # extraConfigLuaPost = '' + # local function set_ltex_lang(lang) + # local ltex = vim.lsp.get_active_clients({ name = "ltex" })[1] + # if ltex == nil then + # return + # end + # + # if lang == nil then + # lang = vim.opt_local.spelllang:get()[1] + # end + # + # if lang == "en" then + # lang = "en-US" + # end + # + # ltex.config.settings.ltex.language = lang + # end + # + # vim.api.nvim_create_user_command( + # "LTeXSetLang", + # function(opts) + # local lang = opts.fargs[1] + # set_ltex_lang(lang) + # end, + # { + # nargs = 1, + # complete = function() return { "en", "fr" } end, + # } + # ) + # + # vim.api.nvim_create_autocmd("OptionSet", { + # desc = "Set LTex language on spell change", + # callback = function(ev) + # if ev.match ~= "spelllang" then + # return + # end + # set_ltex_lang() + # end, + # }) + # + # vim.api.nvim_create_autocmd("LspAttach", { + # desc = "Set LTex language on attach", + # callback = function(ev) + # local client = vim.lsp.get_client_by_id(ev.data.client_id) + # if client.config.name ~= "ltex" then + # return + # end + # set_ltex_lang() + # end, + # }) + # ''; + + plugins = { + # TODO: + #conform-nvim.enable = true; + + clangd-extensions.enable = true; + + crates-nvim = { + enable = true; + extraOptions.null_ls.enabled = true; + }; + + lsp = { + enable = true; + + keymaps = { + diagnostic = { + "se" = { + action = "open_float"; + desc = "LSP diagnostic"; + }; + "sl" = { + action = "setloclist"; + desc = "LSP set loclist"; + }; + "sq" = { + action = "setqflist"; + desc = "LSP set quickfixlist"; + }; + }; + + extra = [ + { + key = "gd"; + action = "require('telescope.builtin').lsp_definitions"; + lua = true; + options.desc = "LSP definitions"; + } + { + key = "gr"; + action = "require('telescope.builtin').lsp_references"; + lua = true; + options.desc = "LSP references"; + } + { + key = "sd"; + action = "require('lsp_lines').toggle"; + lua = true; + options.desc = "LSP toggle inline diagnostics"; + } + { + key = "sE"; + action = "require('telescope.builtin').diagnostics"; + lua = true; + options.desc = "LSP all diagnostics"; + } + { + key = "ss"; + action = "require('telescope.builtin').lsp_document_symbols"; + lua = true; + options.desc = "LSP document symbols"; + } + { + key = "sS"; + action = "require('telescope.builtin').lsp_workspace_symbols"; + lua = true; + options.desc = "LSP workspace symbols"; + } + ]; + + lspBuf = { + K = { + action = "hover"; + desc = "LSP hover"; + }; + gr = { + action = "references"; + desc = "LSP references"; + }; + # TODO setup actions-preview-nvim + "sa" = { + action = "code_action"; + desc = "LSP code actions"; + }; + "sf" = { + action = "format"; + desc = "LSP format"; + }; + "si" = { + action = "implementation"; + desc = "LSP implementation"; + }; + "sr" = { + action = "rename"; + desc = "LSP rename"; + }; + "st" = { + action = "type_definition"; + desc = "LSP type definition"; + }; + }; + }; + + onAttach = '' + require("clangd_extensions.inlay_hints").setup_autocmd() + require("clangd_extensions.inlay_hints").set_inlay_hints() + ''; + + servers = { + bashls.enable = true; + clangd = { + enable = true; + extraOptions.cmd = [ + "clangd" + "--background-index" + "--clang-tidy" + "--fallback-style=WebKit" + "--header-insertion-decorators" + "--header-insertion=iwyu" + ]; + }; + elixirls.enable = true; + # TODO: buggy with lsp-lines? + ltex = { + enable = true; + filetypes = [ + "bib" + "gitcommit" + "markdown" + "org" + "plaintex" + "rst" + "rnoweb" + "tex" + # vv Added this one vv + "typst" + "pandoc" + "quarto" + "rmd" + "context" + "html" + "xhtml" + ]; + }; + lua-ls.enable = true; + # completion.callSnippet = "Replace";? + marksman.enable = true; + nixd = { + enable = true; + # TODO: doesn't work with string substitution + settings.formatting.command = [ "nixfmt" ]; + }; + pylsp = { + enable = true; + settings.plugins.ruff.enabled = true; + }; + taplo.enable = true; + typos-lsp.enable = true; + typst-lsp.enable = true; + }; + }; + + lsp-lines = { + enable = true; + # TODO: seems buggy with multiple sources? + # currentLine = true; + }; + + rustaceanvim = { + enable = true; + server = { + onAttach = '' + function(client, bufnr) + __lspOnAttach(client, bufnr) + + vim.keymap.set( + -- {"n", "v"}, + "n", + "J", + function() vim.cmd.RustLsp('joinLines') end, + { + silent = true, + buffer = bufnr, + desc = "rust-analyzer join lines", + } + ) + + vim.keymap.set( + "n", + "", + function() vim.cmd.RustLsp({ "moveItem", "up" }) end, + { + silent = true, + buffer = bufnr, + desc = "rust-analyzer move item up", + } + ) + + vim.keymap.set( + "n", + "", + function() vim.cmd.RustLsp({ "moveItem", "down" }) end, + { + silent = true, + buffer = bufnr, + desc = "rust-analyzer move item down", + } + ) + + vim.keymap.set( + "n", + "sR", + function() vim.cmd.RustLsp('runnables') end, + { + silent = true, + buffer = bufnr, + desc = "rust-analyzer runnables", + } + ) + + vim.keymap.set( + "n", + "sx", + function() vim.cmd.RustLsp('explainError') end, + { + silent = true, + buffer = bufnr, + desc = "rust-analyzer explain error", + } + ) + end + ''; + # TODO? + # settings.rust-analyzer = { + # checkOnSave.command = "clippy"; + # experimental.procAttrMacros = true; + # }; + }; + }; + }; + }; +} -- cgit v1.2.3