535 lines
15 KiB
Nix
535 lines
15 KiB
Nix
# Copyright (c) 2023 BirdeeHub
|
|
# Licensed under the MIT license
|
|
{
|
|
description = "A Lua-natic's neovim flake, with extra cats! nixCats!";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
|
nixCats.url = "github:BirdeeHub/nixCats-nvim";
|
|
|
|
neovim-nightly-overlay = {
|
|
url = "github:nix-community/neovim-nightly-overlay";
|
|
};
|
|
|
|
plugins-nvim-emmet = {
|
|
url = "github:olrtg/nvim-emmet";
|
|
flake = false;
|
|
};
|
|
|
|
"plugins-cutlass.nvim" = {
|
|
url = "github:gbprod/cutlass.nvim";
|
|
flake = false;
|
|
};
|
|
|
|
"plugins-nerdy.nvim" = {
|
|
url = "github:2kabhishek/nerdy.nvim";
|
|
flake = false;
|
|
};
|
|
|
|
# see :help nixCats.flake.inputs
|
|
# If you want your plugin to be loaded by the standard overlay,
|
|
# i.e. if it wasnt on nixpkgs, but doesnt have an extra build step.
|
|
# Then you should name it "plugins-something"
|
|
# If you wish to define a custom build step not handled by nixpkgs,
|
|
# then you should name it in a different format, and deal with that in the
|
|
# overlay defined for custom builds in the overlays directory.
|
|
# for specific tags, branches and commits, see:
|
|
# https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-flake.html#examples
|
|
};
|
|
|
|
# see :help nixCats.flake.outputs
|
|
outputs = {
|
|
self,
|
|
nixpkgs,
|
|
nixCats,
|
|
...
|
|
} @ inputs: let
|
|
inherit (nixCats) utils;
|
|
luaPath = "${./.}";
|
|
forEachSystem = utils.eachSystem nixpkgs.lib.platforms.all;
|
|
# the following extra_pkg_config contains any values
|
|
# which you want to pass to the config set of nixpkgs
|
|
# import nixpkgs { config = extra_pkg_config; inherit system; }
|
|
# will not apply to module imports
|
|
# as that will have your system values
|
|
extra_pkg_config = {
|
|
# allowUnfree = true;
|
|
};
|
|
# management of the system variable is one of the harder parts of using flakes.
|
|
|
|
# so I have done it here in an interesting way to keep it out of the way.
|
|
# It gets resolved within the builder itself, and then passed to your
|
|
# categoryDefinitions and packageDefinitions.
|
|
|
|
# this allows you to use ${pkgs.system} whenever you want in those sections
|
|
# without fear.
|
|
|
|
# sometimes our overlays require a ${system} to access the overlay.
|
|
# Your dependencyOverlays can either be lists
|
|
# in a set of ${system}, or simply a list.
|
|
# the nixCats builder function will accept either.
|
|
# see :help nixCats.flake.outputs.overlays
|
|
dependencyOverlays =
|
|
/*
|
|
(import ./overlays inputs) ++
|
|
*/
|
|
[
|
|
# This overlay grabs all the inputs named in the format
|
|
# `plugins-<pluginName>`
|
|
# Once we add this overlay to our nixpkgs, we are able to
|
|
# use `pkgs.neovimPlugins`, which is a set of our plugins.
|
|
(utils.sanitizedPluginOverlay inputs)
|
|
# add any other flake overlays here.
|
|
|
|
# when other people mess up their overlays by wrapping them with system,
|
|
# you may instead call this function on their overlay.
|
|
# it will check if it has the system in the set, and if so return the desired overlay
|
|
# (utils.fixSystemizedOverlay inputs.codeium.overlays
|
|
# (system: inputs.codeium.overlays.${system}.default)
|
|
# )
|
|
];
|
|
|
|
# see :help nixCats.flake.outputs.categories
|
|
# and
|
|
# :help nixCats.flake.outputs.categoryDefinitions.scheme
|
|
categoryDefinitions = {
|
|
pkgs,
|
|
settings,
|
|
categories,
|
|
extra,
|
|
name,
|
|
mkNvimPlugin,
|
|
...
|
|
}: {
|
|
# to define and use a new category, simply add a new list to a set here,
|
|
# and later, you will include categoryname = true; in the set you
|
|
# provide when you build the package using this builder function.
|
|
# see :help nixCats.flake.outputs.packageDefinitions for info on that section.
|
|
|
|
# lspsAndRuntimeDeps:
|
|
# this section is for dependencies that should be available
|
|
# at RUN TIME for plugins. Will be available to PATH within neovim terminal
|
|
# this includes LSPs
|
|
lspsAndRuntimeDeps = with pkgs; let
|
|
npm-modules = (import ./packages/npm-modules) {
|
|
inherit pkgs;
|
|
nodejs = pkgs.nodejs_20;
|
|
};
|
|
in {
|
|
general = [
|
|
(callPackage ./packages/erb-lint {})
|
|
alejandra
|
|
bash-language-server
|
|
biome
|
|
curl
|
|
docker-compose-language-service
|
|
dockerfile-language-server-nodejs
|
|
fd
|
|
gofumpt
|
|
gopls
|
|
gotools
|
|
grpcurl
|
|
hadolint
|
|
helm-ls
|
|
jq
|
|
lazygit
|
|
lua-language-server
|
|
markdownlint-cli2
|
|
marksman
|
|
nil
|
|
nodePackages.prettier
|
|
npm-modules.css-variables-language-server
|
|
npm-modules.markdown-toc
|
|
nushell
|
|
php84Packages.php-codesniffer
|
|
php84Packages.php-cs-fixer
|
|
phpactor
|
|
pyright
|
|
ripgrep
|
|
rubocop
|
|
ruby-lsp
|
|
rubyPackages.erb-formatter
|
|
ruff
|
|
shellcheck
|
|
shfmt
|
|
sqlfluff
|
|
stdenv.cc.cc
|
|
stylelint
|
|
stylua
|
|
tailwindcss-language-server
|
|
taplo
|
|
terraform-ls
|
|
tflint
|
|
universal-ctags
|
|
vscode-langservers-extracted
|
|
vtsls
|
|
vue-language-server
|
|
yaml-language-server
|
|
yamllint
|
|
];
|
|
};
|
|
|
|
# NOTE: lazy doesnt care if these are in startupPlugins or optionalPlugins
|
|
# also you dont have to download everything via nix if you dont want.
|
|
# but you have the option, and that is demonstrated here.
|
|
startupPlugins = with pkgs.vimPlugins;
|
|
with pkgs.neovimPlugins; {
|
|
general = [
|
|
# LazyVim
|
|
lazy-nvim
|
|
LazyVim
|
|
|
|
# Coding
|
|
{
|
|
plugin = mini-pairs;
|
|
name = "mini.pairs";
|
|
}
|
|
ts-comments-nvim
|
|
{
|
|
plugin = mini-ai;
|
|
name = "mini.ai";
|
|
}
|
|
lazydev-nvim
|
|
|
|
# Colorscheme
|
|
tokyonight-nvim
|
|
{
|
|
plugin = catppuccin-nvim;
|
|
name = "catppuccin";
|
|
}
|
|
|
|
# Editor
|
|
grug-far-nvim
|
|
flash-nvim
|
|
which-key-nvim
|
|
gitsigns-nvim
|
|
trouble-nvim
|
|
todo-comments-nvim
|
|
|
|
# Formatting
|
|
conform-nvim
|
|
|
|
# Linting
|
|
nvim-lint
|
|
|
|
# LSP
|
|
nvim-lspconfig
|
|
|
|
# Treesitter
|
|
nvim-treesitter.withAllGrammars
|
|
nvim-treesitter-textobjects
|
|
nvim-ts-autotag
|
|
|
|
# UI
|
|
bufferline-nvim
|
|
lualine-nvim
|
|
noice-nvim
|
|
{
|
|
plugin = mini-icons;
|
|
name = "mini.icons";
|
|
}
|
|
nui-nvim
|
|
|
|
# Util
|
|
snacks-nvim
|
|
persistence-nvim
|
|
plenary-nvim
|
|
|
|
# Extras
|
|
# Coding
|
|
# Blink
|
|
blink-cmp
|
|
friendly-snippets
|
|
|
|
# Luasnip
|
|
{
|
|
plugin = luasnip;
|
|
name = "LuaSnip";
|
|
}
|
|
|
|
# Mini-comment
|
|
{
|
|
plugin = mini-comment;
|
|
name = "mini.comment";
|
|
}
|
|
nvim-ts-context-commentstring
|
|
|
|
# Mini-surround
|
|
{
|
|
plugin = mini-surround;
|
|
name = "mini.surround";
|
|
}
|
|
|
|
# Neogen
|
|
neogen
|
|
|
|
# yanky.nvim
|
|
yanky-nvim
|
|
|
|
# Editor
|
|
# Aerial
|
|
aerial-nvim
|
|
|
|
# Dial
|
|
dial-nvim
|
|
|
|
# Navic
|
|
nvim-navic
|
|
|
|
# Neo-tree
|
|
neo-tree-nvim
|
|
|
|
# Refactoring
|
|
refactoring-nvim
|
|
|
|
# Lang
|
|
# Go
|
|
nvim-dap-go
|
|
neotest-golang
|
|
|
|
# Helm
|
|
vim-helm
|
|
|
|
# JSON & YAML
|
|
SchemaStore-nvim
|
|
|
|
# Markdown
|
|
markdown-preview-nvim
|
|
render-markdown-nvim
|
|
|
|
# Python
|
|
neotest-python
|
|
|
|
# Ruby
|
|
neotest-rspec
|
|
|
|
# Sql
|
|
vim-dadbod
|
|
vim-dadbod-completion
|
|
vim-dadbod-ui
|
|
|
|
# Test
|
|
# Neotest
|
|
neotest
|
|
nvim-nio
|
|
|
|
# UI
|
|
# Mini Animate
|
|
{
|
|
plugin = mini-animate;
|
|
name = "mini.animate";
|
|
}
|
|
|
|
# Treesitter-context
|
|
nvim-treesitter-context
|
|
|
|
# Util
|
|
# Mini Hipatterns
|
|
{
|
|
plugin = mini-hipatterns;
|
|
name = "mini.hipatterns";
|
|
}
|
|
|
|
# Octo
|
|
octo-nvim
|
|
|
|
# Project
|
|
project-nvim
|
|
|
|
# Rest
|
|
kulala-nvim
|
|
|
|
# Custom
|
|
cutlass-nvim
|
|
diffview-nvim
|
|
nerdy-nvim
|
|
nvim-emmet
|
|
rose-pine
|
|
treesj
|
|
vim-caddyfile
|
|
];
|
|
};
|
|
|
|
# not loaded automatically at startup.
|
|
# use with packadd and an autocommand in config to achieve lazy loading
|
|
# NOTE: this template is using lazy.nvim so, which list you put them in is irrelevant.
|
|
# startupPlugins or optionalPlugins, it doesnt matter, lazy.nvim does the loading.
|
|
# I just put them all in startupPlugins. I could have put them all in here instead.
|
|
optionalPlugins = {};
|
|
|
|
# shared libraries to be added to LD_LIBRARY_PATH
|
|
# variable available to nvim runtime
|
|
sharedLibraries = {
|
|
# general = with pkgs; [
|
|
# libgit2
|
|
# ];
|
|
};
|
|
|
|
# environmentVariables:
|
|
# this section is for environmentVariables that should be available
|
|
# at RUN TIME for plugins. Will be available to path within neovim terminal
|
|
environmentVariables = {
|
|
test = {
|
|
CATTESTVAR = "It worked!";
|
|
};
|
|
};
|
|
|
|
# If you know what these are, you can provide custom ones by category here.
|
|
# If you dont, check this link out:
|
|
# https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/setup-hooks/make-wrapper.sh
|
|
extraWrapperArgs = {
|
|
test = [
|
|
''--set CATTESTVAR2 "It worked again!"''
|
|
];
|
|
};
|
|
|
|
# lists of the functions you would have passed to
|
|
# python.withPackages or lua.withPackages
|
|
|
|
# get the path to this python environment
|
|
# in your lua config via
|
|
# vim.g.python3_host_prog
|
|
# or run from nvim terminal via :!<packagename>-python3
|
|
extraPython3Packages = {
|
|
test = [(_: [])];
|
|
};
|
|
# populates $LUA_PATH and $LUA_CPATH
|
|
extraLuaPackages = {
|
|
test = [(_: [])];
|
|
};
|
|
};
|
|
|
|
# And then build a package with specific categories from above here:
|
|
# All categories you wish to include must be marked true,
|
|
# but false may be omitted.
|
|
# This entire set is also passed to nixCats for querying within the lua.
|
|
|
|
# see :help nixCats.flake.outputs.packageDefinitions
|
|
packageDefinitions = {
|
|
# These are the names of your packages
|
|
# you can include as many as you wish.
|
|
nvim = {
|
|
pkgs,
|
|
mkNvimPlugin,
|
|
...
|
|
}: {
|
|
# they contain a settings set defined above
|
|
# see :help nixCats.flake.outputs.settings
|
|
settings = {
|
|
wrapRc = true;
|
|
# IMPORTANT:
|
|
# your alias may not conflict with your other packages.
|
|
# aliases = [ "vim" ];
|
|
neovim-unwrapped = inputs.neovim-nightly-overlay.packages.${pkgs.system}.neovim;
|
|
};
|
|
# and a set of categories that you want
|
|
# (and other information to pass to lua)
|
|
categories = {
|
|
general = true;
|
|
test = false;
|
|
};
|
|
extra = {};
|
|
};
|
|
# an extra test package with normal lua reload for fast edits
|
|
# nix doesnt provide the config in this package, allowing you free reign to edit it.
|
|
# then you can swap back to the normal pure package when done.
|
|
testnvim = {
|
|
pkgs,
|
|
mkNvimPlugin,
|
|
...
|
|
}: {
|
|
settings = {
|
|
wrapRc = false;
|
|
unwrappedCfgPath = "/absolute/path/to/config";
|
|
};
|
|
categories = {
|
|
general = true;
|
|
test = false;
|
|
};
|
|
extra = {};
|
|
};
|
|
};
|
|
# In this section, the main thing you will need to do is change the default package name
|
|
# to the name of the packageDefinitions entry you wish to use as the default.
|
|
defaultPackageName = "nvim";
|
|
in
|
|
# see :help nixCats.flake.outputs.exports
|
|
forEachSystem (system: let
|
|
# the builder function that makes it all work
|
|
nixCatsBuilder =
|
|
utils.baseBuilder luaPath {
|
|
inherit nixpkgs system dependencyOverlays extra_pkg_config;
|
|
}
|
|
categoryDefinitions
|
|
packageDefinitions;
|
|
defaultPackage = nixCatsBuilder defaultPackageName;
|
|
# this is just for using utils such as pkgs.mkShell
|
|
# The one used to build neovim is resolved inside the builder
|
|
# and is passed to our categoryDefinitions and packageDefinitions
|
|
pkgs = import nixpkgs {inherit system;};
|
|
in {
|
|
# these outputs will be wrapped with ${system} by utils.eachSystem
|
|
|
|
# this will make a package out of each of the packageDefinitions defined above
|
|
# and set the default package to the one passed in here.
|
|
packages = utils.mkAllWithDefault defaultPackage;
|
|
|
|
# choose your package for devShell
|
|
# and add whatever else you want in it.
|
|
devShells = {
|
|
default = pkgs.mkShell {
|
|
name = defaultPackageName;
|
|
packages = [defaultPackage];
|
|
inputsFrom = [];
|
|
shellHook = ''
|
|
'';
|
|
};
|
|
};
|
|
})
|
|
// (let
|
|
# we also export a nixos module to allow reconfiguration from configuration.nix
|
|
nixosModule = utils.mkNixosModules {
|
|
moduleNamespace = [defaultPackageName];
|
|
inherit
|
|
defaultPackageName
|
|
dependencyOverlays
|
|
luaPath
|
|
categoryDefinitions
|
|
packageDefinitions
|
|
extra_pkg_config
|
|
nixpkgs
|
|
;
|
|
};
|
|
# and the same for home manager
|
|
homeModule = utils.mkHomeModules {
|
|
moduleNamespace = [defaultPackageName];
|
|
inherit
|
|
defaultPackageName
|
|
dependencyOverlays
|
|
luaPath
|
|
categoryDefinitions
|
|
packageDefinitions
|
|
extra_pkg_config
|
|
nixpkgs
|
|
;
|
|
};
|
|
in {
|
|
# these outputs will be NOT wrapped with ${system}
|
|
|
|
# this will make an overlay out of each of the packageDefinitions defined above
|
|
# and set the default overlay to the one named here.
|
|
overlays =
|
|
utils.makeOverlays luaPath {
|
|
inherit nixpkgs dependencyOverlays extra_pkg_config;
|
|
}
|
|
categoryDefinitions
|
|
packageDefinitions
|
|
defaultPackageName;
|
|
|
|
nixosModules.default = nixosModule;
|
|
homeModules.default = homeModule;
|
|
|
|
inherit utils nixosModule homeModule;
|
|
inherit (utils) templates;
|
|
});
|
|
}
|