{ config, config', inputs, lib, pkgs, ... }: with lib; let cfg = config.myOptions.programs.neovim; in { options.myOptions.programs.neovim.enable = mkEnableOption "enable neovim"; config = mkIf cfg.enable { home-manager.users.${config'.username} = { imports = [ inputs.nixvim.homeManagerModules.nixvim ]; programs.nixvim = { enable = true; defaultEditor = true; package = pkgs.neovim-nightly; enableMan = true; colorscheme = "catppuccin"; colorschemes.catppuccin = { enable = true; flavour = "mocha"; transparentBackground = true; }; options = { number = true; relativenumber = true; autoread = true; so = 7; cmdheight = 1; ignorecase = true; smartcase = true; showmatch = true; timeoutlen = 500; encoding = "utf8"; smarttab = true; shiftwidth = 4; tabstop = 4; expandtab = true; linebreak = true; smartindent = true; updatetime = 300; hidden = true; background = "dark"; mousemoveevent = true; smoothscroll = true; }; globals = { mapleader = " "; }; keymaps = [ { action = "vim.cmd.CHADopen"; lua = true; key = "v"; } ]; plugins = { airline = { enable = true; theme = "catppuccin"; }; fugitive.enable = true; treesitter = { enable = true; ensureInstalled = [ "lua" "rust" "markdown" "markdown-inline" "python" "cmake" "cpp" "c" ]; folding = false; indent = true; nixvimInjections = true; incrementalSelection.enable = true; }; coq-nvim = { enable = true; autoStart = "shut-up"; installArtifacts = true; recommendedKeymaps = true; alwaysComplete = false; }; chadtree = { enable = true; keymap.openFileFolder.tertiary = ["t" ""]; }; toggleterm = { enable = true; direction = "float"; openMapping = ""; shadeTerminals = true; shadingFactor = 2; size = 10; }; # TODO laytan/cloak.nvim gitsigns = { enable = true; currentLineBlame = true; numhl = true; signcolumn = true; wordDiff = true; onAttach = { function = '' function(bufnr) local gs = package.loaded.gitsigns local function map(mode, l, r, opts) opts = opts or {} opts.buffer = bufnr vim.keymap.set(mode, l, r, opts) end -- Navigation map('n', ']c', function() if vim.wo.diff then return ']c' end vim.schedule(function() gs.next_hunk() end) return '' end, {expr=true}) map('n', '[c', function() if vim.wo.diff then return '[c' end vim.schedule(function() gs.prev_hunk() end) return '' end, {expr=true}) -- Actions map('n', 'hs', gs.stage_hunk) map('n', 'hr', gs.reset_hunk) map('v', 'hs', function() gs.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end) map('v', 'hr', function() gs.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end) map('n', 'hS', gs.stage_buffer) map('n', 'hu', gs.undo_stage_hunk) map('n', 'hR', gs.reset_buffer) map('n', 'hp', gs.preview_hunk) map('n', 'hb', function() gs.blame_line{full=true} end) map('n', 'tb', gs.toggle_current_line_blame) map('n', 'hd', gs.diffthis) map('n', 'hD', function() gs.diffthis('~') end) map('n', 'td', gs.toggle_deleted) -- Text object map({'o', 'x'}, 'ih', ':Gitsigns select_hunk') end ''; }; }; lsp = { enable = true; servers = { rust-analyzer = { enable = true; installCargo = false; installRustc = false; }; lua-ls.enable = true; clangd.enable = true; nil_ls.enable = true; bashls.enable = true; }; #onAttach = '' # vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') # local bufopts = { noremap = true, silent = true, buffer = bufnr } # vim.keymap.set('n', 'wl', function() # print(vim.inspect(vim.lsp.buf.list_workspace_folders())) # end, bufopts) # vim.keymap.set('n', '', function() vim.lsp.buf.format { async = true } end, bufopts) #''; keymaps = { lspBuf = { gD = "declaration"; gd = "definition"; K = "hover"; gi = "implementation"; "" = "signature_help"; "wa" = "add_workspace_folder"; "wr" = "remove_workspace_folder"; "wl" = "list_workspace_folders"; "D" = "type_definition"; "r" = "rename"; "a" = "code_action"; gr = "references"; "" = "format"; }; diagnostic = { "e" = "open_float"; "j" = "goto_prev"; "k" = "goto_next"; "q" = "setloclist"; }; # TODO maybe change silent = false; }; }; rust-tools = { enable = true; crateGraph = { enabledGraphvizBackends = ["png" "svg"]; backend = "x11"; }; inlayHints = { auto = true; onlyCurrentLine = true; showParameterHints = true; }; }; leap.enable = true; fidget.enable = true; telescope = { enable = true; keymaps = { "ff" = "find_files"; "fg" = "live_grep"; "fb" = "buffers"; "fh" = "help_tags"; }; # TODO maybe change keymapsSilent = false; }; comment-nvim.enable = true; crates-nvim.enable = true; harpoon = { enable = true; package = pkgs.vimPlugins.harpoon.overrideAttrs { src = pkgs.fetchFromGitHub { owner = "ThePrimeagen"; repo = "harpoon"; rev = "a38be6e0dd4c6db66997deab71fc4453ace97f9c"; hash = "sha256-RjwNUuKQpLkRBX3F9o25Vqvpu3Ah1TCFQ5Dk4jXhsbI="; }; }; enableTelescope = true; keymapsSilent = false; }; }; extraPlugins = with pkgs.vimPlugins; [ zen-mode-nvim ]; }; }; }; }