mirror of
https://github.com/NotAShelf/nvf.git
synced 2024-11-26 15:06:45 +00:00
Merge pull request #245 from NotAShelf/new-tree-structure
treewide: restructure neovim-flake tree
This commit is contained in:
commit
b1d6ec75ed
272 changed files with 2428 additions and 2350 deletions
|
@ -18,18 +18,18 @@ inputs: let
|
||||||
};
|
};
|
||||||
|
|
||||||
mainConfig = isMaximal: {
|
mainConfig = isMaximal: {
|
||||||
config = {
|
config.vim = {
|
||||||
vim = {
|
viAlias = true;
|
||||||
viAlias = true;
|
vimAlias = true;
|
||||||
vimAlias = true;
|
debugMode = {
|
||||||
debugMode = {
|
enable = false;
|
||||||
enable = false;
|
level = 20;
|
||||||
level = 20;
|
logFile = "/tmp/nvim.log";
|
||||||
logFile = "/tmp/nvim.log";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.lsp = {
|
spellcheck.vim-dirtytalk.enable = true;
|
||||||
|
|
||||||
|
lsp = {
|
||||||
formatOnSave = true;
|
formatOnSave = true;
|
||||||
lspkind.enable = false;
|
lspkind.enable = false;
|
||||||
lightbulb.enable = true;
|
lightbulb.enable = true;
|
||||||
|
@ -41,14 +41,14 @@ inputs: let
|
||||||
nvim-docs-view.enable = isMaximal;
|
nvim-docs-view.enable = isMaximal;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.debugger = {
|
debugger = {
|
||||||
nvim-dap = {
|
nvim-dap = {
|
||||||
enable = true;
|
enable = true;
|
||||||
ui.enable = true;
|
ui.enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.languages = {
|
languages = {
|
||||||
enableLSP = true;
|
enableLSP = true;
|
||||||
enableFormat = true;
|
enableFormat = true;
|
||||||
enableTreesitter = true;
|
enableTreesitter = true;
|
||||||
|
@ -81,7 +81,7 @@ inputs: let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.visuals = {
|
visuals = {
|
||||||
enable = true;
|
enable = true;
|
||||||
nvimWebDevicons.enable = true;
|
nvimWebDevicons.enable = true;
|
||||||
scrollBar.enable = true;
|
scrollBar.enable = true;
|
||||||
|
@ -105,70 +105,71 @@ inputs: let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.statusline = {
|
statusline = {
|
||||||
lualine = {
|
lualine = {
|
||||||
enable = true;
|
enable = true;
|
||||||
theme = "catppuccin";
|
theme = "catppuccin";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.theme = {
|
theme = {
|
||||||
enable = true;
|
enable = true;
|
||||||
name = "catppuccin";
|
name = "catppuccin";
|
||||||
style = "mocha";
|
style = "mocha";
|
||||||
transparent = false;
|
transparent = false;
|
||||||
};
|
};
|
||||||
vim.autopairs.enable = true;
|
|
||||||
|
|
||||||
vim.autocomplete = {
|
autopairs.enable = true;
|
||||||
|
|
||||||
|
autocomplete = {
|
||||||
enable = true;
|
enable = true;
|
||||||
type = "nvim-cmp";
|
type = "nvim-cmp";
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.filetree = {
|
filetree = {
|
||||||
nvimTree = {
|
nvimTree = {
|
||||||
enable = true;
|
enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.tabline = {
|
tabline = {
|
||||||
nvimBufferline.enable = true;
|
nvimBufferline.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.treesitter.context.enable = true;
|
treesitter.context.enable = true;
|
||||||
|
|
||||||
vim.binds = {
|
binds = {
|
||||||
whichKey.enable = true;
|
whichKey.enable = true;
|
||||||
cheatsheet.enable = true;
|
cheatsheet.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.telescope.enable = true;
|
telescope.enable = true;
|
||||||
|
|
||||||
vim.git = {
|
git = {
|
||||||
enable = true;
|
enable = true;
|
||||||
gitsigns.enable = true;
|
gitsigns.enable = true;
|
||||||
gitsigns.codeActions = false; # throws an annoying debug message
|
gitsigns.codeActions = false; # throws an annoying debug message
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.minimap = {
|
minimap = {
|
||||||
minimap-vim.enable = false;
|
minimap-vim.enable = false;
|
||||||
codewindow.enable = isMaximal; # lighter, faster, and uses lua for configuration
|
codewindow.enable = isMaximal; # lighter, faster, and uses lua for configuration
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.dashboard = {
|
dashboard = {
|
||||||
dashboard-nvim.enable = false;
|
dashboard-nvim.enable = false;
|
||||||
alpha.enable = isMaximal;
|
alpha.enable = isMaximal;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.notify = {
|
notify = {
|
||||||
nvim-notify.enable = true;
|
nvim-notify.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.projects = {
|
projects = {
|
||||||
project-nvim.enable = isMaximal;
|
project-nvim.enable = isMaximal;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.utility = {
|
utility = {
|
||||||
ccc.enable = isMaximal;
|
ccc.enable = isMaximal;
|
||||||
vim-wakatime.enable = isMaximal;
|
vim-wakatime.enable = isMaximal;
|
||||||
icon-picker.enable = isMaximal;
|
icon-picker.enable = isMaximal;
|
||||||
|
@ -184,21 +185,21 @@ inputs: let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.notes = {
|
notes = {
|
||||||
obsidian.enable = false; # FIXME: neovim fails to build if obsidian is enabled
|
obsidian.enable = false; # FIXME: neovim fails to build if obsidian is enabled
|
||||||
orgmode.enable = false;
|
orgmode.enable = false;
|
||||||
mind-nvim.enable = isMaximal;
|
mind-nvim.enable = isMaximal;
|
||||||
todo-comments.enable = true;
|
todo-comments.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.terminal = {
|
terminal = {
|
||||||
toggleterm = {
|
toggleterm = {
|
||||||
enable = true;
|
enable = true;
|
||||||
lazygit.enable = true;
|
lazygit.enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.ui = {
|
ui = {
|
||||||
borders.enable = true;
|
borders.enable = true;
|
||||||
noice.enable = true;
|
noice.enable = true;
|
||||||
colorizer.enable = true;
|
colorizer.enable = true;
|
||||||
|
@ -220,26 +221,26 @@ inputs: let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.assistant = {
|
assistant = {
|
||||||
copilot = {
|
copilot = {
|
||||||
enable = isMaximal;
|
enable = isMaximal;
|
||||||
cmp.enable = isMaximal;
|
cmp.enable = isMaximal;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.session = {
|
session = {
|
||||||
nvim-session-manager.enable = false;
|
nvim-session-manager.enable = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.gestures = {
|
gestures = {
|
||||||
gesture-nvim.enable = false;
|
gesture-nvim.enable = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.comments = {
|
comments = {
|
||||||
comment-nvim.enable = true;
|
comment-nvim.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim.presence = {
|
presence = {
|
||||||
neocord.enable = true;
|
neocord.enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,21 +1,40 @@
|
||||||
{
|
{
|
||||||
|
inputs,
|
||||||
pkgs,
|
pkgs,
|
||||||
lib ? import ../lib/stdlib-extended.nix pkgs.lib,
|
lib ? import ../lib/stdlib-extended.nix pkgs.lib inputs,
|
||||||
nmdSrc,
|
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
nmd = import nmdSrc {
|
inherit (lib.modules) mkForce evalModules;
|
||||||
inherit lib;
|
inherit (lib.strings) hasPrefix removePrefix;
|
||||||
# The DocBook output of `nixos-render-docs` doesn't have the change
|
inherit (lib.attrsets) isAttrs mapAttrs optionalAttrs recursiveUpdate isDerivation;
|
||||||
# `nmd` uses to work around the broken stylesheets in
|
|
||||||
# `docbook-xsl-ns`, so we restore the patched version here.
|
# From home-manager:
|
||||||
pkgs =
|
#
|
||||||
pkgs
|
# Recursively replace each derivation in the given attribute set
|
||||||
// {
|
# with the same derivation but with the `outPath` attribute set to
|
||||||
docbook-xsl-ns =
|
# the string `"\${pkgs.attribute.path}"`. This allows the
|
||||||
pkgs.docbook-xsl-ns.override {withManOptDedupPatch = true;};
|
# documentation to refer to derivations through their values without
|
||||||
};
|
# establishing an actual dependency on the derivation output.
|
||||||
};
|
#
|
||||||
|
# This is not perfect, but it seems to cover a vast majority of use
|
||||||
|
# cases.
|
||||||
|
#
|
||||||
|
# Caveat: even if the package is reached by a different means, the
|
||||||
|
# path above will be shown and not e.g.
|
||||||
|
# `${config.services.foo.package}`.
|
||||||
|
scrubDerivations = prefixPath: attrs: let
|
||||||
|
scrubDerivation = name: value: let
|
||||||
|
pkgAttrName = prefixPath + "." + name;
|
||||||
|
in
|
||||||
|
if isAttrs value
|
||||||
|
then
|
||||||
|
scrubDerivations pkgAttrName value
|
||||||
|
// optionalAttrs (isDerivation value) {
|
||||||
|
outPath = "\${${pkgAttrName}}";
|
||||||
|
}
|
||||||
|
else value;
|
||||||
|
in
|
||||||
|
mapAttrs scrubDerivation attrs;
|
||||||
|
|
||||||
# Make sure the used package is scrubbed to avoid actually
|
# Make sure the used package is scrubbed to avoid actually
|
||||||
# instantiating derivations.
|
# instantiating derivations.
|
||||||
|
@ -23,30 +42,30 @@
|
||||||
imports = [
|
imports = [
|
||||||
{
|
{
|
||||||
_module.args = {
|
_module.args = {
|
||||||
pkgs = lib.mkForce (nmd.scrubDerivations "pkgs" pkgs);
|
pkgs = mkForce (scrubDerivations "pkgs" pkgs);
|
||||||
pkgs_i686 = lib.mkForce {};
|
pkgs_i686 = mkForce {};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
dontCheckDefinitions = {_module.check = false;};
|
# Specify the path to the module entrypoint
|
||||||
|
|
||||||
githubDeclaration = user: repo: subpath: let
|
|
||||||
urlRef = "main";
|
|
||||||
in {
|
|
||||||
url = "https://github.com/${user}/${repo}/blob/${urlRef}/${subpath}";
|
|
||||||
name = "<${repo}/${subpath}>";
|
|
||||||
};
|
|
||||||
|
|
||||||
nvimPath = toString ./..;
|
nvimPath = toString ./..;
|
||||||
|
|
||||||
buildOptionsDocs = args @ {
|
buildOptionsDocs = args @ {
|
||||||
modules,
|
modules,
|
||||||
includeModuleSystemOptions ? true,
|
includeModuleSystemOptions ? true,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
inherit ((lib.evalModules {inherit modules;})) options;
|
inherit ((evalModules {inherit modules;})) options;
|
||||||
|
|
||||||
|
# Declaration of the Github site URL.
|
||||||
|
githubDeclaration = user: repo: subpath: let
|
||||||
|
urlRef = "github.com";
|
||||||
|
branch = "main";
|
||||||
|
in {
|
||||||
|
url = "https://${urlRef}/${user}/${repo}/blob/${branch}/${subpath}";
|
||||||
|
name = "<${repo}/${subpath}>";
|
||||||
|
};
|
||||||
in
|
in
|
||||||
pkgs.buildPackages.nixosOptionsDoc ({
|
pkgs.buildPackages.nixosOptionsDoc ({
|
||||||
options =
|
options =
|
||||||
|
@ -54,15 +73,14 @@
|
||||||
then options
|
then options
|
||||||
else builtins.removeAttrs options ["_module"];
|
else builtins.removeAttrs options ["_module"];
|
||||||
transformOptions = opt:
|
transformOptions = opt:
|
||||||
opt
|
recursiveUpdate opt {
|
||||||
// {
|
# Clean up declaration sites to not refer to the neovim-flakee
|
||||||
# Clean up declaration sites to not refer to the Home Manager
|
|
||||||
# source tree.
|
# source tree.
|
||||||
declarations = map (decl:
|
declarations = map (decl:
|
||||||
if lib.hasPrefix nvimPath (toString decl)
|
if hasPrefix nvimPath (toString decl)
|
||||||
then
|
then
|
||||||
githubDeclaration "notashelf" "neovim-flake"
|
githubDeclaration "notashelf" "neovim-flake"
|
||||||
(lib.removePrefix "/" (lib.removePrefix nvimPath (toString decl)))
|
(removePrefix "/" (removePrefix nvimPath (toString decl)))
|
||||||
else if decl == "lib/modules.nix"
|
else if decl == "lib/modules.nix"
|
||||||
then
|
then
|
||||||
# TODO: handle this in a better way (may require upstream
|
# TODO: handle this in a better way (may require upstream
|
||||||
|
@ -86,6 +104,7 @@
|
||||||
|
|
||||||
release-config = builtins.fromJSON (builtins.readFile ../release.json);
|
release-config = builtins.fromJSON (builtins.readFile ../release.json);
|
||||||
revision = "release-${release-config.release}";
|
revision = "release-${release-config.release}";
|
||||||
|
|
||||||
# Generate the `man home-configuration.nix` package
|
# Generate the `man home-configuration.nix` package
|
||||||
nvf-configuration-manual =
|
nvf-configuration-manual =
|
||||||
pkgs.runCommand "neovim-flake-reference-manpage" {
|
pkgs.runCommand "neovim-flake-reference-manpage" {
|
||||||
|
@ -95,32 +114,36 @@
|
||||||
# Generate manpages.
|
# Generate manpages.
|
||||||
mkdir -p $out/share/man/man5
|
mkdir -p $out/share/man/man5
|
||||||
mkdir -p $out/share/man/man1
|
mkdir -p $out/share/man/man1
|
||||||
|
|
||||||
nixos-render-docs -j $NIX_BUILD_CORES options manpage \
|
nixos-render-docs -j $NIX_BUILD_CORES options manpage \
|
||||||
--revision ${revision} \
|
--revision ${revision} \
|
||||||
${nvimModuleDocs.optionsJSON}/share/doc/nixos/options.json \
|
${nvimModuleDocs.optionsJSON}/share/doc/nixos/options.json \
|
||||||
$out/share/man/man5/neovim-flake.5
|
$out/share/man/man5/neovim-flake.5
|
||||||
|
|
||||||
cp ${./neovim-flake.1} $out/share/man/man1/neovim-flake.1
|
cp ${./neovim-flake.1} $out/share/man/man1/neovim-flake.1
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# Generate the HTML manual pages
|
# Generate the HTML manual pages
|
||||||
neovim-flake-manual = pkgs.callPackage ./manual.nix {
|
neovim-flake-manual = pkgs.callPackage ./manual.nix {
|
||||||
|
inherit (inputs) nmd;
|
||||||
inherit revision;
|
inherit revision;
|
||||||
outputPath = "share/doc/neovim-flake";
|
outputPath = "share/doc/neovim-flake";
|
||||||
nmd = nmdSrc;
|
|
||||||
options = {
|
options = {
|
||||||
neovim-flake = nvimModuleDocs.optionsJSON;
|
neovim-flake = nvimModuleDocs.optionsJSON;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
html = neovim-flake-manual;
|
html = neovim-flake-manual;
|
||||||
htmlOpenTool = pkgs.callPackage ./html-open-tool.nix {} {inherit html;};
|
htmlOpenTool = pkgs.callPackage ./html-open-tool.nix {} {inherit html;};
|
||||||
in {
|
in {
|
||||||
inherit nmdSrc;
|
inherit (inputs) nmd;
|
||||||
|
|
||||||
options = {
|
options = {
|
||||||
# TODO: Use `hmOptionsDocs.optionsJSON` directly once upstream
|
# TODO: Use `hmOptionsDocs.optionsJSON` directly once upstream
|
||||||
# `nixosOptionsDoc` is more customizable.
|
# `nixosOptionsDoc` is more customizable.
|
||||||
json =
|
json =
|
||||||
pkgs.runCommand "options.json" {
|
pkgs.runCommand "options.json" {
|
||||||
meta.description = "List of Home Manager options in JSON format";
|
meta.description = "List of neovim-flake options in JSON format";
|
||||||
} ''
|
} ''
|
||||||
mkdir -p $out/{share/doc,nix-support}
|
mkdir -p $out/{share/doc,nix-support}
|
||||||
cp -a ${nvimModuleDocs.optionsJSON}/share/doc/nixos $out/share/doc/neovim-flake
|
cp -a ${nvimModuleDocs.optionsJSON}/share/doc/nixos $out/share/doc/neovim-flake
|
||||||
|
|
2329
flake.lock
2329
flake.lock
File diff suppressed because it is too large
Load diff
409
flake.nix
409
flake.nix
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
flake = {
|
flake = {
|
||||||
lib = {
|
lib = {
|
||||||
inherit (import ./lib/stdlib-extended.nix nixpkgs.lib) nvim;
|
inherit (import ./lib/stdlib-extended.nix nixpkgs.lib inputs) nvim;
|
||||||
inherit (import ./configuration.nix inputs) neovimConfiguration;
|
inherit (import ./configuration.nix inputs) neovimConfiguration;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -68,129 +68,6 @@
|
||||||
# TODO: get zig from the zig overlay instead of nixpkgs
|
# TODO: get zig from the zig overlay instead of nixpkgs
|
||||||
zig.url = "github:mitchellh/zig-overlay";
|
zig.url = "github:mitchellh/zig-overlay";
|
||||||
|
|
||||||
# LSP plugins
|
|
||||||
nvim-lspconfig = {
|
|
||||||
# url = "github:neovim/nvim-lspconfig?ref=v0.1.3";
|
|
||||||
# Use master for nil_ls
|
|
||||||
url = "github:neovim/nvim-lspconfig";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
lspsaga = {
|
|
||||||
url = "github:tami5/lspsaga.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
lspkind = {
|
|
||||||
url = "github:onsails/lspkind-nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
trouble = {
|
|
||||||
url = "github:folke/trouble.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
nvim-treesitter-context = {
|
|
||||||
url = "github:nvim-treesitter/nvim-treesitter-context";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
nvim-lightbulb = {
|
|
||||||
url = "github:kosayoda/nvim-lightbulb";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
nvim-code-action-menu = {
|
|
||||||
url = "github:weilbith/nvim-code-action-menu";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
lsp-signature = {
|
|
||||||
url = "github:ray-x/lsp_signature.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
lsp-lines = {
|
|
||||||
url = "sourcehut:~whynothugo/lsp_lines.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
none-ls = {
|
|
||||||
# https://github.com/nvimtools/none-ls.nvim/issues/58
|
|
||||||
url = "github:nvimtools/none-ls.nvim/bb680d752cec37949faca7a1f509e2fe67ab418a";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
nvim-docs-view = {
|
|
||||||
url = "github:amrbashir/nvim-docs-view";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
# language support
|
|
||||||
sqls-nvim = {
|
|
||||||
url = "github:nanotee/sqls.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
rust-tools = {
|
|
||||||
url = "github:simrat39/rust-tools.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
flutter-tools = {
|
|
||||||
url = "github:akinsho/flutter-tools.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
neodev-nvim = {
|
|
||||||
url = "github:folke/neodev.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
elixir-ls = {
|
|
||||||
url = "github:elixir-lsp/elixir-ls";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
elixir-tools = {
|
|
||||||
url = "github:elixir-tools/elixir-tools.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
glow-nvim = {
|
|
||||||
url = "github:ellisonleao/glow.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
image-nvim = {
|
|
||||||
url = "github:3rd/image.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Tidal cycles
|
|
||||||
tidalcycles = {
|
|
||||||
url = "github:mitchmindtree/tidalcycles.nix";
|
|
||||||
inputs.vim-tidal-src.url = "github:tidalcycles/vim-tidal";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Copying/Registers
|
|
||||||
registers = {
|
|
||||||
url = "github:tversteeg/registers.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
nvim-neoclip = {
|
|
||||||
url = "github:AckslD/nvim-neoclip.lua";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Telescope
|
|
||||||
telescope = {
|
|
||||||
url = "github:nvim-telescope/telescope.nvim";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Langauge server (use master instead of nixpkgs)
|
# Langauge server (use master instead of nixpkgs)
|
||||||
rnix-lsp.url = "github:nix-community/rnix-lsp";
|
rnix-lsp.url = "github:nix-community/rnix-lsp";
|
||||||
nil = {
|
nil = {
|
||||||
|
@ -199,393 +76,521 @@
|
||||||
inputs.flake-utils.follows = "flake-utils";
|
inputs.flake-utils.follows = "flake-utils";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
### Plugins
|
||||||
|
# Tidal cycles
|
||||||
|
tidalcycles = {
|
||||||
|
url = "github:mitchmindtree/tidalcycles.nix";
|
||||||
|
inputs.vim-tidal-src.url = "github:tidalcycles/vim-tidal";
|
||||||
|
};
|
||||||
|
|
||||||
|
# LSP plugins
|
||||||
|
plugin-nvim-lspconfig = {
|
||||||
|
# url = "github:neovim/nvim-lspconfig?ref=v0.1.3";
|
||||||
|
# Use master for nil_ls
|
||||||
|
url = "github:neovim/nvim-lspconfig";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-lspsaga = {
|
||||||
|
url = "github:tami5/lspsaga.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-lspkind = {
|
||||||
|
url = "github:onsails/lspkind-nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-trouble = {
|
||||||
|
url = "github:folke/trouble.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-nvim-treesitter-context = {
|
||||||
|
url = "github:nvim-treesitter/nvim-treesitter-context";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-nvim-lightbulb = {
|
||||||
|
url = "github:kosayoda/nvim-lightbulb";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-nvim-code-action-menu = {
|
||||||
|
url = "github:weilbith/nvim-code-action-menu";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-lsp-signature = {
|
||||||
|
url = "github:ray-x/lsp_signature.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-lsp-lines = {
|
||||||
|
url = "sourcehut:~whynothugo/lsp_lines.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-none-ls = {
|
||||||
|
# https://github.com/nvimtools/none-ls.nvim/issues/58
|
||||||
|
url = "github:nvimtools/none-ls.nvim/bb680d752cec37949faca7a1f509e2fe67ab418a";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-nvim-docs-view = {
|
||||||
|
url = "github:amrbashir/nvim-docs-view";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# language support
|
||||||
|
plugin-sqls-nvim = {
|
||||||
|
url = "github:nanotee/sqls.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-rust-tools = {
|
||||||
|
url = "github:simrat39/rust-tools.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-flutter-tools = {
|
||||||
|
url = "github:akinsho/flutter-tools.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-neodev-nvim = {
|
||||||
|
url = "github:folke/neodev.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-elixir-ls = {
|
||||||
|
url = "github:elixir-lsp/elixir-ls";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-elixir-tools = {
|
||||||
|
url = "github:elixir-tools/elixir-tools.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-glow-nvim = {
|
||||||
|
url = "github:ellisonleao/glow.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-image-nvim = {
|
||||||
|
url = "github:3rd/image.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Copying/Registers
|
||||||
|
plugin-registers = {
|
||||||
|
url = "github:tversteeg/registers.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
plugin-nvim-neoclip = {
|
||||||
|
url = "github:AckslD/nvim-neoclip.lua";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Telescope
|
||||||
|
plugin-telescope = {
|
||||||
|
url = "github:nvim-telescope/telescope.nvim";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
|
||||||
# Debuggers
|
# Debuggers
|
||||||
nvim-dap = {
|
plugin-nvim-dap = {
|
||||||
url = "github:mfussenegger/nvim-dap";
|
url = "github:mfussenegger/nvim-dap";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
nvim-dap-ui = {
|
plugin-nvim-dap-ui = {
|
||||||
url = "github:rcarriga/nvim-dap-ui";
|
url = "github:rcarriga/nvim-dap-ui";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Filetrees
|
# Filetrees
|
||||||
nvim-tree-lua = {
|
plugin-nvim-tree-lua = {
|
||||||
url = "github:nvim-tree/nvim-tree.lua";
|
url = "github:nvim-tree/nvim-tree.lua";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Tablines
|
# Tablines
|
||||||
nvim-bufferline-lua = {
|
plugin-nvim-bufferline-lua = {
|
||||||
url = "github:akinsho/nvim-bufferline.lua";
|
url = "github:akinsho/nvim-bufferline.lua";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Statuslines
|
# Statuslines
|
||||||
lualine = {
|
plugin-lualine = {
|
||||||
url = "github:hoob3rt/lualine.nvim";
|
url = "github:hoob3rt/lualine.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
nvim-cmp = {
|
plugin-nvim-cmp = {
|
||||||
url = "github:hrsh7th/nvim-cmp";
|
url = "github:hrsh7th/nvim-cmp";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
cmp-buffer = {
|
|
||||||
|
plugin-cmp-buffer = {
|
||||||
url = "github:hrsh7th/cmp-buffer";
|
url = "github:hrsh7th/cmp-buffer";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
cmp-nvim-lsp = {
|
|
||||||
|
plugin-cmp-nvim-lsp = {
|
||||||
url = "github:hrsh7th/cmp-nvim-lsp";
|
url = "github:hrsh7th/cmp-nvim-lsp";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
cmp-vsnip = {
|
|
||||||
|
plugin-cmp-vsnip = {
|
||||||
url = "github:hrsh7th/cmp-vsnip";
|
url = "github:hrsh7th/cmp-vsnip";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
cmp-path = {
|
|
||||||
|
plugin-cmp-path = {
|
||||||
url = "github:hrsh7th/cmp-path";
|
url = "github:hrsh7th/cmp-path";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
cmp-treesitter = {
|
|
||||||
|
plugin-cmp-treesitter = {
|
||||||
url = "github:ray-x/cmp-treesitter";
|
url = "github:ray-x/cmp-treesitter";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# snippets
|
# snippets
|
||||||
vim-vsnip = {
|
plugin-vim-vsnip = {
|
||||||
url = "github:hrsh7th/vim-vsnip";
|
url = "github:hrsh7th/vim-vsnip";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Presence
|
# Presence
|
||||||
neocord = {
|
plugin-neocord = {
|
||||||
url = "github:IogaMaster/neocord";
|
url = "github:IogaMaster/neocord";
|
||||||
flake = false; # uses flake-utils, avoid the flake
|
flake = false; # uses flake-utils, avoid the flake
|
||||||
};
|
};
|
||||||
|
|
||||||
# Autopairs
|
# Autopairs
|
||||||
nvim-autopairs = {
|
plugin-nvim-autopairs = {
|
||||||
url = "github:windwp/nvim-autopairs";
|
url = "github:windwp/nvim-autopairs";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
nvim-ts-autotag = {
|
|
||||||
|
plugin-nvim-ts-autotag = {
|
||||||
url = "github:windwp/nvim-ts-autotag";
|
url = "github:windwp/nvim-ts-autotag";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Commenting
|
# Commenting
|
||||||
kommentary = {
|
plugin-comment-nvim = {
|
||||||
url = "github:b3nj5m1n/kommentary";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
comment-nvim = {
|
|
||||||
url = "github:numToStr/Comment.nvim";
|
url = "github:numToStr/Comment.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
todo-comments = {
|
plugin-todo-comments = {
|
||||||
url = "github:folke/todo-comments.nvim";
|
url = "github:folke/todo-comments.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Buffer tools
|
# Buffer tools
|
||||||
bufdelete-nvim = {
|
plugin-bufdelete-nvim = {
|
||||||
url = "github:famiu/bufdelete.nvim";
|
url = "github:famiu/bufdelete.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Dashboard Utilities
|
# Dashboard Utilities
|
||||||
dashboard-nvim = {
|
plugin-dashboard-nvim = {
|
||||||
url = "github:glepnir/dashboard-nvim";
|
url = "github:glepnir/dashboard-nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
alpha-nvim = {
|
plugin-alpha-nvim = {
|
||||||
url = "github:goolord/alpha-nvim";
|
url = "github:goolord/alpha-nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim-startify = {
|
plugin-vim-startify = {
|
||||||
url = "github:mhinz/vim-startify";
|
url = "github:mhinz/vim-startify";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Themes
|
# Themes
|
||||||
tokyonight = {
|
plugin-tokyonight = {
|
||||||
url = "github:folke/tokyonight.nvim";
|
url = "github:folke/tokyonight.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
onedark = {
|
plugin-onedark = {
|
||||||
url = "github:navarasu/onedark.nvim";
|
url = "github:navarasu/onedark.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
catppuccin = {
|
plugin-catppuccin = {
|
||||||
url = "github:catppuccin/nvim";
|
url = "github:catppuccin/nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
dracula = {
|
plugin-dracula = {
|
||||||
url = "github:Mofiqul/dracula.nvim";
|
url = "github:Mofiqul/dracula.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
oxocarbon = {
|
plugin-oxocarbon = {
|
||||||
url = "github:glyh/oxocarbon.nvim/lualine-support";
|
url = "github:glyh/oxocarbon.nvim/lualine-support";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
gruvbox = {
|
plugin-gruvbox = {
|
||||||
url = "github:ellisonleao/gruvbox.nvim";
|
url = "github:ellisonleao/gruvbox.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
rose-pine = {
|
plugin-rose-pine = {
|
||||||
url = "github:rose-pine/neovim";
|
url = "github:rose-pine/neovim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Rust crates
|
# Rust crates
|
||||||
crates-nvim = {
|
plugin-crates-nvim = {
|
||||||
url = "github:Saecki/crates.nvim";
|
url = "github:Saecki/crates.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Project Management
|
# Project Management
|
||||||
project-nvim = {
|
plugin-project-nvim = {
|
||||||
url = "github:ahmedkhalf/project.nvim";
|
url = "github:ahmedkhalf/project.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Visuals
|
# Visuals
|
||||||
nvim-cursorline = {
|
plugin-nvim-cursorline = {
|
||||||
url = "github:yamatsum/nvim-cursorline";
|
url = "github:yamatsum/nvim-cursorline";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
scrollbar-nvim = {
|
plugin-scrollbar-nvim = {
|
||||||
url = "github:petertriho/nvim-scrollbar";
|
url = "github:petertriho/nvim-scrollbar";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
cinnamon-nvim = {
|
plugin-cinnamon-nvim = {
|
||||||
url = "github:declancm/cinnamon.nvim";
|
url = "github:declancm/cinnamon.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
cellular-automaton = {
|
plugin-cellular-automaton = {
|
||||||
url = "github:Eandrju/cellular-automaton.nvim";
|
url = "github:Eandrju/cellular-automaton.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
indent-blankline = {
|
plugin-indent-blankline = {
|
||||||
url = "github:lukas-reineke/indent-blankline.nvim";
|
url = "github:lukas-reineke/indent-blankline.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
nvim-web-devicons = {
|
|
||||||
|
plugin-nvim-web-devicons = {
|
||||||
url = "github:nvim-tree/nvim-web-devicons";
|
url = "github:nvim-tree/nvim-web-devicons";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
gitsigns-nvim = {
|
|
||||||
|
plugin-gitsigns-nvim = {
|
||||||
url = "github:lewis6991/gitsigns.nvim";
|
url = "github:lewis6991/gitsigns.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
fidget-nvim = {
|
plugin-fidget-nvim = {
|
||||||
url = "github:j-hui/fidget.nvim";
|
url = "github:j-hui/fidget.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
highlight-undo = {
|
plugin-highlight-undo = {
|
||||||
url = "github:tzachar/highlight-undo.nvim";
|
url = "github:tzachar/highlight-undo.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Minimap
|
# Minimap
|
||||||
minimap-vim = {
|
plugin-minimap-vim = {
|
||||||
url = "github:wfxr/minimap.vim";
|
url = "github:wfxr/minimap.vim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
codewindow-nvim = {
|
plugin-codewindow-nvim = {
|
||||||
url = "github:gorbit99/codewindow.nvim";
|
url = "github:gorbit99/codewindow.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Notifications
|
# Notifications
|
||||||
nvim-notify = {
|
plugin-nvim-notify = {
|
||||||
url = "github:rcarriga/nvim-notify";
|
url = "github:rcarriga/nvim-notify";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Utilities
|
# Utilities
|
||||||
ccc = {
|
plugin-ccc = {
|
||||||
url = "github:uga-rosa/ccc.nvim";
|
url = "github:uga-rosa/ccc.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
diffview-nvim = {
|
plugin-diffview-nvim = {
|
||||||
url = "github:sindrets/diffview.nvim";
|
url = "github:sindrets/diffview.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
icon-picker-nvim = {
|
plugin-icon-picker-nvim = {
|
||||||
url = "github:ziontee113/icon-picker.nvim";
|
url = "github:ziontee113/icon-picker.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
which-key = {
|
plugin-which-key = {
|
||||||
url = "github:folke/which-key.nvim";
|
url = "github:folke/which-key.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
cheatsheet-nvim = {
|
plugin-cheatsheet-nvim = {
|
||||||
url = "github:sudormrfbin/cheatsheet.nvim";
|
url = "github:sudormrfbin/cheatsheet.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
gesture-nvim = {
|
plugin-gesture-nvim = {
|
||||||
url = "github:notomo/gesture.nvim";
|
url = "github:notomo/gesture.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
hop-nvim = {
|
plugin-hop-nvim = {
|
||||||
url = "github:phaazon/hop.nvim";
|
url = "github:phaazon/hop.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
leap-nvim = {
|
plugin-leap-nvim = {
|
||||||
url = "github:ggandor/leap.nvim";
|
url = "github:ggandor/leap.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
smartcolumn = {
|
plugin-smartcolumn = {
|
||||||
url = "github:m4xshen/smartcolumn.nvim";
|
url = "github:m4xshen/smartcolumn.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
nvim-surround = {
|
plugin-nvim-surround = {
|
||||||
url = "github:kylechui/nvim-surround";
|
url = "github:kylechui/nvim-surround";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Note-taking
|
# Note-taking
|
||||||
obsidian-nvim = {
|
plugin-obsidian-nvim = {
|
||||||
url = "github:epwalsh/obsidian.nvim";
|
url = "github:epwalsh/obsidian.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
orgmode-nvim = {
|
plugin-orgmode-nvim = {
|
||||||
url = "github:nvim-orgmode/orgmode";
|
url = "github:nvim-orgmode/orgmode";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
mind-nvim = {
|
plugin-mind-nvim = {
|
||||||
url = "github:phaazon/mind.nvim";
|
url = "github:phaazon/mind.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Spellchecking
|
# Spellchecking
|
||||||
vim-dirtytalk = {
|
plugin-vim-dirtytalk = {
|
||||||
url = "github:psliwka/vim-dirtytalk";
|
url = "github:psliwka/vim-dirtytalk";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Terminal
|
# Terminal
|
||||||
toggleterm-nvim = {
|
plugin-toggleterm-nvim = {
|
||||||
url = "github:akinsho/toggleterm.nvim";
|
url = "github:akinsho/toggleterm.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# UI
|
# UI
|
||||||
nvim-navbuddy = {
|
plugin-nvim-navbuddy = {
|
||||||
url = "github:SmiteshP/nvim-navbuddy";
|
url = "github:SmiteshP/nvim-navbuddy";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
nvim-navic = {
|
plugin-nvim-navic = {
|
||||||
url = "github:SmiteshP/nvim-navic";
|
url = "github:SmiteshP/nvim-navic";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
noice-nvim = {
|
plugin-noice-nvim = {
|
||||||
url = "github:folke/noice.nvim";
|
url = "github:folke/noice.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
modes-nvim = {
|
plugin-modes-nvim = {
|
||||||
url = "github:mvllow/modes.nvim";
|
url = "github:mvllow/modes.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
nvim-colorizer-lua = {
|
plugin-nvim-colorizer-lua = {
|
||||||
url = "github:NvChad/nvim-colorizer.lua";
|
url = "github:NvChad/nvim-colorizer.lua";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim-illuminate = {
|
plugin-vim-illuminate = {
|
||||||
url = "github:RRethy/vim-illuminate";
|
url = "github:RRethy/vim-illuminate";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Assistant
|
# Assistant
|
||||||
copilot-lua = {
|
plugin-copilot-lua = {
|
||||||
url = "github:zbirenbaum/copilot.lua";
|
url = "github:zbirenbaum/copilot.lua";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
copilot-cmp = {
|
plugin-copilot-cmp = {
|
||||||
url = "github:zbirenbaum/copilot-cmp";
|
url = "github:zbirenbaum/copilot-cmp";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Session management
|
# Session management
|
||||||
nvim-session-manager = {
|
plugin-nvim-session-manager = {
|
||||||
url = "github:Shatur/neovim-session-manager";
|
url = "github:Shatur/neovim-session-manager";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
plenary-nvim = {
|
plugin-plenary-nvim = {
|
||||||
# (required by crates-nvim)
|
# (required by crates-nvim)
|
||||||
url = "github:nvim-lua/plenary.nvim";
|
url = "github:nvim-lua/plenary.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
dressing-nvim = {
|
plugin-dressing-nvim = {
|
||||||
# (required by icon-picker-nvim)
|
# (required by icon-picker-nvim)
|
||||||
url = "github:stevearc/dressing.nvim";
|
url = "github:stevearc/dressing.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim-markdown = {
|
plugin-vim-markdown = {
|
||||||
# (required by obsidian-nvim)
|
# (required by obsidian-nvim)
|
||||||
url = "github:preservim/vim-markdown";
|
url = "github:preservim/vim-markdown";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
tabular = {
|
plugin-tabular = {
|
||||||
# (required by vim-markdown)
|
# (required by vim-markdown)
|
||||||
url = "github:godlygeek/tabular";
|
url = "github:godlygeek/tabular";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
nui-nvim = {
|
plugin-nui-nvim = {
|
||||||
# (required by noice.nvim)
|
# (required by noice.nvim)
|
||||||
url = "github:MunifTanjim/nui.nvim";
|
url = "github:MunifTanjim/nui.nvim";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
vim-repeat = {
|
plugin-vim-repeat = {
|
||||||
|
# (required by leap.nvim)
|
||||||
url = "github:tpope/vim-repeat";
|
url = "github:tpope/vim-repeat";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
nvim-nio = {
|
plugin-nvim-nio = {
|
||||||
# (required nvim-dap-ui)
|
# (required nvim-dap-ui)
|
||||||
url = "github:nvim-neotest/nvim-nio";
|
url = "github:nvim-neotest/nvim-nio";
|
||||||
flake = false;
|
flake = false;
|
||||||
|
|
|
@ -1,15 +1,19 @@
|
||||||
# Home Manager module
|
# Home Manager module
|
||||||
packages: inputs: {
|
packages: inputs: {
|
||||||
pkgs,
|
|
||||||
config,
|
config,
|
||||||
|
pkgs,
|
||||||
lib ? pkgs.lib,
|
lib ? pkgs.lib,
|
||||||
self,
|
|
||||||
...
|
...
|
||||||
}:
|
}: let
|
||||||
with lib; let
|
inherit (lib) maintainers;
|
||||||
|
inherit (lib.modules) mkIf;
|
||||||
|
inherit (lib.options) mkOption mkEnableOption literalExpression;
|
||||||
|
inherit (lib.types) attrsOf anything package;
|
||||||
|
|
||||||
cfg = config.programs.neovim-flake;
|
cfg = config.programs.neovim-flake;
|
||||||
inherit (import ../../configuration.nix inputs) neovimConfiguration;
|
inherit (import ../../configuration.nix inputs) neovimConfiguration;
|
||||||
set = neovimConfiguration {
|
|
||||||
|
builtPackage = neovimConfiguration {
|
||||||
inherit pkgs;
|
inherit pkgs;
|
||||||
modules = [cfg.settings];
|
modules = [cfg.settings];
|
||||||
};
|
};
|
||||||
|
@ -17,11 +21,21 @@ in {
|
||||||
meta.maintainers = with maintainers; [NotAShelf];
|
meta.maintainers = with maintainers; [NotAShelf];
|
||||||
|
|
||||||
options.programs.neovim-flake = {
|
options.programs.neovim-flake = {
|
||||||
enable = mkEnableOption "A NeoVim IDE with a focus on configurability and extensibility.";
|
enable = mkEnableOption "neovim-flake, the extensible neovim-wrapper";
|
||||||
|
|
||||||
|
builtPackage = mkOption {
|
||||||
|
type = package;
|
||||||
|
default = builtPackage;
|
||||||
|
internal = true;
|
||||||
|
description = ''
|
||||||
|
The built neovim-flake package, wrapped with the user's configuration.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
settings = mkOption {
|
settings = mkOption {
|
||||||
type = types.attrsOf types.anything;
|
type = attrsOf anything;
|
||||||
default = {};
|
default = {};
|
||||||
|
description = "Attribute set of neovim-flake preferences.";
|
||||||
example = literalExpression ''
|
example = literalExpression ''
|
||||||
{
|
{
|
||||||
vim.viAlias = false;
|
vim.viAlias = false;
|
||||||
|
@ -39,11 +53,10 @@ in {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
description = "Attribute set of neoflake preferences.";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
home.packages = [set.neovim];
|
home.packages = [builtPackage];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
62
flake/modules/nixos.nix
Normal file
62
flake/modules/nixos.nix
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
# Home Manager module
|
||||||
|
packages: inputs: {
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib ? pkgs.lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) maintainers;
|
||||||
|
inherit (lib.modules) mkIf;
|
||||||
|
inherit (lib.options) mkOption mkEnableOption literalExpression;
|
||||||
|
inherit (lib.types) attrsOf package anything;
|
||||||
|
|
||||||
|
cfg = config.programs.neovim-flake;
|
||||||
|
inherit (import ../../configuration.nix inputs) neovimConfiguration;
|
||||||
|
|
||||||
|
builtPackage = neovimConfiguration {
|
||||||
|
inherit pkgs;
|
||||||
|
modules = [cfg.settings];
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
meta.maintainers = with maintainers; [NotAShelf];
|
||||||
|
|
||||||
|
options.programs.neovim-flake = {
|
||||||
|
enable = mkEnableOption "neovim-flake, the extensible neovim-wrapper";
|
||||||
|
|
||||||
|
builtPackage = mkOption {
|
||||||
|
type = package;
|
||||||
|
default = builtPackage;
|
||||||
|
internal = true;
|
||||||
|
description = ''
|
||||||
|
The built neovim-flake package, wrapped with the user's configuration.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
type = attrsOf anything;
|
||||||
|
default = {};
|
||||||
|
description = "Attribute set of neovim-flake preferences.";
|
||||||
|
example = literalExpression ''
|
||||||
|
{
|
||||||
|
vim.viAlias = false;
|
||||||
|
vim.vimAlias = true;
|
||||||
|
vim.lsp = {
|
||||||
|
enable = true;
|
||||||
|
formatOnSave = true;
|
||||||
|
lightbulb.enable = true;
|
||||||
|
lspsaga.enable = false;
|
||||||
|
nvimCodeActionMenu.enable = true;
|
||||||
|
trouble.enable = true;
|
||||||
|
lspSignature.enable = true;
|
||||||
|
rust.enable = false;
|
||||||
|
nix = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
environment.systemPackages = [builtPackage];
|
||||||
|
};
|
||||||
|
}
|
|
@ -5,10 +5,7 @@
|
||||||
pkgs,
|
pkgs,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
docs = import ../docs {
|
docs = import ../docs {inherit pkgs inputs;};
|
||||||
inherit pkgs;
|
|
||||||
nmdSrc = inputs.nmd;
|
|
||||||
};
|
|
||||||
in {
|
in {
|
||||||
packages =
|
packages =
|
||||||
{
|
{
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
mkSetLuaBinding = binding: action:
|
mkSetLuaBinding = binding: action:
|
||||||
mkLuaBinding binding.value action binding.description;
|
mkLuaBinding binding.value action binding.description;
|
||||||
|
|
||||||
pushDownDefault = attr: mapAttrs (_name: value: mkDefault value) attr;
|
pushDownDefault = attr: mapAttrs (_: value: mkDefault value) attr;
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
binds
|
binds
|
||||||
|
|
11
lib/config.nix
Normal file
11
lib/config.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{lib}: let
|
||||||
|
inherit (lib.options) mkOption;
|
||||||
|
inherit (lib.types) bool;
|
||||||
|
in {
|
||||||
|
mkBool = value: description:
|
||||||
|
mkOption {
|
||||||
|
type = bool;
|
||||||
|
default = value;
|
||||||
|
inherit description;
|
||||||
|
};
|
||||||
|
}
|
10
lib/dag.nix
10
lib/dag.nix
|
@ -107,4 +107,14 @@ in {
|
||||||
|
|
||||||
entryAfter = entryBetween [];
|
entryAfter = entryBetween [];
|
||||||
entryBefore = before: entryBetween before [];
|
entryBefore = before: entryBetween before [];
|
||||||
|
|
||||||
|
mkLuarcSection = section: ''
|
||||||
|
-- SECTION: ${section.name}
|
||||||
|
${section.data}
|
||||||
|
'';
|
||||||
|
|
||||||
|
mkVimrcSection = section: ''
|
||||||
|
" SECTION: ${section.name}
|
||||||
|
${section.data}
|
||||||
|
'';
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
{lib}: {
|
{
|
||||||
types = import ./types {inherit lib;};
|
inputs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
types = import ./types {inherit inputs lib;};
|
||||||
|
|
||||||
|
config = import ./config.nix {inherit lib;};
|
||||||
binds = import ./binds.nix {inherit lib;};
|
binds = import ./binds.nix {inherit lib;};
|
||||||
dag = import ./dag.nix {inherit lib;};
|
dag = import ./dag.nix {inherit lib;};
|
||||||
languages = import ./languages.nix {inherit lib;};
|
languages = import ./languages.nix {inherit lib;};
|
||||||
|
|
|
@ -1,75 +1,21 @@
|
||||||
# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/stdlib-extended.nix
|
# Convenience function that returns the given Nixpkgs standard library
|
||||||
# Just a convenience function that returns the given Nixpkgs standard
|
# extended with our functions using `lib.extend`.
|
||||||
# library extended with the HM library.
|
nixpkgsLib: inputs:
|
||||||
nixpkgsLib: let
|
nixpkgsLib.extend (self: super: {
|
||||||
mkNvimLib = import ./.;
|
# WARNING: New functions should not be added here, but to files
|
||||||
in
|
# imported by `./default.nix` under their own categories. If your
|
||||||
nixpkgsLib.extend (self: super: rec {
|
# function does not fit to any of the existing categories, create
|
||||||
nvim = mkNvimLib {lib = self;};
|
# a new file and import it in `./default.nix.`
|
||||||
|
|
||||||
mkLuaBinding = key: action: desc:
|
# Makes our custom functions available under `lib.nvim` where stdlib-extended.nix is imported
|
||||||
self.mkIf (key != null) {
|
# with the appropriate arguments. For end-users, a `lib` output will be accessible from the flake.
|
||||||
"${key}" = {
|
# E.g. for an input called `neovim-flake`, `inputs.neovim-flake.lib.nvim` will return the set
|
||||||
inherit action desc;
|
# below.
|
||||||
lua = true;
|
nvim = import ./. {
|
||||||
silent = true;
|
inherit inputs;
|
||||||
};
|
lib = self;
|
||||||
};
|
};
|
||||||
|
|
||||||
mkExprBinding = key: action: desc:
|
# For forward compatibility.
|
||||||
self.mkIf (key != null) {
|
literalExpression = super.literalExpression or super.literalExample;
|
||||||
"${key}" = {
|
})
|
||||||
inherit action desc;
|
|
||||||
lua = true;
|
|
||||||
silent = true;
|
|
||||||
expr = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mkBinding = key: action: desc:
|
|
||||||
self.mkIf (key != null) {
|
|
||||||
"${key}" = {
|
|
||||||
inherit action desc;
|
|
||||||
silent = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mkMappingOption = description: default:
|
|
||||||
self.mkOption {
|
|
||||||
type = self.types.nullOr self.types.str;
|
|
||||||
inherit default description;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Utility function that takes two attrsets:
|
|
||||||
# { someKey = "some_value" } and
|
|
||||||
# { someKey = { description = "Some Description"; }; }
|
|
||||||
# and merges them into
|
|
||||||
# { someKey = { value = "some_value"; description = "Some Description"; }; }
|
|
||||||
addDescriptionsToMappings = actualMappings: mappingDefinitions:
|
|
||||||
self.attrsets.mapAttrs (name: value: let
|
|
||||||
isNested = self.isAttrs value;
|
|
||||||
returnedValue =
|
|
||||||
if isNested
|
|
||||||
then addDescriptionsToMappings actualMappings."${name}" mappingDefinitions."${name}"
|
|
||||||
else {
|
|
||||||
value = value;
|
|
||||||
description = mappingDefinitions."${name}".description;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
returnedValue)
|
|
||||||
actualMappings;
|
|
||||||
|
|
||||||
mkSetBinding = binding: action:
|
|
||||||
mkBinding binding.value action binding.description;
|
|
||||||
|
|
||||||
mkSetExprBinding = binding: action:
|
|
||||||
mkExprBinding binding.value action binding.description;
|
|
||||||
|
|
||||||
mkSetLuaBinding = binding: action:
|
|
||||||
mkLuaBinding binding.value action binding.description;
|
|
||||||
|
|
||||||
pushDownDefault = attr: self.mapAttrs (name: value: self.mkDefault value) attr;
|
|
||||||
|
|
||||||
# For forward compatibility.
|
|
||||||
literalExpression = super.literalExpression or super.literalExample;
|
|
||||||
})
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/types-dag.nix
|
# From home-manager: https://github.com/nix-community/home-manager/blob/master/modules/lib/types-dag.nix
|
||||||
# Used for ordering config text.
|
# Used for ordering configuration text.
|
||||||
{lib}: let
|
{lib}: let
|
||||||
inherit
|
inherit
|
||||||
(lib)
|
(lib)
|
||||||
|
@ -59,8 +59,8 @@ in rec {
|
||||||
name = "dagOf";
|
name = "dagOf";
|
||||||
description = "DAG of ${elemType.description}";
|
description = "DAG of ${elemType.description}";
|
||||||
inherit (attrEquivalent) check merge emptyValue;
|
inherit (attrEquivalent) check merge emptyValue;
|
||||||
|
inherit (elemType) getSubModules;
|
||||||
getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["<name>"]);
|
getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["<name>"]);
|
||||||
getSubModules = elemType.getSubModules;
|
|
||||||
substSubModules = m: dagOf (elemType.substSubModules m);
|
substSubModules = m: dagOf (elemType.substSubModules m);
|
||||||
functor = (defaultFunctor name) // {wrapped = elemType;};
|
functor = (defaultFunctor name) // {wrapped = elemType;};
|
||||||
nestedTypes.elemType = elemType;
|
nestedTypes.elemType = elemType;
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
{lib}: let
|
{
|
||||||
|
inputs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
typesDag = import ./dag.nix {inherit lib;};
|
typesDag = import ./dag.nix {inherit lib;};
|
||||||
typesPlugin = import ./plugins.nix {inherit lib;};
|
typesPlugin = import ./plugins.nix {inherit inputs lib;};
|
||||||
typesLanguage = import ./languages.nix {inherit lib;};
|
typesLanguage = import ./languages.nix {inherit lib;};
|
||||||
in {
|
in {
|
||||||
inherit (typesDag) dagOf;
|
inherit (typesDag) dagOf;
|
||||||
|
|
|
@ -1,139 +1,58 @@
|
||||||
{lib}:
|
{
|
||||||
with lib; let
|
inputs,
|
||||||
# Plugin must be same as input name from flake.nix
|
lib,
|
||||||
availablePlugins = [
|
...
|
||||||
# TODO: sort by category
|
}: let
|
||||||
"nvim-treesitter-context"
|
inherit (lib.options) mkOption;
|
||||||
"gitsigns-nvim"
|
inherit (lib.attrsets) attrNames mapAttrs' filterAttrs nameValuePair;
|
||||||
"plenary-nvim"
|
inherit (lib.strings) hasPrefix removePrefix isString;
|
||||||
"nvim-lspconfig"
|
inherit (lib.types) submodule either package enum str lines attrsOf anything listOf nullOr;
|
||||||
"nvim-treesitter"
|
|
||||||
"lspsaga"
|
# Get the names of all flake inputs that start with the given prefix.
|
||||||
"lspkind"
|
fromInputs = {
|
||||||
"nvim-lightbulb"
|
inputs,
|
||||||
"lsp-signature"
|
prefix,
|
||||||
"nvim-tree-lua"
|
}:
|
||||||
"nvim-bufferline-lua"
|
mapAttrs' (n: v: nameValuePair (removePrefix prefix n) {src = v;}) (filterAttrs (n: _: hasPrefix prefix n) inputs);
|
||||||
"lualine"
|
|
||||||
"nvim-autopairs"
|
# Get the names of all flake inputs that start with the given prefix.
|
||||||
"nvim-ts-autotag"
|
pluginInputNames = attrNames (fromInputs {
|
||||||
"nvim-web-devicons"
|
inherit inputs;
|
||||||
"tokyonight"
|
prefix = "plugin-";
|
||||||
"bufdelete-nvim"
|
});
|
||||||
"nvim-cmp"
|
|
||||||
"cmp-nvim-lsp"
|
|
||||||
"cmp-buffer"
|
|
||||||
"cmp-vsnip"
|
|
||||||
"cmp-path"
|
|
||||||
"cmp-treesitter"
|
|
||||||
"crates-nvim"
|
|
||||||
"vim-vsnip"
|
|
||||||
"nvim-code-action-menu"
|
|
||||||
"trouble"
|
|
||||||
"none-ls"
|
|
||||||
"which-key"
|
|
||||||
"indent-blankline"
|
|
||||||
"nvim-cursorline"
|
|
||||||
"sqls-nvim"
|
|
||||||
"glow-nvim"
|
|
||||||
"telescope"
|
|
||||||
"rust-tools"
|
|
||||||
"onedark"
|
|
||||||
"catppuccin"
|
|
||||||
"dracula"
|
|
||||||
"oxocarbon"
|
|
||||||
"gruvbox"
|
|
||||||
"rose-pine"
|
|
||||||
"minimap-vim"
|
|
||||||
"dashboard-nvim"
|
|
||||||
"alpha-nvim"
|
|
||||||
"scrollbar-nvim"
|
|
||||||
"codewindow-nvim"
|
|
||||||
"nvim-notify"
|
|
||||||
"cinnamon-nvim"
|
|
||||||
"cheatsheet-nvim"
|
|
||||||
"ccc"
|
|
||||||
"cellular-automaton"
|
|
||||||
"neocord"
|
|
||||||
"icon-picker-nvim"
|
|
||||||
"dressing-nvim"
|
|
||||||
"orgmode-nvim"
|
|
||||||
"obsidian-nvim"
|
|
||||||
"vim-markdown"
|
|
||||||
"tabular"
|
|
||||||
"toggleterm-nvim"
|
|
||||||
"noice-nvim"
|
|
||||||
"nui-nvim"
|
|
||||||
"copilot-lua"
|
|
||||||
"tabnine-nvim"
|
|
||||||
"nvim-session-manager"
|
|
||||||
"gesture-nvim"
|
|
||||||
"comment-nvim"
|
|
||||||
"kommentary"
|
|
||||||
"mind-nvim"
|
|
||||||
"fidget-nvim"
|
|
||||||
"diffview-nvim"
|
|
||||||
"todo-comments"
|
|
||||||
"flutter-tools"
|
|
||||||
"flutter-tools-patched"
|
|
||||||
"hop-nvim"
|
|
||||||
"leap-nvim"
|
|
||||||
"modes-nvim"
|
|
||||||
"vim-repeat"
|
|
||||||
"smartcolumn"
|
|
||||||
"project-nvim"
|
|
||||||
"neodev-nvim"
|
|
||||||
"elixir-ls"
|
|
||||||
"elixir-tools"
|
|
||||||
"nvim-colorizer-lua"
|
|
||||||
"vim-illuminate"
|
|
||||||
"nvim-surround"
|
|
||||||
"nvim-dap"
|
|
||||||
"nvim-dap-ui"
|
|
||||||
"nvim-navic"
|
|
||||||
"nvim-navbuddy"
|
|
||||||
"copilot-cmp"
|
|
||||||
"lsp-lines"
|
|
||||||
"vim-dirtytalk"
|
|
||||||
"highlight-undo"
|
|
||||||
"nvim-docs-view"
|
|
||||||
"image-nvim"
|
|
||||||
"nvim-nio"
|
|
||||||
];
|
|
||||||
# You can either use the name of the plugin or a package.
|
# You can either use the name of the plugin or a package.
|
||||||
pluginType = with types;
|
pluginType = nullOr (
|
||||||
nullOr (
|
either
|
||||||
either
|
package
|
||||||
package
|
(enum (pluginInputNames ++ ["nvim-treesitter" "flutter-tools-patched" "vim-repeat"]))
|
||||||
(enum availablePlugins)
|
);
|
||||||
);
|
|
||||||
|
|
||||||
pluginsType = types.listOf pluginType;
|
pluginsType = listOf pluginType;
|
||||||
|
|
||||||
extraPluginType = with types;
|
extraPluginType = submodule {
|
||||||
submodule {
|
options = {
|
||||||
options = {
|
package = mkOption {
|
||||||
package = mkOption {
|
type = pluginType;
|
||||||
type = pluginType;
|
description = "Plugin Package.";
|
||||||
description = "Plugin Package.";
|
};
|
||||||
};
|
|
||||||
|
|
||||||
after = mkOption {
|
after = mkOption {
|
||||||
type = listOf str;
|
type = listOf str;
|
||||||
default = [];
|
default = [];
|
||||||
description = "Setup this plugin after the following ones.";
|
description = "Setup this plugin after the following ones.";
|
||||||
};
|
};
|
||||||
|
|
||||||
setup = mkOption {
|
setup = mkOption {
|
||||||
type = lines;
|
type = lines;
|
||||||
default = "";
|
default = "";
|
||||||
description = "Lua code to run during setup.";
|
description = "Lua code to run during setup.";
|
||||||
example = "require('aerial').setup {}";
|
example = "require('aerial').setup {}";
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
in {
|
in {
|
||||||
inherit extraPluginType;
|
inherit extraPluginType fromInputs;
|
||||||
|
|
||||||
pluginsOpt = {
|
pluginsOpt = {
|
||||||
description,
|
description,
|
||||||
|
@ -156,23 +75,25 @@ in {
|
||||||
lib.mergeOneOption val defs;
|
lib.mergeOneOption val defs;
|
||||||
};
|
};
|
||||||
|
|
||||||
# opts is a attrset of options, example:
|
/*
|
||||||
# ```
|
opts is a attrset of options, example:
|
||||||
# mkPluginSetupOption "telescope" {
|
```
|
||||||
# file_ignore_patterns = mkOption {
|
mkPluginSetupOption "telescope" {
|
||||||
# description = "...";
|
file_ignore_patterns = mkOption {
|
||||||
# type = types.listOf types.str;
|
description = "...";
|
||||||
# default = [];
|
type = types.listOf types.str;
|
||||||
# };
|
default = [];
|
||||||
# layout_config.horizontal = mkOption {...};
|
};
|
||||||
# }
|
layout_config.horizontal = mkOption {...};
|
||||||
# ```
|
}
|
||||||
|
```
|
||||||
|
*/
|
||||||
mkPluginSetupOption = pluginName: opts:
|
mkPluginSetupOption = pluginName: opts:
|
||||||
mkOption {
|
mkOption {
|
||||||
description = "Option table to pass into the setup function of " + pluginName;
|
description = "Option table to pass into the setup function of " + pluginName;
|
||||||
default = {};
|
default = {};
|
||||||
type = types.submodule {
|
type = submodule {
|
||||||
freeformType = with types; attrsOf anything;
|
freeformType = attrsOf anything;
|
||||||
options = opts;
|
options = opts;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,188 +0,0 @@
|
||||||
{
|
|
||||||
lib,
|
|
||||||
config,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
inherit (builtins) concatStringsSep;
|
|
||||||
inherit (lib.modules) mkIf;
|
|
||||||
inherit (lib.lists) optionals;
|
|
||||||
inherit (lib.strings) optionalString;
|
|
||||||
inherit (lib.nvim.dag) entryAfter;
|
|
||||||
|
|
||||||
cfg = config.vim;
|
|
||||||
in {
|
|
||||||
config = {
|
|
||||||
vim.startPlugins = ["plenary-nvim"] ++ optionals (cfg.spellChecking.enableProgrammingWordList) ["vim-dirtytalk"];
|
|
||||||
|
|
||||||
vim.maps.normal =
|
|
||||||
mkIf cfg.disableArrows {
|
|
||||||
"<up>" = {
|
|
||||||
action = "<nop>";
|
|
||||||
|
|
||||||
noremap = false;
|
|
||||||
};
|
|
||||||
"<down>" = {
|
|
||||||
action = "<nop>";
|
|
||||||
|
|
||||||
noremap = false;
|
|
||||||
};
|
|
||||||
"<left>" = {
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
};
|
|
||||||
"<right>" = {
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
// mkIf cfg.mapLeaderSpace {
|
|
||||||
"<space>" = {
|
|
||||||
action = "<nop>";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
vim.maps.insert = mkIf cfg.disableArrows {
|
|
||||||
"<up>" = {
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
};
|
|
||||||
"<down>" = {
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
};
|
|
||||||
"<left>" = {
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
};
|
|
||||||
"<right>" = {
|
|
||||||
action = "<nop>";
|
|
||||||
noremap = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
vim.configRC.basic = entryAfter ["globalsScript"] ''
|
|
||||||
" Settings that are set for everything
|
|
||||||
set encoding=utf-8
|
|
||||||
set mouse=${cfg.mouseSupport}
|
|
||||||
set tabstop=${toString cfg.tabWidth}
|
|
||||||
set shiftwidth=${toString cfg.tabWidth}
|
|
||||||
set softtabstop=${toString cfg.tabWidth}
|
|
||||||
set expandtab
|
|
||||||
set cmdheight=${toString cfg.cmdHeight}
|
|
||||||
set updatetime=${toString cfg.updateTime}
|
|
||||||
set shortmess+=c
|
|
||||||
set tm=${toString cfg.mapTimeout}
|
|
||||||
set hidden
|
|
||||||
set cursorlineopt=${toString cfg.cursorlineOpt}
|
|
||||||
set scrolloff=${toString cfg.scrollOffset}
|
|
||||||
|
|
||||||
${optionalString cfg.debugMode.enable ''
|
|
||||||
" Debug mode settings
|
|
||||||
set verbose=${toString cfg.debugMode.level}
|
|
||||||
set verbosefile=${cfg.debugMode.logFile}
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.splitBelow ''
|
|
||||||
set splitbelow
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.splitRight ''
|
|
||||||
set splitright
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.showSignColumn ''
|
|
||||||
set signcolumn=yes
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.autoIndent ''
|
|
||||||
set autoindent
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.preventJunkFiles ''
|
|
||||||
set noswapfile
|
|
||||||
set nobackup
|
|
||||||
set nowritebackup
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.bell == "none") ''
|
|
||||||
set noerrorbells
|
|
||||||
set novisualbell
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.bell == "on") ''
|
|
||||||
set novisualbell
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.bell == "visual") ''
|
|
||||||
set noerrorbells
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.lineNumberMode == "relative") ''
|
|
||||||
set relativenumber
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.lineNumberMode == "number") ''
|
|
||||||
set number
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.lineNumberMode == "relNumber") ''
|
|
||||||
set number relativenumber
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.useSystemClipboard ''
|
|
||||||
set clipboard+=unnamedplus
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.mapLeaderSpace ''
|
|
||||||
let mapleader=" "
|
|
||||||
let maplocalleader=" "
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.syntaxHighlighting ''
|
|
||||||
syntax on
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (!cfg.wordWrap) ''
|
|
||||||
set nowrap
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.hideSearchHighlight ''
|
|
||||||
set nohlsearch
|
|
||||||
set incsearch
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.colourTerm ''
|
|
||||||
set termguicolors
|
|
||||||
set t_Co=256
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (!cfg.enableEditorconfig) ''
|
|
||||||
let g:editorconfig = v:false
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString cfg.spellChecking.enable ''
|
|
||||||
set spell
|
|
||||||
set spelllang=${concatStringsSep "," cfg.spellChecking.languages}${optionalString cfg.spellChecking.enableProgrammingWordList ",programming"}
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.leaderKey != null) ''
|
|
||||||
let mapleader = "${toString cfg.leaderKey}"
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.searchCase == "ignore") ''
|
|
||||||
set nosmartcase
|
|
||||||
set ignorecase
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.searchCase == "smart") ''
|
|
||||||
set smartcase
|
|
||||||
set ignorecase
|
|
||||||
''}
|
|
||||||
|
|
||||||
${optionalString (cfg.searchCase == "sensitive") ''
|
|
||||||
set nosmartcase
|
|
||||||
set noignorecase
|
|
||||||
''}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
304
modules/core/build/config.nix
Normal file
304
modules/core/build/config.nix
Normal file
|
@ -0,0 +1,304 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (builtins) map mapAttrs toJSON filter;
|
||||||
|
inherit (lib.options) mkOption;
|
||||||
|
inherit (lib.attrsets) filterAttrs getAttrs attrValues attrNames;
|
||||||
|
inherit (lib.strings) optionalString isString concatStringsSep;
|
||||||
|
inherit (lib.misc) mapAttrsFlatten;
|
||||||
|
inherit (lib.trivial) showWarnings;
|
||||||
|
inherit (lib.types) bool str oneOf attrsOf nullOr attrs submodule lines;
|
||||||
|
inherit (lib.nvim.types) dagOf;
|
||||||
|
inherit (lib.generators) mkLuaInline;
|
||||||
|
inherit (lib.nvim.dag) entryAnywhere entryAfter topoSort mkLuarcSection mkVimrcSection;
|
||||||
|
inherit (lib.nvim.lua) toLuaObject;
|
||||||
|
inherit (lib.nvim.vim) valToVim;
|
||||||
|
inherit (lib.nvim.config) mkBool;
|
||||||
|
|
||||||
|
cfg = config.vim;
|
||||||
|
|
||||||
|
wrapLuaConfig = luaConfig: ''
|
||||||
|
lua << EOF
|
||||||
|
${optionalString cfg.enableLuaLoader "vim.loader.enable()"}
|
||||||
|
${luaConfig}
|
||||||
|
EOF
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Most of the keybindings code is highly inspired by pta2002/nixvim.
|
||||||
|
# Thank you!
|
||||||
|
mapConfigOptions = {
|
||||||
|
silent =
|
||||||
|
mkBool false
|
||||||
|
"Whether this mapping should be silent. Equivalent to adding <silent> to a map.";
|
||||||
|
|
||||||
|
nowait =
|
||||||
|
mkBool false
|
||||||
|
"Whether to wait for extra input on ambiguous mappings. Equivalent to adding <nowait> to a map.";
|
||||||
|
|
||||||
|
script =
|
||||||
|
mkBool false
|
||||||
|
"Equivalent to adding <script> to a map.";
|
||||||
|
|
||||||
|
expr =
|
||||||
|
mkBool false
|
||||||
|
"Means that the action is actually an expression. Equivalent to adding <expr> to a map.";
|
||||||
|
|
||||||
|
unique =
|
||||||
|
mkBool false
|
||||||
|
"Whether to fail if the map is already defined. Equivalent to adding <unique> to a map.";
|
||||||
|
|
||||||
|
noremap =
|
||||||
|
mkBool true
|
||||||
|
"Whether to use the 'noremap' variant of the command, ignoring any custom mappings on the defined action. It is highly advised to keep this on, which is the default.";
|
||||||
|
|
||||||
|
desc = mkOption {
|
||||||
|
type = nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = "A description of this keybind, to be shown in which-key, if you have it enabled.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
genMaps = mode: maps: let
|
||||||
|
/*
|
||||||
|
Take a user-defined action (string or attrs) and return the following attribute set:
|
||||||
|
{
|
||||||
|
action = (string) the actual action to map to this key
|
||||||
|
config = (attrs) the configuration options for this mapping (noremap, silent...)
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
normalizeAction = action: let
|
||||||
|
# Extract the values of the config options that have been explicitly set by the user
|
||||||
|
config =
|
||||||
|
filterAttrs (_: v: v != null)
|
||||||
|
(getAttrs (attrNames mapConfigOptions) action);
|
||||||
|
in {
|
||||||
|
config =
|
||||||
|
if config == {}
|
||||||
|
then {"__empty" = null;}
|
||||||
|
else config;
|
||||||
|
action =
|
||||||
|
if action.lua
|
||||||
|
then mkLuaInline action.action
|
||||||
|
else action.action;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
attrValues (mapAttrs
|
||||||
|
(key: action: let
|
||||||
|
normalizedAction = normalizeAction action;
|
||||||
|
in {
|
||||||
|
inherit (normalizedAction) action config;
|
||||||
|
inherit key;
|
||||||
|
inherit mode;
|
||||||
|
})
|
||||||
|
maps);
|
||||||
|
|
||||||
|
mapOption = submodule {
|
||||||
|
options =
|
||||||
|
mapConfigOptions
|
||||||
|
// {
|
||||||
|
action = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "The action to execute.";
|
||||||
|
};
|
||||||
|
|
||||||
|
lua = mkOption {
|
||||||
|
type = bool;
|
||||||
|
description = ''
|
||||||
|
If true, `action` is considered to be lua code.
|
||||||
|
Thus, it will not be wrapped in `""`.
|
||||||
|
'';
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mapOptions = mode:
|
||||||
|
mkOption {
|
||||||
|
description = "Mappings for ${mode} mode";
|
||||||
|
type = attrsOf mapOption;
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options = {
|
||||||
|
vim = {
|
||||||
|
configRC = mkOption {
|
||||||
|
description = "vimrc contents";
|
||||||
|
type = oneOf [(dagOf lines) str];
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
luaConfigRC = mkOption {
|
||||||
|
description = "vim lua config";
|
||||||
|
type = oneOf [(dagOf lines) str];
|
||||||
|
default = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
builtConfigRC = mkOption {
|
||||||
|
internal = true;
|
||||||
|
type = lines;
|
||||||
|
description = "The built config for neovim after resolving the DAG";
|
||||||
|
};
|
||||||
|
|
||||||
|
globals = mkOption {
|
||||||
|
default = {};
|
||||||
|
description = "Set containing global variable values";
|
||||||
|
type = attrs;
|
||||||
|
};
|
||||||
|
|
||||||
|
maps = mkOption {
|
||||||
|
type = submodule {
|
||||||
|
options = {
|
||||||
|
normal = mapOptions "normal";
|
||||||
|
insert = mapOptions "insert";
|
||||||
|
select = mapOptions "select";
|
||||||
|
visual = mapOptions "visual and select";
|
||||||
|
terminal = mapOptions "terminal";
|
||||||
|
normalVisualOp = mapOptions "normal, visual, select and operator-pending (same as plain 'map')";
|
||||||
|
|
||||||
|
visualOnly = mapOptions "visual only";
|
||||||
|
operator = mapOptions "operator-pending";
|
||||||
|
insertCommand = mapOptions "insert and command-line";
|
||||||
|
lang = mapOptions "insert, command-line and lang-arg";
|
||||||
|
command = mapOptions "command-line";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
default = {};
|
||||||
|
description = ''
|
||||||
|
Custom keybindings for any mode.
|
||||||
|
|
||||||
|
For plain maps (e.g. just 'map' or 'remap') use maps.normalVisualOp.
|
||||||
|
'';
|
||||||
|
|
||||||
|
example = ''
|
||||||
|
maps = {
|
||||||
|
normal."<leader>m" = {
|
||||||
|
silent = true;
|
||||||
|
action = "<cmd>make<CR>";
|
||||||
|
}; # Same as nnoremap <leader>m <silent> <cmd>make<CR>
|
||||||
|
};
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
enableLuaLoader = lib.options.mkEnableOption ''
|
||||||
|
experimental Lua module loader to speed up the start up process
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = let
|
||||||
|
filterNonNull = mappings: filterAttrs (_name: value: value != null) mappings;
|
||||||
|
globalsScript =
|
||||||
|
mapAttrsFlatten (name: value: "let g:${name}=${valToVim value}")
|
||||||
|
(filterNonNull cfg.globals);
|
||||||
|
|
||||||
|
toLuaBindings = mode: maps:
|
||||||
|
map (value: ''
|
||||||
|
vim.keymap.set(${toLuaObject mode}, ${toLuaObject value.key}, ${toLuaObject value.action}, ${toLuaObject value.config})
|
||||||
|
'') (genMaps mode maps);
|
||||||
|
|
||||||
|
# I'm not sure if every one of these will work.
|
||||||
|
allmap = toLuaBindings "" config.vim.maps.normalVisualOp;
|
||||||
|
nmap = toLuaBindings "n" config.vim.maps.normal;
|
||||||
|
vmap = toLuaBindings "v" config.vim.maps.visual;
|
||||||
|
xmap = toLuaBindings "x" config.vim.maps.visualOnly;
|
||||||
|
smap = toLuaBindings "s" config.vim.maps.select;
|
||||||
|
imap = toLuaBindings "i" config.vim.maps.insert;
|
||||||
|
cmap = toLuaBindings "c" config.vim.maps.command;
|
||||||
|
tmap = toLuaBindings "t" config.vim.maps.terminal;
|
||||||
|
lmap = toLuaBindings "l" config.vim.maps.lang;
|
||||||
|
omap = toLuaBindings "o" config.vim.maps.operator;
|
||||||
|
icmap = toLuaBindings "ic" config.vim.maps.insertCommand;
|
||||||
|
|
||||||
|
resolveDag = {
|
||||||
|
name,
|
||||||
|
dag,
|
||||||
|
mapResult,
|
||||||
|
}: let
|
||||||
|
# When the value is a string, default it to dag.entryAnywhere
|
||||||
|
finalDag = mapAttrs (_: value:
|
||||||
|
if isString value
|
||||||
|
then entryAnywhere value
|
||||||
|
else value)
|
||||||
|
dag;
|
||||||
|
sortedDag = topoSort finalDag;
|
||||||
|
result =
|
||||||
|
if sortedDag ? result
|
||||||
|
then mapResult sortedDag.result
|
||||||
|
else abort ("Dependency cycle in ${name}: " + toJSON sortedDag);
|
||||||
|
in
|
||||||
|
result;
|
||||||
|
in {
|
||||||
|
vim = {
|
||||||
|
startPlugins = map (x: x.package) (attrValues cfg.extraPlugins);
|
||||||
|
configRC = {
|
||||||
|
globalsScript = entryAnywhere (concatStringsSep "\n" globalsScript);
|
||||||
|
|
||||||
|
luaScript = let
|
||||||
|
mapResult = result: (wrapLuaConfig (concatStringsSep "\n" (map mkLuarcSection result)));
|
||||||
|
luaConfig = resolveDag {
|
||||||
|
name = "lua config script";
|
||||||
|
dag = cfg.luaConfigRC;
|
||||||
|
inherit mapResult;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
entryAfter ["globalsScript"] luaConfig;
|
||||||
|
|
||||||
|
extraPluginConfigs = let
|
||||||
|
mapResult = r: (wrapLuaConfig (concatStringsSep "\n" (map mkLuarcSection r)));
|
||||||
|
extraPluginsDag = mapAttrs (_: {
|
||||||
|
after,
|
||||||
|
setup,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
entryAfter after setup)
|
||||||
|
cfg.extraPlugins;
|
||||||
|
pluginConfig = resolveDag {
|
||||||
|
name = "extra plugins config";
|
||||||
|
dag = extraPluginsDag;
|
||||||
|
inherit mapResult;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
entryAfter ["luaScript"] pluginConfig;
|
||||||
|
|
||||||
|
# This is probably not the right way to set the config. I'm not sure how it should look like.
|
||||||
|
mappings = let
|
||||||
|
maps = [
|
||||||
|
nmap
|
||||||
|
imap
|
||||||
|
vmap
|
||||||
|
xmap
|
||||||
|
smap
|
||||||
|
cmap
|
||||||
|
omap
|
||||||
|
tmap
|
||||||
|
lmap
|
||||||
|
icmap
|
||||||
|
allmap
|
||||||
|
];
|
||||||
|
mapConfig = wrapLuaConfig (concatStringsSep "\n" (map (v: concatStringsSep "\n" v) maps));
|
||||||
|
in
|
||||||
|
entryAfter ["globalsScript"] mapConfig;
|
||||||
|
};
|
||||||
|
|
||||||
|
builtConfigRC = let
|
||||||
|
# Catch assertions and warnings
|
||||||
|
# and throw for each failed assertion. If no assertions are found, show warnings.
|
||||||
|
failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions);
|
||||||
|
baseSystemAssertWarn =
|
||||||
|
if failedAssertions != []
|
||||||
|
then throw "\nFailed assertions:\n${concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"
|
||||||
|
else showWarnings config.warnings;
|
||||||
|
|
||||||
|
mapResult = result: (concatStringsSep "\n" (map mkVimrcSection result));
|
||||||
|
vimConfig = resolveDag {
|
||||||
|
name = "vim config script";
|
||||||
|
dag = cfg.configRC;
|
||||||
|
inherit mapResult;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
baseSystemAssertWarn vimConfig;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
_: {
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./config.nix
|
./config.nix
|
||||||
./module.nix
|
./options.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
87
modules/core/build/options.nix
Normal file
87
modules/core/build/options.nix
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.options) mkEnableOption mkOption literalExpression;
|
||||||
|
inherit (lib.types) path int package bool str listOf attrsOf;
|
||||||
|
inherit (lib.nvim.types) pluginsOpt extraPluginType;
|
||||||
|
in {
|
||||||
|
options.vim = {
|
||||||
|
package = mkOption {
|
||||||
|
type = package;
|
||||||
|
default = pkgs.neovim-unwrapped;
|
||||||
|
description = ''
|
||||||
|
The neovim package to use.
|
||||||
|
|
||||||
|
You will need to use an unwrapped package for this option to work as intended.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
debugMode = {
|
||||||
|
enable = mkEnableOption "debug mode";
|
||||||
|
level = mkOption {
|
||||||
|
type = int;
|
||||||
|
default = 20;
|
||||||
|
description = "Set the debug level";
|
||||||
|
};
|
||||||
|
|
||||||
|
logFile = mkOption {
|
||||||
|
type = path;
|
||||||
|
default = "/tmp/nvim.log";
|
||||||
|
description = "Set the log file";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
viAlias = mkOption {
|
||||||
|
description = "Enable vi alias";
|
||||||
|
type = bool;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
vimAlias = mkOption {
|
||||||
|
description = "Enable vim alias";
|
||||||
|
type = bool;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
startPlugins = pluginsOpt {
|
||||||
|
default = [];
|
||||||
|
description = "List of plugins to startup.";
|
||||||
|
};
|
||||||
|
|
||||||
|
optPlugins = pluginsOpt {
|
||||||
|
default = [];
|
||||||
|
description = "List of plugins to optionally load";
|
||||||
|
};
|
||||||
|
|
||||||
|
extraPlugins = mkOption {
|
||||||
|
type = attrsOf extraPluginType;
|
||||||
|
default = {};
|
||||||
|
description = ''
|
||||||
|
List of plugins and related config.
|
||||||
|
Note that these are setup after builtin plugins.
|
||||||
|
'';
|
||||||
|
example = literalExpression ''
|
||||||
|
with pkgs.vimPlugins; {
|
||||||
|
aerial = {
|
||||||
|
package = aerial-nvim;
|
||||||
|
setup = "require('aerial').setup {}";
|
||||||
|
};
|
||||||
|
harpoon = {
|
||||||
|
package = harpoon;
|
||||||
|
setup = "require('harpoon').setup {}";
|
||||||
|
after = ["aerial"];
|
||||||
|
};
|
||||||
|
}'';
|
||||||
|
};
|
||||||
|
|
||||||
|
luaPackages = mkOption {
|
||||||
|
type = listOf str;
|
||||||
|
default = [];
|
||||||
|
description = ''
|
||||||
|
List of lua packages to install.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,394 +1,6 @@
|
||||||
{
|
{
|
||||||
config,
|
imports = [
|
||||||
lib,
|
./build
|
||||||
...
|
./warnings
|
||||||
}: let
|
];
|
||||||
inherit (builtins) attrValues attrNames map mapAttrs toJSON isString concatStringsSep filter;
|
|
||||||
inherit (lib.options) mkOption literalExpression mdDoc;
|
|
||||||
inherit (lib.attrsets) filterAttrs getAttrs;
|
|
||||||
inherit (lib.strings) optionalString;
|
|
||||||
inherit (lib.misc) mapAttrsFlatten;
|
|
||||||
inherit (lib.trivial) showWarnings;
|
|
||||||
inherit (lib.types) bool str listOf oneOf attrsOf nullOr attrs submodule unspecified lines;
|
|
||||||
inherit (lib.nvim.types) dagOf pluginsOpt extraPluginType;
|
|
||||||
inherit (lib.nvim.dag) entryAnywhere entryAfter topoSort;
|
|
||||||
inherit (lib.generators) mkLuaInline;
|
|
||||||
inherit (lib.nvim.lua) toLuaObject;
|
|
||||||
inherit (lib.nvim.vim) valToVim;
|
|
||||||
|
|
||||||
cfg = config.vim;
|
|
||||||
|
|
||||||
wrapLuaConfig = luaConfig: ''
|
|
||||||
lua << EOF
|
|
||||||
${optionalString cfg.enableLuaLoader ''
|
|
||||||
vim.loader.enable()
|
|
||||||
''}
|
|
||||||
${luaConfig}
|
|
||||||
EOF
|
|
||||||
'';
|
|
||||||
|
|
||||||
mkBool = value: description:
|
|
||||||
mkOption {
|
|
||||||
type = bool;
|
|
||||||
default = value;
|
|
||||||
inherit description;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Most of the keybindings code is highly inspired by pta2002/nixvim. Thank you!
|
|
||||||
mapConfigOptions = {
|
|
||||||
silent =
|
|
||||||
mkBool false
|
|
||||||
"Whether this mapping should be silent. Equivalent to adding <silent> to a map.";
|
|
||||||
|
|
||||||
nowait =
|
|
||||||
mkBool false
|
|
||||||
"Whether to wait for extra input on ambiguous mappings. Equivalent to adding <nowait> to a map.";
|
|
||||||
|
|
||||||
script =
|
|
||||||
mkBool false
|
|
||||||
"Equivalent to adding <script> to a map.";
|
|
||||||
|
|
||||||
expr =
|
|
||||||
mkBool false
|
|
||||||
"Means that the action is actually an expression. Equivalent to adding <expr> to a map.";
|
|
||||||
|
|
||||||
unique =
|
|
||||||
mkBool false
|
|
||||||
"Whether to fail if the map is already defined. Equivalent to adding <unique> to a map.";
|
|
||||||
|
|
||||||
noremap =
|
|
||||||
mkBool true
|
|
||||||
"Whether to use the 'noremap' variant of the command, ignoring any custom mappings on the defined action. It is highly advised to keep this on, which is the default.";
|
|
||||||
|
|
||||||
desc = mkOption {
|
|
||||||
type = nullOr str;
|
|
||||||
default = null;
|
|
||||||
description = "A description of this keybind, to be shown in which-key, if you have it enabled.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
genMaps = mode: maps: let
|
|
||||||
/*
|
|
||||||
Take a user-defined action (string or attrs) and return the following attribute set:
|
|
||||||
{
|
|
||||||
action = (string) the actual action to map to this key
|
|
||||||
config = (attrs) the configuration options for this mapping (noremap, silent...)
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
normalizeAction = action: let
|
|
||||||
# Extract the values of the config options that have been explicitly set by the user
|
|
||||||
config =
|
|
||||||
filterAttrs (_: v: v != null)
|
|
||||||
(getAttrs (attrNames mapConfigOptions) action);
|
|
||||||
in {
|
|
||||||
config =
|
|
||||||
if config == {}
|
|
||||||
then {"__empty" = null;}
|
|
||||||
else config;
|
|
||||||
action =
|
|
||||||
if action.lua
|
|
||||||
then mkLuaInline action.action
|
|
||||||
else action.action;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
attrValues (mapAttrs
|
|
||||||
(key: action: let
|
|
||||||
normalizedAction = normalizeAction action;
|
|
||||||
in {
|
|
||||||
inherit (normalizedAction) action config;
|
|
||||||
inherit key;
|
|
||||||
inherit mode;
|
|
||||||
})
|
|
||||||
maps);
|
|
||||||
|
|
||||||
mapOption = submodule {
|
|
||||||
options =
|
|
||||||
mapConfigOptions
|
|
||||||
// {
|
|
||||||
action = mkOption {
|
|
||||||
type = str;
|
|
||||||
description = "The action to execute.";
|
|
||||||
};
|
|
||||||
|
|
||||||
lua = mkOption {
|
|
||||||
type = bool;
|
|
||||||
description = ''
|
|
||||||
If true, `action` is considered to be lua code.
|
|
||||||
Thus, it will not be wrapped in `""`.
|
|
||||||
'';
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mapOptions = mode:
|
|
||||||
mkOption {
|
|
||||||
description = "Mappings for ${mode} mode";
|
|
||||||
type = attrsOf mapOption;
|
|
||||||
default = {};
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
options = {
|
|
||||||
assertions = mkOption {
|
|
||||||
type = listOf unspecified;
|
|
||||||
internal = true;
|
|
||||||
default = [];
|
|
||||||
example = literalExpression ''
|
|
||||||
[
|
|
||||||
{
|
|
||||||
assertion = false;
|
|
||||||
message = "you can't enable this for that reason";
|
|
||||||
}
|
|
||||||
]
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
warnings = mkOption {
|
|
||||||
internal = true;
|
|
||||||
default = [];
|
|
||||||
type = listOf str;
|
|
||||||
example = ["The `foo' service is deprecated and will go away soon!"];
|
|
||||||
description = mdDoc ''
|
|
||||||
This option allows modules to show warnings to users during
|
|
||||||
the evaluation of the system configuration.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
vim = {
|
|
||||||
viAlias = mkOption {
|
|
||||||
description = "Enable vi alias";
|
|
||||||
type = bool;
|
|
||||||
default = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
vimAlias = mkOption {
|
|
||||||
description = "Enable vim alias";
|
|
||||||
type = bool;
|
|
||||||
default = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
configRC = mkOption {
|
|
||||||
description = "vimrc contents";
|
|
||||||
type = oneOf [(dagOf lines) str];
|
|
||||||
default = {};
|
|
||||||
};
|
|
||||||
|
|
||||||
luaConfigRC = mkOption {
|
|
||||||
description = "vim lua config";
|
|
||||||
type = oneOf [(dagOf lines) str];
|
|
||||||
default = {};
|
|
||||||
};
|
|
||||||
|
|
||||||
builtConfigRC = mkOption {
|
|
||||||
internal = true;
|
|
||||||
type = lines;
|
|
||||||
description = "The built config for neovim after resolving the DAG";
|
|
||||||
};
|
|
||||||
|
|
||||||
startPlugins = pluginsOpt {
|
|
||||||
default = [];
|
|
||||||
description = "List of plugins to startup.";
|
|
||||||
};
|
|
||||||
|
|
||||||
optPlugins = pluginsOpt {
|
|
||||||
default = [];
|
|
||||||
description = "List of plugins to optionally load";
|
|
||||||
};
|
|
||||||
|
|
||||||
extraPlugins = mkOption {
|
|
||||||
type = attrsOf extraPluginType;
|
|
||||||
default = {};
|
|
||||||
description = ''
|
|
||||||
List of plugins and related config.
|
|
||||||
Note that these are setup after builtin plugins.
|
|
||||||
'';
|
|
||||||
example = literalExpression ''
|
|
||||||
with pkgs.vimPlugins; {
|
|
||||||
aerial = {
|
|
||||||
package = aerial-nvim;
|
|
||||||
setup = "require('aerial').setup {}";
|
|
||||||
};
|
|
||||||
harpoon = {
|
|
||||||
package = harpoon;
|
|
||||||
setup = "require('harpoon').setup {}";
|
|
||||||
after = ["aerial"];
|
|
||||||
};
|
|
||||||
}'';
|
|
||||||
};
|
|
||||||
|
|
||||||
luaPackages = mkOption {
|
|
||||||
type = listOf str;
|
|
||||||
default = [];
|
|
||||||
description = ''
|
|
||||||
List of lua packages to install.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
globals = mkOption {
|
|
||||||
default = {};
|
|
||||||
description = "Set containing global variable values";
|
|
||||||
type = attrs;
|
|
||||||
};
|
|
||||||
|
|
||||||
maps = mkOption {
|
|
||||||
type = submodule {
|
|
||||||
options = {
|
|
||||||
normal = mapOptions "normal";
|
|
||||||
insert = mapOptions "insert";
|
|
||||||
select = mapOptions "select";
|
|
||||||
visual = mapOptions "visual and select";
|
|
||||||
terminal = mapOptions "terminal";
|
|
||||||
normalVisualOp = mapOptions "normal, visual, select and operator-pending (same as plain 'map')";
|
|
||||||
|
|
||||||
visualOnly = mapOptions "visual only";
|
|
||||||
operator = mapOptions "operator-pending";
|
|
||||||
insertCommand = mapOptions "insert and command-line";
|
|
||||||
lang = mapOptions "insert, command-line and lang-arg";
|
|
||||||
command = mapOptions "command-line";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = {};
|
|
||||||
description = ''
|
|
||||||
Custom keybindings for any mode.
|
|
||||||
|
|
||||||
For plain maps (e.g. just 'map' or 'remap') use maps.normalVisualOp.
|
|
||||||
'';
|
|
||||||
|
|
||||||
example = ''
|
|
||||||
maps = {
|
|
||||||
normal."<leader>m" = {
|
|
||||||
silent = true;
|
|
||||||
action = "<cmd>make<CR>";
|
|
||||||
}; # Same as nnoremap <leader>m <silent> <cmd>make<CR>
|
|
||||||
};
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = let
|
|
||||||
filterNonNull = mappings: filterAttrs (_name: value: value != null) mappings;
|
|
||||||
globalsScript =
|
|
||||||
mapAttrsFlatten (name: value: "let g:${name}=${valToVim value}")
|
|
||||||
(filterNonNull cfg.globals);
|
|
||||||
|
|
||||||
toLuaBindings = mode: maps:
|
|
||||||
map (value: ''
|
|
||||||
vim.keymap.set(${toLuaObject mode}, ${toLuaObject value.key}, ${toLuaObject value.action}, ${toLuaObject value.config})
|
|
||||||
'') (genMaps mode maps);
|
|
||||||
|
|
||||||
# I'm not sure if every one of these will work.
|
|
||||||
allmap = toLuaBindings "" config.vim.maps.normalVisualOp;
|
|
||||||
nmap = toLuaBindings "n" config.vim.maps.normal;
|
|
||||||
vmap = toLuaBindings "v" config.vim.maps.visual;
|
|
||||||
xmap = toLuaBindings "x" config.vim.maps.visualOnly;
|
|
||||||
smap = toLuaBindings "s" config.vim.maps.select;
|
|
||||||
imap = toLuaBindings "i" config.vim.maps.insert;
|
|
||||||
cmap = toLuaBindings "c" config.vim.maps.command;
|
|
||||||
tmap = toLuaBindings "t" config.vim.maps.terminal;
|
|
||||||
lmap = toLuaBindings "l" config.vim.maps.lang;
|
|
||||||
omap = toLuaBindings "o" config.vim.maps.operator;
|
|
||||||
icmap = toLuaBindings "ic" config.vim.maps.insertCommand;
|
|
||||||
|
|
||||||
resolveDag = {
|
|
||||||
name,
|
|
||||||
dag,
|
|
||||||
mapResult,
|
|
||||||
}: let
|
|
||||||
# When the value is a string, default it to dag.entryAnywhere
|
|
||||||
finalDag = mapAttrs (_: value:
|
|
||||||
if isString value
|
|
||||||
then entryAnywhere value
|
|
||||||
else value)
|
|
||||||
dag;
|
|
||||||
sortedDag = topoSort finalDag;
|
|
||||||
result =
|
|
||||||
if sortedDag ? result
|
|
||||||
then mapResult sortedDag.result
|
|
||||||
else abort ("Dependency cycle in ${name}: " + toJSON sortedDag);
|
|
||||||
in
|
|
||||||
result;
|
|
||||||
in {
|
|
||||||
vim = {
|
|
||||||
startPlugins = map (x: x.package) (attrValues cfg.extraPlugins);
|
|
||||||
configRC = {
|
|
||||||
globalsScript = entryAnywhere (concatStringsSep "\n" globalsScript);
|
|
||||||
|
|
||||||
luaScript = let
|
|
||||||
mkSection = r: ''
|
|
||||||
-- SECTION: ${r.name}
|
|
||||||
${r.data}
|
|
||||||
'';
|
|
||||||
mapResult = r: (wrapLuaConfig (concatStringsSep "\n" (map mkSection r)));
|
|
||||||
luaConfig = resolveDag {
|
|
||||||
name = "lua config script";
|
|
||||||
dag = cfg.luaConfigRC;
|
|
||||||
inherit mapResult;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
entryAfter ["globalsScript"] luaConfig;
|
|
||||||
|
|
||||||
extraPluginConfigs = let
|
|
||||||
mkSection = r: ''
|
|
||||||
-- SECTION: ${r.name}
|
|
||||||
${r.data}
|
|
||||||
'';
|
|
||||||
mapResult = r: (wrapLuaConfig (concatStringsSep "\n" (map mkSection r)));
|
|
||||||
extraPluginsDag = mapAttrs (_: {
|
|
||||||
after,
|
|
||||||
setup,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
entryAfter after setup)
|
|
||||||
cfg.extraPlugins;
|
|
||||||
pluginConfig = resolveDag {
|
|
||||||
name = "extra plugins config";
|
|
||||||
dag = extraPluginsDag;
|
|
||||||
inherit mapResult;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
entryAfter ["luaScript"] pluginConfig;
|
|
||||||
|
|
||||||
# This is probably not the right way to set the config. I'm not sure how it should look like.
|
|
||||||
mappings = let
|
|
||||||
maps = [
|
|
||||||
nmap
|
|
||||||
imap
|
|
||||||
vmap
|
|
||||||
xmap
|
|
||||||
smap
|
|
||||||
cmap
|
|
||||||
omap
|
|
||||||
tmap
|
|
||||||
lmap
|
|
||||||
icmap
|
|
||||||
allmap
|
|
||||||
];
|
|
||||||
mapConfig = wrapLuaConfig (concatStringsSep "\n" (map (v: concatStringsSep "\n" v) maps));
|
|
||||||
in
|
|
||||||
entryAfter ["globalsScript"] mapConfig;
|
|
||||||
};
|
|
||||||
|
|
||||||
builtConfigRC = let
|
|
||||||
failedAssertions = map (x: x.message) (filter (x: !x.assertion) config.assertions);
|
|
||||||
|
|
||||||
baseSystemAssertWarn =
|
|
||||||
if failedAssertions != []
|
|
||||||
then throw "\nFailed assertions:\n${concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"
|
|
||||||
else showWarnings config.warnings;
|
|
||||||
|
|
||||||
mkSection = r: ''
|
|
||||||
" SECTION: ${r.name}
|
|
||||||
${r.data}
|
|
||||||
'';
|
|
||||||
mapResult = r: (concatStringsSep "\n" (map mkSection r));
|
|
||||||
vimConfig = resolveDag {
|
|
||||||
name = "vim config script";
|
|
||||||
dag = cfg.configRC;
|
|
||||||
inherit mapResult;
|
|
||||||
};
|
|
||||||
in
|
|
||||||
baseSystemAssertWarn vimConfig;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
31
modules/core/warnings/default.nix
Normal file
31
modules/core/warnings/default.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{lib, ...}: let
|
||||||
|
inherit (lib.options) mkOption literalExpression;
|
||||||
|
inherit (lib.types) listOf str unspecified;
|
||||||
|
in {
|
||||||
|
options = {
|
||||||
|
assertions = mkOption {
|
||||||
|
type = listOf unspecified;
|
||||||
|
internal = true;
|
||||||
|
default = [];
|
||||||
|
example = literalExpression ''
|
||||||
|
[
|
||||||
|
{
|
||||||
|
assertion = false;
|
||||||
|
message = "you can't enable this for that reason";
|
||||||
|
}
|
||||||
|
]
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
warnings = mkOption {
|
||||||
|
internal = true;
|
||||||
|
default = [];
|
||||||
|
type = listOf str;
|
||||||
|
example = ["The `foo' service is deprecated and will go away soon!"];
|
||||||
|
description = ''
|
||||||
|
This option allows modules to show warnings to users during
|
||||||
|
the evaluation of the system configuration.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -9,8 +9,10 @@ inputs: {
|
||||||
inherit (pkgs) wrapNeovimUnstable vimPlugins;
|
inherit (pkgs) wrapNeovimUnstable vimPlugins;
|
||||||
inherit (pkgs.vimUtils) buildVimPlugin;
|
inherit (pkgs.vimUtils) buildVimPlugin;
|
||||||
inherit (pkgs.neovimUtils) makeNeovimConfig;
|
inherit (pkgs.neovimUtils) makeNeovimConfig;
|
||||||
|
inherit (lib.attrsets) recursiveUpdate;
|
||||||
|
inherit (lib.asserts) assertMsg;
|
||||||
|
|
||||||
extendedLib = import ../lib/stdlib-extended.nix lib;
|
extendedLib = import ../lib/stdlib-extended.nix lib inputs;
|
||||||
|
|
||||||
nvimModules = import ./modules.nix {
|
nvimModules = import ./modules.nix {
|
||||||
inherit check pkgs;
|
inherit check pkgs;
|
||||||
|
@ -19,7 +21,7 @@ inputs: {
|
||||||
|
|
||||||
module = extendedLib.evalModules {
|
module = extendedLib.evalModules {
|
||||||
modules = [configuration] ++ nvimModules;
|
modules = [configuration] ++ nvimModules;
|
||||||
specialArgs = {modulesPath = toString ./.;} // extraSpecialArgs;
|
specialArgs = recursiveUpdate {modulesPath = toString ./.;} extraSpecialArgs;
|
||||||
};
|
};
|
||||||
|
|
||||||
vimOptions = module.config.vim;
|
vimOptions = module.config.vim;
|
||||||
|
@ -27,11 +29,11 @@ inputs: {
|
||||||
extraLuaPackages = ps: map (x: ps.${x}) vimOptions.luaPackages;
|
extraLuaPackages = ps: map (x: ps.${x}) vimOptions.luaPackages;
|
||||||
|
|
||||||
buildPlug = {pname, ...} @ args:
|
buildPlug = {pname, ...} @ args:
|
||||||
assert lib.asserts.assertMsg (pname != "nvim-treesitter") "Use buildTreesitterPlug for building nvim-treesitter.";
|
assert assertMsg (pname != "nvim-treesitter") "Use buildTreesitterPlug for building nvim-treesitter.";
|
||||||
buildVimPlugin (args
|
buildVimPlugin (args
|
||||||
// {
|
// {
|
||||||
version = "master";
|
version = "master";
|
||||||
src = getAttr pname inputs;
|
src = getAttr ("plugin-" + pname) inputs;
|
||||||
});
|
});
|
||||||
|
|
||||||
buildTreesitterPlug = grammars: vimPlugins.nvim-treesitter.withPlugins (_: grammars);
|
buildTreesitterPlug = grammars: vimPlugins.nvim-treesitter.withPlugins (_: grammars);
|
||||||
|
|
|
@ -3,46 +3,60 @@
|
||||||
lib,
|
lib,
|
||||||
check ? true,
|
check ? true,
|
||||||
}: let
|
}: let
|
||||||
modules = [
|
inherit (lib.modules) mkDefault;
|
||||||
./completion
|
inherit (lib.lists) concatLists;
|
||||||
./theme
|
|
||||||
./core
|
core = map (p: ./core + "/${p}") [
|
||||||
./basic
|
"build"
|
||||||
./statusline
|
"warnings"
|
||||||
./tabline
|
|
||||||
./filetree
|
|
||||||
./visuals
|
|
||||||
./lsp
|
|
||||||
./treesitter
|
|
||||||
./autopairs
|
|
||||||
./snippets
|
|
||||||
./git
|
|
||||||
./minimap
|
|
||||||
./dashboard
|
|
||||||
./utility
|
|
||||||
./rich-presence
|
|
||||||
./notes
|
|
||||||
./terminal
|
|
||||||
./ui
|
|
||||||
./assistant
|
|
||||||
./session
|
|
||||||
./comments
|
|
||||||
./projects
|
|
||||||
./languages
|
|
||||||
./debugger
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
neovim = map (p: ./neovim + "/${p}") [
|
||||||
|
"basic"
|
||||||
|
"mappings"
|
||||||
|
];
|
||||||
|
|
||||||
|
plugins = map (p: ./plugins + "/${p}") [
|
||||||
|
"assistant"
|
||||||
|
"autopairs"
|
||||||
|
"comments"
|
||||||
|
"completion"
|
||||||
|
"dashboard"
|
||||||
|
"debugger"
|
||||||
|
"filetree"
|
||||||
|
"git"
|
||||||
|
"languages"
|
||||||
|
"lsp"
|
||||||
|
"minimap"
|
||||||
|
"notes"
|
||||||
|
"projects"
|
||||||
|
"rich-presence"
|
||||||
|
"session"
|
||||||
|
"snippets"
|
||||||
|
"spellcheck"
|
||||||
|
"statusline"
|
||||||
|
"tabline"
|
||||||
|
"terminal"
|
||||||
|
"theme"
|
||||||
|
"treesitter"
|
||||||
|
"ui"
|
||||||
|
"utility"
|
||||||
|
"visuals"
|
||||||
|
];
|
||||||
|
|
||||||
|
allModules = concatLists [core neovim plugins];
|
||||||
|
|
||||||
pkgsModule = {config, ...}: {
|
pkgsModule = {config, ...}: {
|
||||||
config = {
|
config = {
|
||||||
_module = {
|
_module = {
|
||||||
inherit check;
|
inherit check;
|
||||||
args = {
|
args = {
|
||||||
baseModules = modules;
|
baseModules = allModules;
|
||||||
pkgsPath = lib.mkDefault pkgs.path;
|
pkgsPath = mkDefault pkgs.path;
|
||||||
pkgs = lib.mkDefault pkgs;
|
pkgs = mkDefault pkgs;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
modules ++ [pkgsModule]
|
allModules ++ [pkgsModule]
|
||||||
|
|
|
@ -1,54 +1,22 @@
|
||||||
{
|
{
|
||||||
pkgs,
|
config,
|
||||||
lib,
|
lib,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
inherit (lib.options) mkEnableOption mkOption;
|
inherit (lib.options) mkOption literalExpression;
|
||||||
inherit (lib.types) package path str bool int listOf enum nullOr;
|
inherit (lib.strings) optionalString;
|
||||||
|
inherit (lib.types) enum bool str int nullOr;
|
||||||
|
inherit (lib.nvim.dag) entryAfter;
|
||||||
|
|
||||||
|
cfg = config.vim;
|
||||||
in {
|
in {
|
||||||
options.vim = {
|
options.vim = {
|
||||||
package = mkOption {
|
|
||||||
type = package;
|
|
||||||
default = pkgs.neovim-unwrapped;
|
|
||||||
description = ''
|
|
||||||
The neovim package to use. You will need to use an unwrapped package for this option to work as intended.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
debugMode = {
|
|
||||||
enable = mkEnableOption "debug mode";
|
|
||||||
level = mkOption {
|
|
||||||
type = int;
|
|
||||||
default = 20;
|
|
||||||
description = "Set the debug level";
|
|
||||||
};
|
|
||||||
|
|
||||||
logFile = mkOption {
|
|
||||||
type = path;
|
|
||||||
default = "/tmp/nvim.log";
|
|
||||||
description = "Set the log file";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
enableLuaLoader = mkEnableOption "experimental Lua module loader to speed up the start up process";
|
|
||||||
|
|
||||||
leaderKey = mkOption {
|
leaderKey = mkOption {
|
||||||
type = nullOr str;
|
type = nullOr str;
|
||||||
default = null;
|
default = null;
|
||||||
description = "The leader key to be used internally";
|
description = "The leader key to be used internally";
|
||||||
};
|
};
|
||||||
|
|
||||||
spellChecking = {
|
|
||||||
enable = mkEnableOption "neovim's built-in spellchecking";
|
|
||||||
enableProgrammingWordList = mkEnableOption "vim-dirtytalk, a wordlist for programmers, that includes programming words";
|
|
||||||
languages = mkOption {
|
|
||||||
type = listOf str;
|
|
||||||
description = "The languages to be used for spellchecking";
|
|
||||||
default = ["en"];
|
|
||||||
example = ["en" "de"];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
colourTerm = mkOption {
|
colourTerm = mkOption {
|
||||||
type = bool;
|
type = bool;
|
||||||
default = true;
|
default = true;
|
||||||
|
@ -114,16 +82,14 @@ in {
|
||||||
lineNumberMode = mkOption {
|
lineNumberMode = mkOption {
|
||||||
type = enum ["relative" "number" "relNumber" "none"];
|
type = enum ["relative" "number" "relNumber" "none"];
|
||||||
default = "relNumber";
|
default = "relNumber";
|
||||||
description = ''
|
example = literalExpression "none";
|
||||||
How line numbers are displayed. Available options are
|
description = "How line numbers are displayed.";
|
||||||
none, relative, number, relNumber
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
|
|
||||||
preventJunkFiles = mkOption {
|
preventJunkFiles = mkOption {
|
||||||
type = bool;
|
type = bool;
|
||||||
default = false;
|
default = false;
|
||||||
description = "Prevent swapfile, backupfile from being created";
|
description = "Prevent swapfile and backupfile from being created";
|
||||||
};
|
};
|
||||||
|
|
||||||
tabWidth = mkOption {
|
tabWidth = mkOption {
|
||||||
|
@ -197,4 +163,124 @@ in {
|
||||||
description = "Set the case sensitivity of search";
|
description = "Set the case sensitivity of search";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
config.vim.configRC.basic = entryAfter ["globalsScript"] ''
|
||||||
|
" Settings that are set for everything
|
||||||
|
set encoding=utf-8
|
||||||
|
set mouse=${cfg.mouseSupport}
|
||||||
|
set tabstop=${toString cfg.tabWidth}
|
||||||
|
set shiftwidth=${toString cfg.tabWidth}
|
||||||
|
set softtabstop=${toString cfg.tabWidth}
|
||||||
|
set expandtab
|
||||||
|
set cmdheight=${toString cfg.cmdHeight}
|
||||||
|
set updatetime=${toString cfg.updateTime}
|
||||||
|
set shortmess+=c
|
||||||
|
set tm=${toString cfg.mapTimeout}
|
||||||
|
set hidden
|
||||||
|
set cursorlineopt=${toString cfg.cursorlineOpt}
|
||||||
|
set scrolloff=${toString cfg.scrollOffset}
|
||||||
|
|
||||||
|
${optionalString cfg.debugMode.enable ''
|
||||||
|
" Debug mode settings
|
||||||
|
set verbose=${toString cfg.debugMode.level}
|
||||||
|
set verbosefile=${cfg.debugMode.logFile}
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.splitBelow ''
|
||||||
|
set splitbelow
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.splitRight ''
|
||||||
|
set splitright
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.showSignColumn ''
|
||||||
|
set signcolumn=yes
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.autoIndent ''
|
||||||
|
set autoindent
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.preventJunkFiles ''
|
||||||
|
set noswapfile
|
||||||
|
set nobackup
|
||||||
|
set nowritebackup
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.bell == "none") ''
|
||||||
|
set noerrorbells
|
||||||
|
set novisualbell
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.bell == "on") ''
|
||||||
|
set novisualbell
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.bell == "visual") ''
|
||||||
|
set noerrorbells
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.lineNumberMode == "relative") ''
|
||||||
|
set relativenumber
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.lineNumberMode == "number") ''
|
||||||
|
set number
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.lineNumberMode == "relNumber") ''
|
||||||
|
set number relativenumber
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.useSystemClipboard ''
|
||||||
|
set clipboard+=unnamedplus
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.mapLeaderSpace ''
|
||||||
|
let mapleader=" "
|
||||||
|
let maplocalleader=" "
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.syntaxHighlighting ''
|
||||||
|
syntax on
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (!cfg.wordWrap) ''
|
||||||
|
set nowrap
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.hideSearchHighlight ''
|
||||||
|
set nohlsearch
|
||||||
|
set incsearch
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString cfg.colourTerm ''
|
||||||
|
set termguicolors
|
||||||
|
set t_Co=256
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (!cfg.enableEditorconfig) ''
|
||||||
|
let g:editorconfig = v:false
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.leaderKey != null) ''
|
||||||
|
let mapleader = "${toString cfg.leaderKey}"
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.searchCase == "ignore") ''
|
||||||
|
set nosmartcase
|
||||||
|
set ignorecase
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.searchCase == "smart") ''
|
||||||
|
set smartcase
|
||||||
|
set ignorecase
|
||||||
|
''}
|
||||||
|
|
||||||
|
${optionalString (cfg.searchCase == "sensitive") ''
|
||||||
|
set nosmartcase
|
||||||
|
set noignorecase
|
||||||
|
''}
|
||||||
|
'';
|
||||||
}
|
}
|
6
modules/neovim/basic/default.nix
Normal file
6
modules/neovim/basic/default.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./configrc.nix
|
||||||
|
./spellcheck.nix
|
||||||
|
];
|
||||||
|
}
|
34
modules/neovim/basic/spellcheck.nix
Normal file
34
modules/neovim/basic/spellcheck.nix
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.modules) mkIf;
|
||||||
|
inherit (lib.options) mkEnableOption literalExpression mkOption;
|
||||||
|
inherit (lib.strings) concatStringsSep;
|
||||||
|
inherit (lib.lists) optionals;
|
||||||
|
inherit (lib.types) listOf str;
|
||||||
|
inherit (lib.nvim.dag) entryAfter;
|
||||||
|
|
||||||
|
cfg = config.vim.spellChecking;
|
||||||
|
in {
|
||||||
|
options.vim.spellChecking = {
|
||||||
|
enable = mkEnableOption "neovim's built-in spellchecking";
|
||||||
|
languages = mkOption {
|
||||||
|
type = listOf str;
|
||||||
|
default = ["en"];
|
||||||
|
example = literalExpression ''["en" "de"]'';
|
||||||
|
description = "The languages to be used for spellchecking";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
vim = {
|
||||||
|
configRC.spellchecking = entryAfter ["basic"] ''
|
||||||
|
" Spellchecking
|
||||||
|
set spell
|
||||||
|
set spelllang=${concatStringsSep "," cfg.languages}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
5
modules/neovim/config.nix
Normal file
5
modules/neovim/config.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
config = {
|
||||||
|
vim.startPlugins = ["plenary-nvim"];
|
||||||
|
};
|
||||||
|
}
|
8
modules/neovim/default.nix
Normal file
8
modules/neovim/default.nix
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./basic
|
||||||
|
./mappings
|
||||||
|
|
||||||
|
./config.nix
|
||||||
|
];
|
||||||
|
}
|
57
modules/neovim/mappings/default.nix
Normal file
57
modules/neovim/mappings/default.nix
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib.modules) mkIf;
|
||||||
|
|
||||||
|
cfg = config.vim;
|
||||||
|
in {
|
||||||
|
vim.maps = {
|
||||||
|
normal =
|
||||||
|
mkIf cfg.disableArrows {
|
||||||
|
"<up>" = {
|
||||||
|
action = "<nop>";
|
||||||
|
|
||||||
|
noremap = false;
|
||||||
|
};
|
||||||
|
"<down>" = {
|
||||||
|
action = "<nop>";
|
||||||
|
|
||||||
|
noremap = false;
|
||||||
|
};
|
||||||
|
"<left>" = {
|
||||||
|
action = "<nop>";
|
||||||
|
noremap = false;
|
||||||
|
};
|
||||||
|
"<right>" = {
|
||||||
|
action = "<nop>";
|
||||||
|
noremap = false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// mkIf cfg.mapLeaderSpace {
|
||||||
|
"<space>" = {
|
||||||
|
action = "<nop>";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
insert = mkIf cfg.disableArrows {
|
||||||
|
"<up>" = {
|
||||||
|
action = "<nop>";
|
||||||
|
noremap = false;
|
||||||
|
};
|
||||||
|
"<down>" = {
|
||||||
|
action = "<nop>";
|
||||||
|
noremap = false;
|
||||||
|
};
|
||||||
|
"<left>" = {
|
||||||
|
action = "<nop>";
|
||||||
|
noremap = false;
|
||||||
|
};
|
||||||
|
"<right>" = {
|
||||||
|
action = "<nop>";
|
||||||
|
noremap = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -9,8 +9,7 @@
|
||||||
inherit (lib.nvim.binds) mkBinding;
|
inherit (lib.nvim.binds) mkBinding;
|
||||||
inherit (lib.nvim.dag) entryAnywhere;
|
inherit (lib.nvim.dag) entryAnywhere;
|
||||||
inherit (lib.nvim.lua) toLuaObject;
|
inherit (lib.nvim.lua) toLuaObject;
|
||||||
# TODO: move this to its own module
|
inherit (lib.nvim.binds) pushDownDefault;
|
||||||
inherit (lib) pushDownDefault;
|
|
||||||
|
|
||||||
cfg = config.vim.filetree.nvimTree;
|
cfg = config.vim.filetree.nvimTree;
|
||||||
self = import ./nvimtree.nix {inherit pkgs lib;};
|
self = import ./nvimtree.nix {inherit pkgs lib;};
|
|
@ -5,10 +5,8 @@
|
||||||
}: let
|
}: let
|
||||||
inherit (builtins) toJSON;
|
inherit (builtins) toJSON;
|
||||||
inherit (lib.modules) mkIf mkMerge;
|
inherit (lib.modules) mkIf mkMerge;
|
||||||
inherit (lib.nvim.binds) addDescriptionsToMappings mkSetExprBinding mkSetLuaBinding;
|
inherit (lib.nvim.binds) addDescriptionsToMappings mkSetExprBinding mkSetLuaBinding pushDownDefault;
|
||||||
inherit (lib.nvim.dag) entryAnywhere;
|
inherit (lib.nvim.dag) entryAnywhere;
|
||||||
# TODO: move this to its own module
|
|
||||||
inherit (lib) pushDownDefault;
|
|
||||||
|
|
||||||
cfg = config.vim.git;
|
cfg = config.vim.git;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue