refactor: restructure

This commit is contained in:
2025-06-20 17:11:43 +02:00
parent 05b437dbf8
commit d3de8874bc
41 changed files with 212 additions and 172 deletions

View File

@@ -14,8 +14,6 @@
pinentry = pkgs.pinentry-gnome3;
};
};
git = import ./git.nix;
nixvim = import ./nixvim { inherit pkgs; };
gpg.enable = true;
btop = {
enable = true;

View File

@@ -1,23 +1,26 @@
{ ... }:
{
enable = true;
userName = "Thea Schöbl";
userEmail = "dev@theaninova.de";
signing = {
key = "6C9E EFC5 1AE0 0131 78DE B9C8 68FF FB1E C187 88CA";
signByDefault = true;
};
extraConfig = {
pull.rebase = true;
init.defaultBranch = "main";
merge = {
tool = "nvim-mergetool";
conflictstyle = "diff3";
programs.git = {
enable = true;
userName = "Thea Schöbl";
userEmail = "dev@theaninova.de";
signing = {
key = "6C9E EFC5 1AE0 0131 78DE B9C8 68FF FB1E C187 88CA";
signByDefault = true;
};
mergetool.nvim-mergetool = {
cmd = # sh
''nvim -f -c "MergetoolStart" "$MERGED" "$BASE" "$LOCAL" "$REMOTE"'';
trustExitCode = true;
extraConfig = {
pull.rebase = true;
init.defaultBranch = "main";
merge = {
tool = "nvim-mergetool";
conflictstyle = "diff3";
};
mergetool.nvim-mergetool = {
cmd = # sh
''nvim -f -c "MergetoolStart" "$MERGED" "$BASE" "$LOCAL" "$REMOTE"'';
trustExitCode = true;
};
mergetool.prompt = false;
};
mergetool.prompt = false;
};
}

View File

@@ -0,0 +1,116 @@
{ ... }:
{
programs.nixvim = {
enable = true;
defaultEditor = true;
vimAlias = true;
opts = {
number = true;
relativenumber = true;
tabstop = 2;
softtabstop = 2;
shiftwidth = 2;
expandtab = true;
smartindent = true;
signcolumn = "yes";
scrolloff = 12;
hlsearch = false;
incsearch = true;
updatetime = 50;
fillchars.eob = " ";
};
clipboard = {
register = "unnamedplus";
providers.wl-copy.enable = true;
};
globals.mapleader = ";";
presets = {
auto-save.enable = true;
auto-format.enable = true;
harpoon.enable = false;
lazygit.enable = true;
mergetool.enable = true;
trouble.enable = false;
undotree.enable = true;
aerial.enable = true;
base = {
completion = {
enable = true;
copilot = true;
};
diagnostics.enable = true;
coverage.enable = true;
find.enable = true;
formatting = {
enable = true;
prettier = true;
};
spellcheck.enable = true;
status-line.enable = true;
syntax.enable = true;
tree.enable = true;
};
languages = {
angular.enable = true;
c = {
enable = true;
};
css = {
enable = true;
stylelint = true;
};
dart.enable = true;
js = {
enable = true;
eslint = true;
npm = true;
};
lua.enable = true;
nix.enable = true;
python.enable = true;
rust.enable = true;
shell.enable = true;
svelte.enable = true;
};
remaps = {
half-page-scroll.enable = true;
no-accidental-macro.enable = true;
paste-keep-buffer.enable = true;
wrapped-line-nav.enable = true;
};
};
plugins = {
vim-surround.enable = true;
which-key.enable = true;
schemastore.enable = true;
comment.enable = true;
debugprint.enable = true;
todo-comments.enable = true;
treesitter-context = {
enable = false; # TODO: looks weird with Neovide
settings = {
line_numbers = false;
};
};
lsp.servers = {
html.enable = true;
svelte.enable = true;
dockerls.enable = true;
yamlls.enable = true;
jsonls.enable = true;
taplo.enable = true;
};
};
};
}

View File

@@ -1,115 +0,0 @@
{ pkgs }:
{
enable = true;
defaultEditor = true;
vimAlias = true;
opts = {
number = true;
relativenumber = true;
tabstop = 2;
softtabstop = 2;
shiftwidth = 2;
expandtab = true;
smartindent = true;
signcolumn = "yes";
scrolloff = 12;
hlsearch = false;
incsearch = true;
updatetime = 50;
fillchars.eob = " ";
};
clipboard = {
register = "unnamedplus";
providers.wl-copy.enable = true;
};
globals.mapleader = ";";
presets = {
auto-save.enable = true;
auto-format.enable = true;
# harpoon.enable = true;
lazygit.enable = true;
mergetool.enable = true;
trouble.enable = true;
undotree.enable = true;
aerial.enable = true;
base = {
completion = {
enable = true;
copilot = true;
};
diagnostics.enable = true;
coverage.enable = true;
find.enable = true;
formatting = {
enable = true;
prettier = true;
};
spellcheck.enable = false;
status-line.enable = true;
syntax.enable = true;
tree.enable = true;
};
languages = {
angular.enable = true;
c = {
enable = true;
# cppcheck = true;
};
css = {
enable = true;
stylelint = true;
};
dart.enable = true;
js = {
enable = true;
eslint = true;
npm = true;
};
lua.enable = true;
nix.enable = true;
python.enable = true;
rust.enable = true;
shell.enable = true;
svelte.enable = true;
};
remaps = {
half-page-scroll.enable = true;
no-accidental-macro.enable = true;
paste-keep-buffer.enable = true;
wrapped-line-nav.enable = true;
};
};
plugins = {
vim-surround.enable = true;
which-key.enable = true;
schemastore.enable = true;
comment.enable = true;
debugprint.enable = true;
todo-comments.enable = true;
treesitter-context = {
enable = false; # TODO: looks weird with Neovide
settings = {
line_numbers = false;
};
};
lsp.servers = {
html.enable = true;
svelte.enable = true;
dockerls.enable = true;
yamlls.enable = true;
jsonls.enable = true;
taplo.enable = true;
};
};
}

View File

@@ -1,64 +0,0 @@
{
lib,
config,
...
}:
let
cfg = config.presets.aerial;
in
{
options.presets.aerial = {
enable = lib.mkEnableOption "aerial";
};
config = lib.mkIf cfg.enable {
keymaps = [
{
key = "<C-Up>";
action = # vim
":AerialPrev<CR>";
}
{
key = "<C-Down>";
action = # vim
":AerialNext<CR>";
}
{
key = "fs";
mode = "n";
action = # vim
":Telescope aerial<CR>";
}
];
plugins = {
aerial = {
enable = true;
settings = {
autojump = true;
highlight_on_jump = false;
filter_kind = false;
open_automatic = false;
show_guides = true;
backends = [
"lsp"
"treesitter"
"markdown"
"asciidoc"
"man"
];
layout = {
placement = "edge";
direction = "right";
};
};
};
which-key.settings.spec = [
{
__unkeyed-1 = "fs";
group = "Symbols";
icon = "󰡱";
}
];
};
};
}

View File

@@ -1,83 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.auto-format;
in
{
options.presets.auto-format = {
enable = lib.mkEnableOption "auto-format";
varName = lib.mkOption {
type = lib.types.str;
default = "disable_autoformat";
};
commandName = lib.mkOption {
type = lib.types.str;
default = "AutoFormatToggle";
};
};
config = lib.mkIf cfg.enable {
userCommands.${cfg.commandName}.command.__raw = # lua
''
function(args)
if args.bang then
vim.b.${cfg.varName} = not vim.b.${cfg.varName}
else
vim.g.${cfg.varName} = not vim.g.${cfg.varName}
end
local lualine, lib = pcall(require, 'lualine')
if lualine then
lib.refresh()
end
end
'';
keymaps = [
{
key = "<leader>af";
mode = "n";
options.silent = true;
action = "<cmd>:${cfg.commandName}<CR>";
}
{
key = "<leader>aF";
mode = "n";
options.silent = true;
action = "<cmd>:${cfg.commandName}!<CR>";
}
];
plugins = {
which-key.settings.spec = [
{
__unkeyed-1 = "<leader>a";
group = "Auto Actions";
icon = "󰁨";
}
{
__unkeyed-1 = "<leader>af";
desc = "Tggle auto-format";
icon = "󱌓";
}
{
__unkeyed-1 = "<leader>aF";
desc = "Tggle auto-format (buffer)";
icon = "󱌓";
}
];
conform-nvim.settings.format_after_save = # lua
''
function(bufnr)
if vim.g.${cfg.varName} or vim.b[bufnr].${cfg.varName} then
return
end
return { timeout_ms = 500, lsp_fallback = true };
end
'';
lualine.settings.sections.lualine_x = lib.mkOrder 600 [
"(vim.g.${cfg.varName} or vim.b.${cfg.varName}) and '󱌓' or nil"
];
};
};
}

View File

@@ -1,110 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.auto-save;
in
{
options.presets.auto-save = {
enable = lib.mkEnableOption "auto save";
disableOnStart = lib.mkEnableOption "disable auto save on start";
event = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [
"BufHidden"
"FocusLost"
];
};
};
config = lib.mkIf cfg.enable {
extraConfigLua = # lua
''
function PerformAutoSave(buf)
buf = buf or vim.api.nvim_get_current_buf()
if vim.b.disable_autosave or vim.g.disable_autosave then return end
if vim.fn.getbufvar(buf, "&modifiable") ~= 1 then return end
if not vim.api.nvim_buf_get_option(buf, 'modified') then return end
if vim.api.nvim_buf_get_option(buf, 'buftype') ~= "" then return end
vim.api.nvim_buf_call(buf, function()
vim.cmd('silent! w')
print("Auto save at " .. os.date("%H:%M:%S"))
end)
end
'';
autoCmd = [
{
event = cfg.event;
pattern = [ "*" ];
callback.__raw = # lua
"function(args) PerformAutoSave(args.buf) end";
}
];
globals.disable_autosave = cfg.disableOnStart;
userCommands.ToggleAutoSave = {
bang = true;
command.__raw = # lua
''
function(args)
if args.bang then
vim.b.disable_autosave = not vim.b.disable_autosave
else
vim.g.disable_autosave = not vim.g.disable_autosave
end
local lualine, lib = pcall(require, 'lualine')
if lualine then
lib.refresh()
end
end
'';
};
keymaps = [
{
key = "<leader>as";
mode = "n";
options.silent = true;
action = "<cmd>:ToggleAutoSave<CR>";
}
{
key = "<leader>aS";
mode = "n";
options.silent = true;
action = "<cmd>:ToggleAutoSave!<CR>";
}
];
plugins = {
which-key.settings.spec = [
{
__unkeyed-1 = "<leader>a";
group = "Auto Actions";
icon = "󰁨";
}
{
__unkeyed-1 = "<leader>as";
desc = "Tggle auto-save";
icon = "󱙃";
}
{
__unkeyed-1 = "<leader>aS";
desc = "Tggle auto-save (buffer)";
icon = "󱙃";
}
];
/*
neo-tree.eventHandlers.window_before_open = # lua
"function() PerformAutoSave() end";
*/
lualine.settings.sections.lualine_x = lib.mkOrder 700 [
# lua
"(vim.g.disable_autosave or vim.b.disable_autosave) and '󱙃' or nil"
];
};
};
}

View File

@@ -1,106 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.base.completion;
in
{
options.presets.base.completion = {
enable = lib.mkEnableOption "completion";
copilot = lib.mkEnableOption "Copilot";
ollama = lib.mkEnableOption "Ollama";
};
config = lib.mkIf cfg.enable {
extraConfigLua =
lib.mkIf cfg.ollama
#lua
''
require('minuet').setup({
provider = 'openai_fim_compatible',
n_completions = 1,
context_window = 1024,
provider_options = {
openai_fim_compatible = {
api_key = 'TERM',
name = 'Ollama',
end_point = 'http://localhost:11434/v1/completions',
model = 'deepseek-coder-v2:16b',
optional = {
max_tokens = 56,
stop = { '\n' },
top_p = 0.9,
},
},
},
virtualtext = {
show_on_completion_menu = true,
auto_trigger_ft = { "*" },
keymap = {
accept = '<A-l>',
},
},
throttle = 0,
debounce = 0,
})
'';
plugins = {
luasnip.enable = true;
lspkind = {
enable = true;
mode = "symbol_text";
};
lualine.settings.sections.lualine_x = lib.mkIf cfg.ollama (
lib.mkBefore [
{ __unkeyed-1.__raw = "require('minuet.lualine')"; }
]
);
copilot-lua = lib.mkIf cfg.copilot {
enable = true;
settings.suggestion.auto_trigger = true;
};
cmp = {
enable = true;
settings = {
mapping = {
"<C-n>" = # lua
"cmp.mapping.select_next_item({behavior = cmp.SelectBehavior.Select})";
"<C-p>" = # lua
"cmp.mapping.select_prev_item({behavior = cmp.SelectBehavior.Select})";
"<C-y>" = # lua
"cmp.mapping.confirm({select = true})";
"<C-Enter>" = # lua
"cmp.mapping.complete()";
};
sources = [
{ name = "path"; }
{ name = "luasnip"; }
{ name = "nvim_lsp"; }
{ name = "nvim_lsp_signature_help"; }
{ name = "nvim_lsp_document_symbol"; }
];
formatting.fields = [
"abbr"
"kind"
];
snippet.expand = # lua
"function(args) require('luasnip').lsp_expand(args.body) end";
window = {
completion = {
border = "solid";
zindex = 10;
};
documentation = {
border = "solid";
zindex = 10;
};
};
};
};
};
extraPlugins = lib.mkIf cfg.ollama [ pkgs.vimPlugins.minuet-ai-nvim ];
};
}

View File

@@ -1,99 +0,0 @@
{
lib,
config,
...
}:
let
cfg = config.presets.base.coverage;
in
{
options.presets.base.coverage = {
enable = lib.mkEnableOption "coverage";
};
config = lib.mkIf cfg.enable {
keymaps = [
{
key = "<leader>cs";
action = # vim
":CoverageSummary<CR>";
}
{
key = "<leader>cr";
action = # vim
":CoverageClear<CR>:CoverageLoad<CR>:CoverageShow<CR>";
}
{
key = "<leader>ch";
action = # vim
":CoverageHide<CR>";
}
{
key = "<leader>cc";
action = # vim
":CoverageShow<CR>";
}
];
autoCmd = [
{
event = [ "BufEnter" ];
callback.__raw = # lua
''
function()
local ftype = vim.bo.filetype
local ok, lang = pcall(require, "coverage.languages." .. ftype)
if not ok then
return
end
local config = require("coverage.config")
local util = require("coverage.util")
local Path = require("plenary.path")
local ft_config = config.opts.lang[ftype]
if ft_config == nil then
return
end
local p = Path:new(util.get_coverage_file(ft_config.coverage_file))
if not p:exists() then
return
end
require("coverage").load(true)
end
'';
}
];
plugins = {
coverage = {
enable = true;
autoReload = true;
};
which-key.settings.spec = [
{
__unkeyed-1 = "<leader>c";
desc = "Coverage";
icon = "󰠞";
}
{
__unkeyed-1 = "<leader>cs";
desc = "Summary";
icon = "";
}
{
__unkeyed-1 = "<leader>cr";
desc = "Reload";
icon = "󰑓";
}
{
__unkeyed-1 = "<leader>ch";
desc = "Hide";
icon = "󱨃";
}
{
__unkeyed-1 = "<leader>cc";
desc = "Show";
icon = "󱨂";
}
];
};
};
}

View File

@@ -1,150 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.base.diagnostics;
in
{
options.presets.base.diagnostics = {
enable = lib.mkEnableOption "diagnostics";
};
config = lib.mkIf cfg.enable {
extraConfigLuaPre = # lua
''
vim.lsp.set_log_level("off")
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { border = "solid" })
'';
diagnostic.settings = {
virtual_text.prefix = "";
signs = false;
float = {
focusable = false;
header = "";
border = "solid";
scope = "cursor";
prefix = "";
};
underline = true;
update_in_insert = true;
severity_sort = true;
};
keymaps = [
{
key = "<leader>sn";
mode = "n";
options.silent = true;
action.__raw = # lua
"function() vim.diagnostic.open_float(nil) end";
}
{
key = "<leader>sx";
mode = "n";
options.silent = true;
action.__raw = # lua
"vim.lsp.buf.format";
}
{
key = "<leader>sR";
mode = "n";
options.silent = true;
action = "<cmd>:LspRestart<CR>";
}
{
key = "<leader>sc";
mode = "n";
action = ":IncRename ";
}
{
key = "<leader>sh";
mode = "n";
options.silent = true;
action.__raw = # lua
"function() vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({0}), {0}) end";
}
];
plugins = {
lsp = {
enable = true;
inlayHints = false;
};
telescope = {
enable = true;
keymaps = {
"<leader>sr" = "lsp_references";
"<leader>sd" = "lsp_definitions";
"<leader>si" = "lsp_implementations";
"<leader>sw" = "lsp_workspace_symbols";
"<leader>st" = "lsp_type_definitions";
"<leader>sa" = "quickfix";
};
};
inc-rename.enable = true;
which-key.settings.spec = [
{
__unkeyed-1 = "<leader>s";
group = "LSP";
icon = "󱐋";
}
{
__unkeyed-1 = "<leader>sr";
desc = "References";
icon = "󱁉";
}
{
__unkeyed-1 = "<leader>sc";
desc = "Incremental Rename";
icon = "󰑕";
}
{
__unkeyed-1 = "<leader>sR";
desc = "Restart LSP";
icon = "󰜉";
}
{
__unkeyed-1 = "<leader>sd";
desc = "Definitions";
icon = "󰜬";
}
{
__unkeyed-1 = "<leader>si";
desc = "Implementations";
icon = "󰴽";
}
{
__unkeyed-1 = "<leader>sw";
desc = "Workspace Symbols";
icon = "󰷐";
}
{
__unkeyed-1 = "<leader>st";
desc = "Type Definitions";
icon = "󱍕";
}
{
__unkeyed-1 = "<leader>sh";
icon = "󰞂";
desc = "Inlay Hints";
}
{
__unkeyed-1 = "<leader>sa";
desc = "Code Actions";
icon = "";
}
{
__unkeyed-1 = "<leader>sn";
desc = "Diagnostics";
icon = "";
}
{
__unkeyed-1 = "<leader>sx";
desc = "LSP Format";
icon = "󰉢";
}
];
};
};
}

View File

@@ -1,63 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.base.find;
in
{
options.presets.base.find = {
enable = lib.mkEnableOption "file finding";
};
config = lib.mkIf cfg.enable {
plugins = {
web-devicons.enable = true;
telescope = {
enable = true;
keymaps = {
"ff" = {
action = "git_files";
mode = "n";
};
"fa" = {
action = "find_files";
mode = "n";
};
"fg" = {
action = "live_grep";
mode = "n";
};
"fc" = {
action = "buffers";
mode = "n";
};
};
};
which-key.settings.spec = [
{
__unkeyed-1 = "f";
group = "Find";
icon = "󰍉";
}
{
__unkeyed-1 = "ff";
desc = "File";
icon = "󰈢";
}
{
__unkeyed-1 = "fa";
desc = "All Files";
icon = "󱪡";
}
{
__unkeyed-1 = "fg";
desc = "Grep";
icon = "󰑑";
}
{
__unkeyed-1 = "fc";
desc = "Current";
icon = "󰈙";
}
];
};
};
}

View File

@@ -1,35 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.base.formatting;
in
{
options.presets.base.formatting = {
enable = lib.mkEnableOption "formatting";
prettier = lib.mkEnableOption "prettier formatter";
};
config = lib.mkIf cfg.enable {
plugins.conform-nvim = {
enable = true;
settings.formatters_by_ft = lib.mkIf cfg.prettier {
javascript = [ "prettierd" ];
markdown = [ "prettierd" ];
typescript = [ "prettierd" ];
json = [ "prettierd" ];
yaml = [ "prettierd" ];
html = [ "prettierd" ];
angular = [ "prettierd" ];
css = [ "prettierd" ];
scss = [ "prettierd" ];
less = [ "prettierd" ];
svelte = [ "prettierd" ];
};
};
extraPackages = lib.mkIf cfg.prettier [ pkgs.prettierd ];
};
}

View File

@@ -1,19 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.base.minimap;
in
{
options.presets.base.minimap = {
enable = lib.mkEnableOption "minimap";
};
config = lib.mkIf cfg.enable {
globals = {
minimap_width = 10;
minimap_auto_start = 1;
minimap_auto_start_win_enter = 1;
minimap_close_buftypes = [ "nofile" ];
minimap_block_filetypes = [ "NvimTree" ];
};
};
}

View File

@@ -1,23 +0,0 @@
{
lib,
config,
hmConfig,
...
}:
let
cfg = config.presets.base.spellcheck;
in
{
options.presets.base.spellcheck = {
enable = lib.mkEnableOption "Spellcheck";
};
config = lib.mkIf cfg.enable {
plugins.lsp.servers.harper_ls = {
enable = true;
settings = {
userDictPath = "${hmConfig.xdg.configHome}/harper-user-dictionary.txt";
};
};
};
}

View File

@@ -1,75 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.base.status-line;
in
{
options.presets.base.status-line = {
enable = lib.mkEnableOption "status line";
};
config = lib.mkIf cfg.enable {
opts.showmode = false;
plugins = {
notify = {
enable = true;
settings.stages = "static";
};
telescope = {
enable = true;
keymaps."<leader>n" = # vim
"notify";
};
which-key.settings.spec = [
{
__unkeyed-1 = "<leader>n";
desc = "Notifications";
icon = "󰍩";
}
];
lualine = {
enable = true;
settings = {
options = {
globalstatus = true;
/*
section_separators = {
left = "";
right = "";
};
*/
component_separators = {
left = "";
right = "";
};
};
sections = {
lualine_a = [
{
__unkeyed-1 = "mode";
/*
separator = {
right = "";
left = "";
};
*/
icon = "";
}
];
lualine_x = lib.mkAfter [ { __unkeyed-1 = "filetype"; } ];
lualine_z = [
{
__unkeyed-1 = "location";
/*
separator = {
right = "";
left = "";
};
*/
}
];
};
};
};
};
};
}

View File

@@ -1,45 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.base.syntax;
in
{
options.presets.base.syntax = {
enable = lib.mkEnableOption "syntax highlighting";
};
config = lib.mkIf cfg.enable {
plugins = {
treesitter = {
enable = true;
settings = {
highlight = {
additional_vim_regex_highlighting = true;
enable = true;
};
indent.enable = true;
};
grammarPackages = pkgs.vimPlugins.nvim-treesitter.allGrammars;
nixvimInjections = true;
};
indent-blankline = {
enable = lib.mkDefault true;
settings = {
indent.char = "";
scope.show_start = false;
};
};
illuminate.enable = lib.mkDefault true;
nvim-autopairs.enable = lib.mkDefault true;
colorizer.enable = lib.mkDefault true;
ts-autotag = {
enable = lib.mkDefault true;
settings.opts.enable_close_on_slash = lib.mkDefault true;
};
};
};
}

View File

@@ -1,47 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.base.tree;
in
{
options.presets.base.tree = {
enable = lib.mkEnableOption "file tree";
};
config = lib.mkIf cfg.enable {
keymaps = [
{
key = "ft";
mode = "n";
action = # vim
"<cmd>:Neotree toggle<CR>";
}
];
plugins = {
web-devicons.enable = true;
neo-tree = {
enable = true;
filesystem = {
useLibuvFileWatcher = true;
followCurrentFile.enabled = true;
filteredItems.visible = true;
};
popupBorderStyle = "rounded";
filesystem.window.mappings.f = "noop";
window.mappings.f = "noop";
eventHandlers.neo_tree_buffer_leave = # lua
''
function()
require('neo-tree').close_all()
end
'';
};
which-key.settings.spec = [
{
__unkeyed-1 = "ft";
desc = "Tree";
icon = "󰙅";
}
];
};
};
}

View File

@@ -1,47 +0,0 @@
{ lib, pkgs, ... }:
{
options.programs.nixvim = lib.mkOption {
type = pkgs.lib.types.submoduleWith {
specialArgs = {
inherit pkgs;
};
modules = [
./aerial.nix
./auto-save.nix
./auto-format.nix
./harpoon.nix
./mergetool.nix
./lazygit.nix
./trouble.nix
./undotree.nix
./base/completion.nix
./base/coverage.nix
./base/diagnostics.nix
./base/find.nix
./base/formatting.nix
./base/spellcheck.nix
./base/status-line.nix
./base/syntax.nix
./base/tree.nix
./languages/angular.nix
./languages/c.nix
./languages/css.nix
./languages/dart.nix
./languages/js.nix
./languages/lua.nix
./languages/nix.nix
./languages/python.nix
./languages/rust.nix
./languages/shell.nix
./languages/svelte.nix
./remaps/half-page-scroll.nix
./remaps/no-accidental-macro.nix
./remaps/paste-keep-buffer.nix
./remaps/wrapped-line-nav.nix
];
};
};
}

View File

@@ -1,58 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.harpoon;
in
{
options.presets.harpoon = {
enable = lib.mkEnableOption "Harpoon";
};
config = lib.mkIf cfg.enable {
keymaps = [
{
key = "hh";
mode = "n";
action = ":Telescope harpoon marks<CR>";
}
];
plugins = {
telescope.enable = true;
harpoon = {
enable = true;
enableTelescope = true;
keymaps = {
addFile = "hm";
navNext = "hn";
navPrev = "hp";
};
};
which-key.settings.spec = [
{
__unkeyed-1 = "h";
group = "Harpoon";
icon = "󱀺";
}
{
__unkeyed-1 = "hh";
desc = "Marks";
icon = "󰈢";
}
{
__unkeyed-1 = "hm";
desc = "Add File";
icon = "󱪝";
}
{
__unkeyed-1 = "hn";
desc = "Next";
icon = "";
}
{
__unkeyed-1 = "hp";
desc = "Prev";
icon = "";
}
];
};
};
}

View File

@@ -1,58 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.languages.angular;
in
{
options.presets.languages.angular = {
enable = lib.mkEnableOption "Angular";
};
config = lib.mkIf cfg.enable {
plugins = {
lsp.enabledServers = [
{
name = "angularls";
extraOptions = {
cmd = [
"ngserver"
"--stdio"
"--tsProbeLocations"
""
"--ngProbeLocations"
""
];
on_new_config.__raw = # lua
''
function(new_config, new_root_dir)
new_config.cmd = {
new_root_dir .. "/node_modules/@angular/language-server/bin/ngserver",
"--stdio",
"--tsProbeLocations",
new_root_dir .. "/node_modules",
"--ngProbeLocations",
new_root_dir .. "/node_modules",
}
end
'';
filetypes = [
"typescript"
"html"
"typescriptreact"
"typescript.tsx"
"angular"
"html.angular"
];
on_attach.__raw = # lua
''
function(client, bufnr)
if vim.bo[bufnr].filetype == "html" then
vim.bo[bufnr].filetype = "angular"
end
end
'';
};
}
];
};
};
}

View File

@@ -1,47 +0,0 @@
{
lib,
config,
...
}:
let
cfg = config.presets.languages.c;
in
{
options.presets.languages.c = {
enable = lib.mkEnableOption "C/C++";
cppcheck = lib.mkEnableOption "cppcheck";
};
config = lib.mkIf cfg.enable {
plugins = {
conform-nvim.settings.formatters_by_ft = {
c = [ "clang-format" ];
cpp = [ "clang-format" ];
};
none-ls = {
enable = true;
sources.diagnostics = {
cppcheck = lib.mkIf cfg.cppcheck {
enable = true;
};
};
};
lsp.servers = {
clangd = {
enable = true;
cmd = [
"clangd"
"--offset-encoding=utf-16"
"--clang-tidy"
];
settings.InlayHints = {
Designators = true;
Enabled = true;
ParameterNames = true;
DeducedTypes = true;
};
};
};
};
};
}

View File

@@ -1,29 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.languages.css;
in
{
options.presets.languages.css = {
enable = lib.mkEnableOption "CSS";
stylelint = lib.mkEnableOption "stylelint";
};
config = lib.mkIf cfg.enable {
plugins = {
none-ls = lib.mkIf cfg.stylelint {
enable = true;
sources = {
diagnostics.stylelint.enable = true;
formatting.stylelint.enable = true;
};
};
lsp.servers.cssls.enable = true;
};
extraPackages = lib.mkIf cfg.stylelint [ pkgs.nodePackages.stylelint ];
};
}

View File

@@ -1,16 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.languages.dart;
in
{
options.presets.languages.dart = {
enable = lib.mkEnableOption "Dart";
};
config = lib.mkIf cfg.enable {
plugins = {
conform-nvim.settings.formatters_by_ft.dart = [ "dart_format" ];
lsp.servers.dartls.enable = true;
};
};
}

View File

@@ -1,75 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.languages.js;
in
{
options.presets.languages.js = {
enable = lib.mkEnableOption "JS";
eslint = lib.mkEnableOption "ESLint";
npm = lib.mkEnableOption "NPM package completion";
};
config = lib.mkIf cfg.enable {
extraConfigLua =
lib.mkIf cfg.npm # lua
''
require("cmp-npm").setup({})
'';
plugins = {
lspkind = lib.mkIf cfg.npm {
cmp.after = # lua
''
function(entry, vim_item, kind)
if entry.source.name == "npm" then
kind.kind = ""
kind.kind_hl_group = "CmpItemKindNpm"
end
kind.kind = kind.kind .. " "
return kind
end
'';
};
cmp.settings.sources = lib.mkIf cfg.npm [
{
name = "npm";
keywordLength = 4;
priority = 10;
}
];
lsp.servers = {
ts_ls = {
enable = true;
settings = {
typescript.inlayHints = {
includeInlayParameterNameHints = "all";
includeInlayParameterNameHintsWhenArgumentMatchesName = true;
includeInlayFunctionParameterTypeHints = true;
includeInlayVariableTypeHints = true;
includeInlayVariableTypeHintsWhenTypeMatchesName = true;
includeInlayPropertyDeclarationTypeHints = true;
includeInlayFunctionLikeReturnTypeHints = true;
includeInlayEnumMemberValueHints = true;
};
javascript.inlayHints = {
includeInlayParameterNameHints = "all";
includeInlayParameterNameHintsWhenArgumentMatchesName = true;
includeInlayFunctionParameterTypeHints = true;
includeInlayVariableTypeHints = true;
includeInlayVariableTypeHintsWhenTypeMatchesName = true;
includeInlayPropertyDeclarationTypeHints = true;
includeInlayFunctionLikeReturnTypeHints = true;
includeInlayEnumMemberValueHints = true;
};
};
};
eslint.enable = lib.mkIf cfg.eslint true;
};
};
extraPackages = [ pkgs.nodePackages.typescript-language-server ];
};
}

View File

@@ -1,22 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.languages.lua;
in
{
options.presets.languages.lua = {
enable = lib.mkEnableOption "Lua";
};
config = lib.mkIf cfg.enable {
plugins = {
conform-nvim.settings.formatters_by_ft.lua = [ "stylua" ];
lsp.servers.lua_ls.enable = true;
};
extraPackages = [ pkgs.stylua ];
};
}

View File

@@ -1,27 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.languages.nix;
in
{
options.presets.languages.nix = {
enable = lib.mkEnableOption "Nix";
};
config = lib.mkIf cfg.enable {
plugins = {
conform-nvim.settings.formatters_by_ft.nix = [ "nixfmt" ];
none-ls = {
enable = true;
sources.diagnostics.statix.enable = true;
};
lsp.servers.nil_ls.enable = true;
nix.enable = true;
};
extraPackages = [ pkgs.nixfmt-rfc-style ];
};
}

View File

@@ -1,22 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.languages.python;
in
{
options.presets.languages.python = {
enable = lib.mkEnableOption "Python";
};
config = lib.mkIf cfg.enable {
plugins = {
conform-nvim.settings.formatters_by_ft.python = [ "black" ];
lsp.servers.pyright.enable = true;
};
extraPackages = [ pkgs.black ];
};
}

View File

@@ -1,42 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.languages.rust;
in
{
options.presets.languages.rust = {
enable = lib.mkEnableOption "Rust";
};
config = lib.mkIf cfg.enable {
plugins = {
conform-nvim.settings.formattters_by_ft.rust = [ "rustfmt" ];
lsp.servers.rust_analyzer = {
enable = true;
installCargo = false;
installRustc = false;
settings.inlayHints = {
bindingModeHints.enable = false;
chainingHints.enable = true;
closingBraceHints = {
enable = true;
minLines = 25;
};
closureReturnTypeHints.enable = "never";
lifetimeElisionHints = {
enable = "never";
useParameterNames = false;
};
maxLength = 25;
parameterHints.enable = true;
reborrowHints.enable = "never";
renderColons = true;
typeHints = {
enable = true;
hideClosureInitialization = false;
hideNamedConstructor = false;
};
};
};
};
};
}

View File

@@ -1,22 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.languages.shell;
in
{
options.presets.languages.shell = {
enable = lib.mkEnableOption "Shell/Bash";
};
config = lib.mkIf cfg.enable {
plugins = {
conform-nvim.settings.formatters_by_ft.sh = [ "shfmt" ];
lsp.servers.bashls.enable = true;
};
extraPackages = [ pkgs.shfmt ];
};
}

View File

@@ -1,27 +0,0 @@
{
lib,
config,
...
}:
let
cfg = config.presets.languages.svelte;
in
{
options.presets.languages.svelte = {
enable = lib.mkEnableOption "Svelte";
};
config = lib.mkIf cfg.enable {
plugins.lsp.servers.svelte = {
enable = true;
settings.typescript.inlayHints = {
parameterNames.enabled = "all";
parameterTypes.enabled = true;
variableTypes.enabled = true;
propertyDeclarationTypes.enabled = true;
functionLikeReturnTypes.enabled = true;
enumMemberValues.enabled = true;
};
};
};
}

View File

@@ -1,79 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.lazygit;
in
{
options.presets.lazygit = {
enable = lib.mkEnableOption "LazyGit";
toggleBind = lib.mkOption {
type = lib.types.str;
default = "<leader>g";
};
commandName = lib.mkOption {
type = lib.types.str;
default = "ToggleLazyGit";
};
};
config = lib.mkIf cfg.enable {
extraConfigLua = # lua
''
LazygitTerminal = require("toggleterm.terminal").Terminal:new({
cmd = "${lib.getExe pkgs.lazygit}",
dir = "git_dir",
direction = "float",
on_open = function(term)
vim.cmd("startinsert!")
vim.api.nvim_buf_set_keymap(term.bufnr, "n", "q", "<cmd>close<CR>", { noremap = true, silent = true })
end,
on_close = function(_)
vim.cmd("startinsert!")
end,
})
function LazygitToggle()
lazygit:toggle()
end
'';
userCommands.${cfg.commandName}.command.__raw = # lua
''
function()
LazygitTerminal:toggle()
end
'';
keymaps = [
{
key = cfg.toggleBind;
mode = "n";
options.silent = true;
action = "<cmd>:${cfg.commandName}<CR>";
}
];
plugins = {
toggleterm = {
enable = true;
settings = {
direction = lib.mkDefault "vertical";
size = lib.mkDefault 60;
};
};
which-key.settings.spec = [
{
__unkeyed-1 = cfg.toggleBind;
desc = "Git";
icon = "";
}
];
};
};
}

View File

@@ -1,22 +0,0 @@
{
lib,
pkgs,
config,
...
}:
let
cfg = config.presets.mergetool;
in
{
options.presets.mergetool = {
enable = lib.mkEnableOption "Mergetool";
};
config = lib.mkIf cfg.enable {
globals = {
mergetool_layout = "mr";
mergetool_prefer_revision = "local";
};
extraPlugins = [ pkgs.vimPlugins.vim-mergetool ];
};
}

View File

@@ -1,22 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.remaps.half-page-scroll;
in
{
options.presets.remaps.half-page-scroll = {
enable = lib.mkEnableOption "half page scroll";
};
config = lib.mkIf cfg.enable {
keymaps = [
{
key = "<C-d>";
action = "<C-d>zz";
}
{
key = "<C-u>";
action = "<C-u>zz";
}
];
};
}

View File

@@ -1,19 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.remaps.no-accidental-macro;
in
{
options.presets.remaps.no-accidental-macro = {
enable = lib.mkEnableOption "no accidental macro";
};
config = lib.mkIf cfg.enable {
keymaps = [
{
key = "Q";
mode = "n";
action = "<nop>";
}
];
};
}

View File

@@ -1,33 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.remaps.paste-keep-buffer;
in
{
options.presets.remaps.paste-keep-buffer = {
enable = lib.mkEnableOption "paste in visual keeps the buffer";
};
config = lib.mkIf cfg.enable {
keymaps = [
{
key = "p";
mode = "v";
action = ''"_dP'';
}
{
key = "<leader>p";
action = ''"_dP'';
}
];
plugins.which-key = {
enable = true;
settings.spec = [
{
__unkeyed-1 = "<leader>p";
desc = "Paste Keep Buffer";
icon = "";
}
];
};
};
}

View File

@@ -1,22 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.remaps.wrapped-line-nav;
in
{
options.presets.remaps.wrapped-line-nav = {
enable = lib.mkEnableOption "Navigate wrapped lines up and down";
};
config = lib.mkIf cfg.enable {
keymaps = [
{
key = "<up>";
action = "g<up>";
}
{
key = "<down>";
action = "g<down>";
}
];
};
}

View File

@@ -1,83 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.trouble;
in
{
options.presets.trouble = {
enable = lib.mkEnableOption "trouble";
};
config = lib.mkIf cfg.enable {
keymaps = [
{
key = "<leader>xx";
mode = "n";
action.__raw = # lua
"function() require('trouble').toggle('diagnostics') end";
}
{
key = "<leader>xw";
mode = "n";
action.__raw = # lua
"function() require('trouble').toggle('workspace_diagnostics') end";
}
{
key = "<leader>xd";
mode = "n";
action.__raw = # lua
"function() require('trouble').toggle('document_diagnostics') end";
}
{
key = "<leader>xq";
mode = "n";
action.__raw = # lua
"function() require('trouble').toggle('quickfix') end";
}
{
key = "<leader>xl";
mode = "n";
action.__raw = # lua
"function() require('trouble').toggle('loclist') end";
}
];
plugins = {
web-devicons.enable = true;
trouble.enable = true;
which-key.settings.spec = [
{
__unkeyed-1 = "<leader>x";
group = "Trouble";
icon = {
icon = "";
color = "red";
};
}
{
__unkeyed-1 = "<leader>xx";
desc = "Toggle";
icon = "󰺲";
}
{
__unkeyed-1 = "<leader>xw";
desc = "Workspace Diagnostics";
icon = "󰙅";
}
{
__unkeyed-1 = "<leader>xd";
desc = "Document Diagnostics";
icon = "󱪗";
}
{
__unkeyed-1 = "<leader>xq";
desc = "Quickfix";
icon = "";
}
{
__unkeyed-1 = "<leader>xl";
desc = "Loclist";
icon = "󰷐";
}
];
};
};
}

View File

@@ -1,34 +0,0 @@
{ lib, config, ... }:
let
cfg = config.presets.undotree;
in
{
options.presets.undotree = {
enable = lib.mkEnableOption "Undotree";
};
config = lib.mkIf cfg.enable {
opts = {
undodir.__raw = # lua
"os.getenv('HOME') .. '/.config/nvim/undodir'";
undofile = true;
};
keymaps = [
{
key = "<leader>u";
mode = "n";
action = "<cmd>:UndotreeToggle<CR>";
}
];
plugins = {
undotree.enable = true;
which-key.settings.spec = [
{
__unkeyed-1 = "<leader>u";
desc = "Undotree";
icon = "󰕌";
}
];
};
};
}