{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; nix2lua.url = "git+https://git.pleshevski.ru/mynix/nix2lua"; # Plenary (required by crates-nvim) plenary-nvim = { url = "github:nvim-lua/plenary.nvim"; flake = false; }; # config # https://github.com/gpanders/editorconfig.nvim editorconfig-nvim = { url = "github:gpanders/editorconfig.nvim?rev=e72d2331b43e3f08d0ecca44cecded4e20c01fab"; flake = false; }; # explorer # https://github.com/kyazdani42/nvim-tree.lua nvim-tree-lua = { url = "github:kyazdani42/nvim-tree.lua?rev=1837751efb5fcfc584cb0ee900f09ff911cd6c0b"; flake = false; }; # https://github.com/nvim-telescope/telescope.nvim telescope-nvim = { url = "github:nvim-telescope/telescope.nvim?rev=f174a0367b4fc7cb17710d867e25ea792311c418"; flake = false; }; # https://github.com/nvim-telescope/telescope-live-grep-args.nvim telescope-live-grep-args-nvim = { url = "github:nvim-telescope/telescope-live-grep-args.nvim?rev=32b633b062d1168a2d18ad27994e5b4ef97f0a74"; flake = false; }; # formatter # https://github.com/sbdchd/neoformat neoformat = { url = "github:sbdchd/neoformat?rev=918840f9f8944fdb05451e4a77d29b97898b415c"; flake = false; }; # git # https://github.com/lewis6991/gitsigns.nvim gitsigns-nvim = { url = "github:lewis6991/gitsigns.nvim?rev=f98c85e7c3d65a51f45863a34feb4849c82f240f"; flake = false; }; # lsp # https://github.com/neovim/nvim-lspconfig nvim-lspconfig = { url = "github:neovim/nvim-lspconfig?rev=d4eb971db353ccf78cefb3be1b05483b69ec1e69"; flake = false; }; # https://github.com/tamago324/nlsp-settings.nvim nlsp-settings-nvim = { url = "github:tamago324/nlsp-settings.nvim?rev=effb5f50b2ad7d6070e429635384345ca4be078e"; flake = false; }; # https://github.com/glepnir/lspsaga.nvim lspsaga-nvim = { url = "github:glepnir/lspsaga.nvim?rev=f33bc99d0ed3ed691a58b3339decf4e1933c3f9e"; flake = false; }; # https://github.com/L3MON4D3/LuaSnip luasnip = { url = "github:L3MON4D3/LuaSnip?rev=d36c063b7f6e701852f7880f1314656592a61b4f"; flake = false; }; # https://github.com/hrsh7th/nvim-cmp nvim-cmp = { url = "github:hrsh7th/nvim-cmp?rev=17a55b3d5498c617855d015bbcad0c872d10c879"; flake = false; }; # https://github.com/hrsh7th/cmp-nvim-lsp cmp-nvim-lsp = { url = "github:hrsh7th/cmp-nvim-lsp?rev=affe808a5c56b71630f17aa7c38e15c59fd648a8"; flake = false; }; # https://github.com/saadparwaiz1/cmp_luasnip cmp-luasnip = { url = "github:saadparwaiz1/cmp_luasnip?rev=a9de941bcbda508d0a45d28ae366bb3f08db2e36"; flake = false; }; # theme # https://github.com/nanozuki/tabby.nvim tabby-nvim = { url = "github:nanozuki/tabby.nvim?rev=a7710f38ded0cda5b07e38f10c55ed1940b35b19"; flake = false; }; # https://github.com/nvim-lualine/lualine.nvim lualine-nvim = { url = "github:nvim-lualine/lualine.nvim?rev=a52f078026b27694d2290e34efa61a6e4a690621"; flake = false; }; # https://github.com/arkav/lualine-lsp-progress lualine-lsp-progress = { url = "github:/arkav/lualine-lsp-progress?rev=56842d097245a08d77912edf5f2a69ba29f275d7"; flake = false; }; # https://github.com/kyazdani42/nvim-web-devicons nvim-web-devicons = { url = "github:kyazdani42/nvim-web-devicons?rev=969728506c0175644a1d448f55e311ccdada7eaf"; flake = false; }; # https://github.com/catppuccin/nvim theme = { url = "github:catppuccin/nvim?rev=9ac18414f0446478024b19018d73b7ea14f6fc96"; flake = false; }; # ux # https://github.com/phaazon/hop.nvim hop-nvim = { url = "github:phaazon/hop.nvim?rev=6591b3656b75ff313cc38dc662a7ee8f75f1c165"; flake = false; }; # https://github.com/nvim-orgmode/orgmode nvim-orgmode = { url = "github:nvim-orgmode/orgmode?rev=fc9bb0f5823d01e4008e4b86663772d4148aa9ce"; flake = false; }; # https://github.com/akinsho/org-bullets.nvim org-bullets-nvim = { url = "github:akinsho/org-bullets.nvim"; flake = false; }; }; outputs = inputs @ { self, nixpkgs, flake-utils, nix2lua, ... }: let inputPlugins = [ "plenary-nvim" # config "editorconfig-nvim" # explorer "nvim-tree-lua" "telescope-nvim" "telescope-live-grep-args-nvim" # formatter "neoformat" # git "gitsigns-nvim" # lsp "nvim-lspconfig" "nlsp-settings-nvim" "lspsaga-nvim" "luasnip" "nvim-cmp" "cmp-nvim-lsp" "cmp-luasnip" # theme "tabby-nvim" "lualine-nvim" "lualine-lsp-progress" "nvim-web-devicons" "theme" # ux "hop-nvim" "nvim-orgmode" "org-bullets-nvim" ]; mkNvimPlugins = { lib, vimUtils, vimPlugins, ... }: let inherit (builtins) getAttr attrNames pathExists readDir; inherit (lib) listToAttrs nameValuePair; buildPlugin = name: vimUtils.buildVimPluginFrom2Nix { name = name; src = getAttr name inputs; patches = lib.optional (pathExists ./patches/${name}) (map (fn: ./patches/${name}/${fn}) (attrNames (readDir ./patches/${name})) ); }; buildPluginValuePair = n: nameValuePair n (buildPlugin n); neovimPlugins = (listToAttrs (map buildPluginValuePair inputPlugins)) // { inherit (vimPlugins) nvim-treesitter; }; in { inherit neovimPlugins; inherit nix2lua; }; mkNeovim = pkgs: pkgs.callPackage ./neovim.nix (mkNvimPlugins pkgs); in { overlays = { default = final: prev: { myneovim = mkNeovim prev; }; }; } // flake-utils.lib.eachDefaultSystem (system: let inherit (builtins) mapAttrs; pkgs = import nixpkgs { inherit system; }; minimalNeovim = mkNeovim pkgs; recommendedNeovim = (minimalNeovim.override { enableDevIcons = true; enableTabby = true; grammarFileTypes = [ "nix" "lua" ]; plugins = with minimalNeovim.nix2lua; { nvimTree.settings = { open_on_setup = true; renderer = { group_empty = true; full_name = true; }; }; lualine.settings = { options.ignore_focus = [ "NvimTree" ]; sections = { lualine_a = [ [ "filename" (mkNamedField "path" 1) ] ]; lualine_b = [ "branch" "diff" "diagnostics" ]; lualine_c = [ "lsp_progress" ]; lualine_x = [ "filesize" "filetype" ]; lualine_y = [ "progress" ]; lualine_z = [ "location" "mode" ]; }; }; }; }); fullNeovim = recommendedNeovim.override { grammarFileTypes = [ "nix" "lua" "bash" "yaml" "json" "rust" "haskell" "typescript" "javascript" "python" "sql" "html" "pug" ]; plugins = recommendedNeovim.plugins // (with minimalNeovim.nix2lua; { lspSaga.settings = { border_style = "rounded"; symbol_in_winbar.enable = false; code_action_lightbulb.enable = false; code_action_keys = { quit = ""; }; definition_action_keys = { quit = ""; }; rename_action_quit = ""; }; lspConfig = { servers = { nil_ls = { }; tsserver = { }; eslint = { }; denols = { root_dir = mkLuaRaw "root_pattern(\"deno.json\", \"deno.jsonc\")"; }; rust_analyzer = { settings.rust-analyzer = { "server.path" = "rust-analyzer"; "updates.prompt" = false; "updates.checkOnStartup" = false; "checkOnSave.enable" = true; "checkOnSave.command" = "clippy"; "cargo.autoreload" = true; }; }; }; }; }); }; packages = { default = recommendedNeovim; recommended = recommendedNeovim; full = fullNeovim; minimal = minimalNeovim; }; mkApp = drv: { type = "app"; program = "${drv}/bin/nvim"; }; in { inherit packages; apps = mapAttrs (name: mkApp) packages; devShells.default = pkgs.mkShell { packages = [ pkgs.stylua # lua formatter ]; }; }); }