{ config, lib, pkgs, inputs, ... }: # Neovim for the primary user, configured declaratively through nixvim. let cfg = config.modules.nvim; user = config.user.name; in { options.modules.nvim.enable = lib.mkEnableOption "Neovim, configured declaratively via nixvim"; config = lib.mkIf cfg.enable { home-manager.sharedModules = [ inputs.nixvim.homeModules.nixvim ]; home-manager.users.${user} = hm: { programs.nixvim = { enable = true; extraPackages = with pkgs; [ git # neogit and gitsigns shell out to git ripgrep # backs the picker's live grep fd # backs the picker's file finder ]; globals.mapleader = " "; globals.clipboard = "osc52"; # built-in OSC 52 provider, no external binary needed opts = { clipboard = "unnamedplus"; number = true; relativenumber = true; shiftwidth = 2; tabstop = 2; expandtab = true; mouse = "a"; undofile = true; ignorecase = true; smartcase = true; splitright = true; splitbelow = true; wrap = false; scrolloff = 8; cursorline = true; }; keymaps = [ { mode = "n"; key = ""; action = "h"; options.desc = "Move focus left"; } { mode = "n"; key = ""; action = "j"; options.desc = "Move focus down"; } { mode = "n"; key = ""; action = "k"; options.desc = "Move focus up"; } { mode = "n"; key = ""; action = "l"; options.desc = "Move focus right"; } { mode = "n"; key = ""; action = "nohlsearch"; options.desc = "Clear search highlight"; } { mode = "n"; key = "e"; action = "Oil"; options.desc = "Open file browser"; } { mode = "n"; key = "f"; action.__raw = "function() require('snacks').picker.files() end"; options.desc = "Find files"; } { mode = "n"; key = "s"; action.__raw = "function() require('snacks').picker.grep() end"; options.desc = "Search text"; } { mode = "n"; key = "b"; action.__raw = "function() require('snacks').picker.buffers() end"; options.desc = "Switch buffer"; } { mode = "n"; key = "g"; action.__raw = '' function() require('gitsigns').toggle_current_line_blame(true) require('neogit').open() end ''; options.desc = "Open git (Neogit)"; } ]; plugins = { gitsigns = { enable = true; settings.current_line_blame = false; }; neogit.enable = true; diffview.enable = true; # neogit's diff integration oil = { enable = true; settings.view_options.show_hidden = true; }; snacks = { enable = true; settings = { picker.enabled = true; notifier.enabled = true; input.enabled = true; }; }; which-key.enable = true; render-markdown.enable = true; treesitter = { enable = true; highlight.enable = true; indent.enable = true; grammarPackages = with hm.config.programs.nixvim.plugins.treesitter.package.builtGrammars; [ nix lua bash fish markdown markdown_inline rust python java kotlin c cpp html css javascript typescript go ]; }; }; # gbprod/nord.nvim, set up in ./config.lua. # nixvim's colorschemes.nord is a different plugin. extraPlugins = [ pkgs.vimPlugins.gbprod-nord ]; extraConfigLua = builtins.readFile ./config.lua; }; }; }; }