Draft: modules #1

Draft
pleshevskiy wants to merge 15 commits from modules into main
9 changed files with 131 additions and 87 deletions
Showing only changes of commit 1d31c3d1d2 - Show all commits

View file

@ -101,11 +101,11 @@
"gitsigns-nvim": { "gitsigns-nvim": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1695571272, "lastModified": 1713620636,
"narHash": "sha256-VJCtDnPSo5RgSC+czSIOvqGhpUT0dzvCzbLtup+Ctyo=", "narHash": "sha256-UK3DyvrQ0kLm9wrMQ6tLDoDunoThbY/Yfjn+eCZpuMw=",
"owner": "lewis6991", "owner": "lewis6991",
"repo": "gitsigns.nvim", "repo": "gitsigns.nvim",
"rev": "bdeba1cec3faddd89146690c10b9a87949c0ee66", "rev": "035da036e68e509ed158414416c827d022d914bd",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -213,11 +213,11 @@
}, },
"nix2lua": { "nix2lua": {
"locked": { "locked": {
"lastModified": 1713368896, "lastModified": 1713641247,
"narHash": "sha256-ivvxVxSpuri8rYP3FVdcxSRrabejAz6iAQvXqdzEGLc=", "narHash": "sha256-UDAxwO1vSkaPtmby04xjiHq5dxd03IBD3lkpFKYlV7Q=",
"ref": "refs/heads/main", "ref": "refs/heads/main",
"rev": "98eaf7a9c2a7e608387debeca8f403885fbec0e4", "rev": "8c4f3ca834ef7c07c9e3be3e006d7395c69a176c",
"revCount": 29, "revCount": 36,
"type": "git", "type": "git",
"url": "https://git.pleshevski.ru/mynix/nix2lua" "url": "https://git.pleshevski.ru/mynix/nix2lua"
}, },

View file

@ -242,7 +242,7 @@
minimalNeovim = mkNeovim pkgs; minimalNeovim = mkNeovim pkgs;
recommendedNeovim = minimalNeovim.override (prev: { allNeovim = minimalNeovim.override (prev: {
modules = { modules = {
catppuccin = { }; catppuccin = { };
nvim-tree-lua = { nvim-tree-lua = {
@ -256,16 +256,17 @@
]; ];
}; };
nvim-treesitter = { }; nvim-treesitter = { };
git = { };
}; };
plugins = with prev.nix2lua.lib; { plugins = with prev.nix2lua.lib; {
lualine-nvim = pipe [ lualine-nvim = pipe1
(require "lualine") (require "lualine")
(call "setup" [{ (call "setup" {
options.ignore_focus = [ "NvimTree" ]; options.ignore_focus = [ "NvimTree" ];
sections = { sections = {
lualine_a = [ lualine_a = [
[ "filename" (namedField "path" 1) ] [ "filename" (nf "path" 1) ]
]; ];
lualine_b = [ "branch" "diff" "diagnostics" ]; lualine_b = [ "branch" "diff" "diagnostics" ];
lualine_c = [ "lsp_progress" ]; lualine_c = [ "lsp_progress" ];
@ -273,51 +274,14 @@
lualine_y = [ "progress" ]; lualine_y = [ "progress" ];
lualine_z = [ "location" "mode" ]; lualine_z = [ "location" "mode" ];
}; };
}])
];
};
});
fullNeovim = recommendedNeovim.override {
plugins = recommendedNeovim.plugins // (with minimalNeovim.nix2lua; {
lspSaga.settings = {
border_style = "rounded";
symbol_in_winbar.enable = false;
code_action_lightbulb.enable = false;
code_action_keys = { quit = "<Esc>"; };
definition_action_keys = { quit = "<Esc>"; };
rename_action_quit = "<C-c>";
};
lspConfig = {
servers = {
nil_ls = { };
tsserver = { };
eslint = { };
denols = {
root_dir = mkLuaRaw "root_pattern(\"deno.json\", \"deno.jsonc\")";
};
rust_analyzer = {
settings.rust-analyzer = {
"server.path" = "rust-analyzer";
"updates.prompt" = false;
"updates.checkOnStartup" = false;
"checkOnSave.enable" = true;
"checkOnSave.command" = "clippy";
"cargo.autoreload" = true;
};
};
};
};
tabbyml.enable = true;
}); });
}; };
});
packages = { packages = {
# default = recommendedNeovim;
# full = fullNeovim;
minimal = minimalNeovim; minimal = minimalNeovim;
recommended = recommendedNeovim; all = allNeovim;
}; };
in in
{ {

View file

@ -1,7 +0,0 @@
{ lib, substituteAll, ... }:
let
readSubFile = src: params: builtins.readFile
(substituteAll (params // { inherit src; }));
in
lib // { inherit readSubFile substituteAll; }

34
lib/vim.nix Normal file
View file

@ -0,0 +1,34 @@
{ nix2lua }:
with nix2lua.lib;
{
fn.isdirectory = file: call1 "vim.fn.isdirectory" (var file);
cmd.cd = file: call1 "vim.cmd.cd" (var file);
keymap.set = { mode, bind, command, opts ? { } }:
call "vim.keymap.set" [ mode bind command opts ];
/*
Parameters:
- {event} (string|array) Event(s) that will trigger the handler (callback or command).
- {opts} Options dict:
- group (string|integer) optional: autocommand group name or id to match against.
- pattern (string|array) optional: pattern(s) to match literally autocmd-pattern.
- buffer (integer) optional: buffer number for buffer-local autocommands autocmd-buflocal. Cannot be used with {pattern}.
- desc (string) optional: description (for documentation and troubleshooting).
- callback (function|string) optional: Lua function (or Vimscript function name, if string) called when the event(s) is triggered. Lua callback can return a truthy value (not false or nil) to delete the autocommand. Receives a table argument with these keys:
- id: (number) autocommand id
- event: (string) name of the triggered event autocmd-events
- group: (number|nil) autocommand group id, if any
- match: (string) expanded value of <amatch>
- buf: (number) expanded value of <abuf>
- file: (string) expanded value of <afile>
- data: (any) arbitrary data passed from nvim_exec_autocmds()
- command (string) optional: Vim command to execute on event. Cannot be used with {callback}
- once (boolean) optional: defaults to false. Run the autocommand only once autocmd-once.
- nested (boolean) optional: defaults to false. Run nested autocommands autocmd-nested.
*/
api.nvim_create_autocmd = event: opts:
call "vim.api.nvim_create_autocmd" [ event opts ];
}

View file

@ -7,7 +7,7 @@ with nix2lua.lib;
{ {
catppuccin = [ catppuccin = [
(set "vim.g.catppuccin_flavour" flavour) (set "vim.g.catppuccin_flavour" flavour)
(pipe [ (require "catppuccin") (call "setup" [ ]) ]) (pipe1 (require "catppuccin") (call0 "setup"))
(call "vim.cmd" [ "colorscheme catppuccin" ]) (call "vim.cmd" "colorscheme catppuccin")
]; ];
} }

53
modules/git.nix Normal file
View file

@ -0,0 +1,53 @@
{ nix2lua, vim, lib, ... }:
with nix2lua.lib;
{ configs ? { }
, keymaps ? [
{ mode = "n"; bind = "]h"; command = raw "next_hunk"; }
{ mode = "n"; bind = "[h"; command = raw "prev_hunk"; }
{ mode = "n"; bind = "<leader>gs"; command = raw "gs.stage_hunk"; }
{ mode = "n"; bind = "<leader>gr"; command = raw "gs.reset_hunk"; }
{ mode = "n"; bind = "<leader>gu"; command = raw "gs.undo_stage_hunk"; }
{ mode = "n"; bind = "<leader>gp"; command = raw "gs.preview_hunk"; }
{ mode = "n"; bind = "<leader>gb"; command = lambda0 (call "gs.blame_line" { full = true; }); }
{ mode = "n"; bind = "<leader>gd"; command = raw "gs.diffthis"; }
{ mode = "n"; bind = "<leader>gD"; command = lambda0 (call "gs.diffthis" "~"); }
{ mode = "n"; bind = "<leader>gtb"; command = raw "gs.toggle_current_line_blame"; }
{ mode = "n"; bind = "<leader>gtd"; command = raw "gs.toggle_deleted"; }
]
}:
let
bufferedKeymaps = map (args: lib.recursiveUpdate args { opts.buffer = var "bufnr"; }) keymaps;
in
{
gitsigns-nvim = [
(local (func "on_attach" [ "bufnr" ] (
[
(local (set "gs" (var "package.loaded.gitsigns")))
(local (func0 "next_hunk"
(ifelse (var "vim.wo.diff")
(call1 "vim.cmd.normal" [ "]h" (nf "bang" true) ])
(call1 "gs.nav_hunk" "next")
)
))
(local (func0 "prev_hunk"
(ifelse (var "vim.wo.diff")
(call1 "vim.cmd.normal" [ "[h" (nf "bang" true) ])
(call1 "gs.nav_hunk" "prev"))
))
]
++ map vim.keymap.set bufferedKeymaps
)))
(pipe1
(require "gitsigns")
(call "setup" (configs // {
on_attach = var "on_attach";
}))
)
];
}

View file

@ -1,4 +1,4 @@
{ nix2lua, ... }: { nix2lua, vim, ... }:
{ configs ? { } { configs ? { }
, keymaps ? [ , keymaps ? [
@ -8,17 +8,13 @@
}: }:
with nix2lua.lib; with nix2lua.lib;
let let isEmptyVar = name: eq "" (var name); in
vimKeymapSet = { mode, bind, command }: call "vim.keymap.set" [ mode bind command ];
isEmptyVar = name: eq "" (var name);
in
{ {
nvim-web-devicons = true; nvim-web-devicons = true;
nvim-tree-lua = ( nvim-tree-lua = (
[ [
(pipe [ (require "nvim-tree") (call "setup" [ configs ]) ]) (pipe1 (require "nvim-tree") (call "setup" configs))
(local (func "open_nvim_tree" [ "data" ] [ (local (func "open_nvim_tree" [ "data" ] [
# buffer is a [No Name] # buffer is a [No Name]
@ -31,27 +27,24 @@ in
# buffer is a directory # buffer is a directory
(local (set "isDirectory" (local (set "isDirectory"
(eq 1 (var "vim.fn.isdirectory(data.file)")) (eq 1 (vim.fn.isdirectory "data.file"))
)) ))
(if' (not (and (var "isNoNameBuffer") (var "isDirectory"))) [ (if' (not (and (var "isNoNameBuffer") (var "isDirectory")))
return_void return_void
]) )
# change to the directory # change to the directory
(if' (var "isDirectory") [ (if' (var "isDirectory")
(call "vim.cmd.cd" [ (var "data.file") ]) (vim.cmd.cd "data.file")
]) )
# open the tree # open the tree
(pipe [ (require "nvim-tree.api") (call "tree.open" [ ]) ]) (pipe1 (require "nvim-tree.api") (call0 "tree.open"))
])) ]))
(call "vim.api.nvim_create_autocmd" [ (vim.api.nvim_create_autocmd [ "VimEnter" ] { callback = var "open_nvim_tree"; })
[ "VimEnter" ]
{ callback = var "open_nvim_tree"; }
])
] ]
++ (map vimKeymapSet keymaps) ++ (map vim.keymap.set keymaps)
); );
} }

View file

@ -1,4 +1,4 @@
{ nix2lua, pkgs }: { nix2lua, pkgs, ... }:
let let
defaultGrammars = g: [ defaultGrammars = g: [
@ -191,18 +191,18 @@ in
nvim-treesitter = [ nvim-treesitter = [
(local (set "parser_config" (local (set "parser_config"
(pipe [ (require "nvim-treesitter.parsers") (call "get_parser_configs" [ ]) ]) (pipe1 (require "nvim-treesitter.parsers") (call0 "get_parser_configs"))
)) ))
(set "parser_config.d2" { }) (set "parser_config.d2" { })
(pipe [ (pipe1
(require "nvim-treesitter.configs") (require "nvim-treesitter.configs")
(call "setup" [{ (call "setup" {
ensure_installed = { }; ensure_installed = { };
sync_install = false; sync_install = false;
highlight.enable = true; highlight.enable = true;
indent.enable = true; indent.enable = true;
}]) })
]) )
]; ];
} }

View file

@ -31,7 +31,10 @@ let
plugins = mergeAttrs plugins'; plugins = mergeAttrs plugins';
modules = mergeAttrs modules'; modules = mergeAttrs modules';
importModule = moduleName: import (./modules + "/${moduleName}.nix") { inherit nix2lua pkgs; }; vim = import ./lib/vim.nix { inherit nix2lua; };
importModule = moduleName:
import (./modules + "/${moduleName}.nix") { inherit nix2lua pkgs vim lib; };
allModules = mergeAttrs (lib.mapAttrsToList importModule modules); allModules = mergeAttrs (lib.mapAttrsToList importModule modules);
# Type: excludeOverride :: AttrSet -> AttrSet # Type: excludeOverride :: AttrSet -> AttrSet
@ -56,7 +59,7 @@ let
"-- Plugin: ${builtins.trace "Plugin: ${name}" name}\n" "-- Plugin: ${builtins.trace "Plugin: ${name}" name}\n"
+ (if lib.isString cfg then cfg + (if lib.isString cfg then cfg
else if lib.isAttrs cfg && cfg ? _type then toLua cfg else if lib.isAttrs cfg && cfg ? _type then toLua cfg
else if lib.isList cfg then toLua (concatLines cfg) else if lib.isList cfg then toLua (spaceBetween cfg)
else if lib.isBool cfg then "" # Just skip lua config. Only enable the plugin. else if lib.isBool cfg then "" # Just skip lua config. Only enable the plugin.
else abort "[neovim] mkPluginLuaConfig: '${name}' has unsupported type '${builtins.typeOf cfg}'"); else abort "[neovim] mkPluginLuaConfig: '${name}' has unsupported type '${builtins.typeOf cfg}'");
pluginLuaConfigs = lib.mapAttrsToList mkPluginLuaConfig pluginsWithModules; pluginLuaConfigs = lib.mapAttrsToList mkPluginLuaConfig pluginsWithModules;
@ -68,7 +71,11 @@ let
/* /*
Type: mkLuaHeredoc :: string -> string Type: mkLuaHeredoc :: string -> string
*/ */
mkLuaHeredoc = content: lib.concatLines [ "lua << EOF" content "EOF" ]; mkLuaHeredoc = content: ''
lua << EOF
${content}
EOF
'';
/* /*
Type: mkLuaRc :: [string] -> string Type: mkLuaRc :: [string] -> string