inputs: { config, pkgs, lib, ... }: let inherit (pkgs.unstable) neovim-unwrapped vimPlugins wrapNeovim; luaFormat = inputs.self.lib.generators.lua {}; cfg = config.vim; variables = with lib; pkgs.writeTextDir "lua/myVariables.lua" '' -- Autogenerated variables from the NixOS configuration ${(concatStringsSep "\n" (mapAttrsToList (variable: value: "vim.g.${variable} = ${luaFormat.generate value}") cfg.variables))} ''; extraConfig = pkgs.writeTextDir "lua/myExtraConfig.lua" '' -- luaConfig from the NixOS configuration ${cfg.luaConfig} ''; myGeneratedConfigPackage = pkgs.symlinkJoin { name = "myGeneratedConfig-nvim"; paths = [variables extraConfig]; }; myConfigPackage = pkgs.unstable.vimUtils.buildVimPlugin { name = "myConfig-nvim"; src = ../dotfiles/vim; }; myNeovim = wrapNeovim neovim-unwrapped { configure = { inherit (config.vim) beforePlugins; customRC = '' lua require("myVariables") lua require("myConfig") lua require("myExtraConfig") ${cfg.extraConfig} ''; packages.myVimPackage = with vimPlugins; { start = [ myGeneratedConfigPackage myConfigPackage # Dependencies plenary-nvim popup-nvim # UI undotree gruvbox-community lualine-nvim lualine-lsp-progress (gitsigns-nvim.overrideAttrs (_old: { src = pkgs.fetchFromGitHub { owner = "lewis6991"; repo = "gitsigns.nvim"; rev = "v0.6"; sha256 = "sha256-e7JLXKupgk1TjQnUB1pSV+9QWWjeLbyNCqvP6ni1pb4="; }; })) diffview-nvim nvim-notify indent-blankline-nvim oil-nvim dressing-nvim # Completion nvim-cmp cmp-buffer cmp-calc cmp-cmdline cmp-latex-symbols cmp-nvim-lsp cmp-path cmp-spell cmp-tmux cmp-treesitter cmp-vsnip # Snippets vim-vsnip vim-vsnip-integ # Telescope telescope-nvim # Treesitter nvim-treesitter.withAllGrammars nvim-treesitter-textobjects nvim-treesitter-context nvim-treesitter-refactor vim-matchup # Motions camelcasemotion vim-surround targets-vim neoformat # Languages vim-polyglot # Fixes "duplicated vim plugin" issue (refactoring-nvim.overrideAttrs (old: {dependencies = [];})) # Other comment-nvim fugitive-gitlab-vim null-ls-nvim tabular tmux-complete-vim vim-abolish vim-fugitive vim-oscyank vim-repeat vim-rhubarb vim-unimpaired ] ++ config.vim.extraPlugins; }; }; }; in { options.vim = with lib; { variables = mkOption { type = types.attrsOf luaFormat.type; default = {}; description = "Extra global variables to add at the beginning of the vim configuration."; }; extraPlugins = mkOption { type = with types; listOf package; default = []; description = "Names of extra plugins to add"; }; beforePlugins = mkOption { type = types.lines; default = ""; description = "Extra lines to add in the vim configuration before loading plugins"; }; extraConfig = mkOption { type = types.lines; default = ""; description = "Extra lines to add at the end of the vim configuration"; }; luaConfig = mkOption { type = types.lines; default = ""; description = "Lua Neovim configuration"; }; wrappedPackage = mkOption { type = types.package; description = "Resulting wrapped Neovim package"; readOnly = true; }; }; config = { vim = { wrappedPackage = myNeovim; variables = { dominant_color = "${config.theme.colors.dominant}"; ripgrep_path = "${pkgs.ripgrep}/bin/rg"; fd_path = "${pkgs.fd}/bin/fd"; }; }; environment.systemPackages = [myNeovim]; environment.variables = { EDITOR = "nvim"; MANPAGER = "nvim +Man!"; NEOVIDE_MULTIGRID = "true"; }; home-manager.users.minijackson.xdg.dataFile."nvim/backup/.keep".text = ""; home-manager.users.root.xdg.dataFile."nvim/backup/.keep".text = ""; }; }