dotfiles/modules/programs/nvim/default.nix

253 lines
7.0 KiB
Nix
Raw Normal View History

2022-07-15 13:11:54 +02:00
{ config
, lib
, pkgs
, ...
}:
with lib;
let
cfg = config.my.programs.nvim;
2023-06-10 21:52:57 +02:00
boolToString = bool: if bool then "true" else "false";
quote = str: ''"${toString str}"'';
id = x: x;
listToString = sep: f: list: ''{ ${concatStringsSep sep (map f list)} }'';
listToStringOneLine = listToString ", ";
listToStringMultiLine = listToString ",\n";
2023-06-10 21:52:57 +02:00
keybinding =
{ key
, cmd
, func
, mode
, desc
}:
let
2023-06-10 21:52:57 +02:00
cmdString =
if cmd != null
then quote cmd
else
(
if func != null
then func
else abort "Either cmd or function must be set"
);
in
2023-06-10 21:52:57 +02:00
''{ ${quote key}, ${cmdString}, mode = ${quote mode}, ${optionalString (desc != null) "desc = ${quote desc},"} }'';
lazySpecFromPlugin =
{ plugin
, dependencies
, init
, conf
, lazy
, event
, enabled
, cmd
, ft
, priority
, keys
}:
listToStringMultiLine id
([
"dir = ${quote plugin}"
"name = ${quote (getName plugin)}"
]
++ (optional (!lazy) "lazy = ${boolToString lazy}")
++ (optional (!enabled) "enabled = ${boolToString enabled}")
++ (optional (dependencies != [ ]) "dependencies = ${listToStringMultiLine id (map lazySpecFromPlugin dependencies)}")
++ (optional (init != null) "init = function(plugin)\n${toString init}\nend")
++ (optional (conf != null) "config = function(plugin, opts)\n${toString conf}\nend")
++ (optional (keys != [ ]) "keys = ${listToStringMultiLine id (map keybinding keys)}")
++ (optional (event != [ ]) "event = ${listToStringOneLine quote event}")
++ (optional (cmd != [ ]) "cmd = ${listToStringOneLine quote cmd}")
++ (optional (ft != [ ]) "ft = ${listToStringOneLine quote ft}")
++ (optional (priority != 50) "priority = ${toString priority}")
);
lazySpecs = listToStringMultiLine id (map lazySpecFromPlugin cfg.plugins);
2023-06-10 21:52:57 +02:00
lazy = ''
require("lazy").setup({
${lazySpecs}
})
'';
2022-07-15 13:11:54 +02:00
in
{
2023-06-10 21:52:57 +02:00
imports = [ ./plugins ];
options.my.programs.nvim = {
enable = mkEnableOption "nvim";
plugins = mkOption {
default = [ ];
description = ''
List of plugins with config.
'';
type = with types; listOf (
let
sub = submodule {
options = {
conf = mkOption {
type = nullOr str;
default = null;
description = ''
Lua code to be executed when the plugin is loaded.
'';
};
dependencies = mkOption {
type = listOf sub;
default = [ ];
description = ''
List of plugins this plugin depends on.
'';
};
init = mkOption {
type = nullOr str;
default = null;
description = ''
Lua code to be executed when the plugin is initialized.
'';
};
event = mkOption {
type = listOf str;
default = [ ];
description = ''
Event to load the plugin on.
'';
};
lazy = mkOption {
type = bool;
default = true;
2023-06-10 21:52:57 +02:00
description = ''
Whether to load the plugin lazily.
'';
};
plugin = mkOption {
type = package;
description = ''
The plugin package.
'';
};
enabled = mkOption {
type = bool;
default = true;
description = ''
Whether to enable the plugin.
'';
};
cmd = mkOption {
type = listOf str;
default = [ ];
description = ''
Command to load the plugin.
'';
};
ft = mkOption {
type = listOf str;
default = [ ];
description = ''
Filetype to load the plugin on.
'';
};
priority = mkOption {
type = int;
default = 50;
description = ''
Priority to load the plugin.
'';
};
keys = mkOption {
default = [ ];
description = ''
List of keybindings.
'';
type = listOf (submodule {
options = {
key = mkOption {
type = str;
description = ''
Key to bind.
'';
};
cmd = mkOption {
type = nullOr str;
default = null;
description = ''
Command to execute.
'';
};
func = mkOption {
type = nullOr str;
default = null;
description = ''
Function to execute.
'';
};
mode = mkOption {
type = str;
default = "n";
description = ''
Mode to bind the key in.
'';
};
desc = mkOption {
type = nullOr str;
default = null;
description = ''
Description of the keybinding.
'';
};
};
});
};
};
};
in
sub
);
};
};
2022-07-15 13:11:54 +02:00
config = mkIf cfg.enable {
2023-03-02 09:13:46 +01:00
home-manager.users.moritz = {
home.packages = with pkgs; [
(
if config.my.programs.hyprland.enable
then neovide-hyprland
else neovide
)
2023-02-16 18:03:55 +01:00
];
2023-03-02 09:13:46 +01:00
programs.neovim = {
enable = true;
package = pkgs.neovim-nightly;
vimAlias = true;
vimdiffAlias = true;
withNodeJs = true;
withPython3 = true;
2023-06-10 21:52:57 +02:00
extraLuaConfig = lib.concatLines [ (builtins.readFile ./options.lua) lazy ];
2023-03-02 09:13:46 +01:00
extraPackages = with pkgs; [
alejandra
black
2023-04-10 01:05:25 +02:00
deadnix
2023-03-02 09:13:46 +01:00
isort
2023-03-02 09:14:27 +01:00
jq
2023-03-02 09:13:46 +01:00
nil
nixpkgs-fmt
2023-03-13 09:07:50 +01:00
nodePackages.bash-language-server
2023-04-10 01:05:25 +02:00
nodePackages.cspell
2023-03-02 09:13:46 +01:00
rustfmt
2023-03-13 09:07:50 +01:00
shellcheck
2023-03-02 09:13:46 +01:00
shfmt
2023-04-10 01:05:25 +02:00
statix
2023-03-02 09:13:46 +01:00
stylua
sumneko-lua-language-server
taplo
2023-06-25 11:15:08 +02:00
typst
typst-lsp
2023-03-02 09:13:46 +01:00
yamlfmt
];
plugins = [
pkgs.vimPlugins.lazy-nvim
2023-06-10 21:52:57 +02:00
];
2023-03-02 09:13:46 +01:00
};
2022-07-15 13:11:54 +02:00
};
};
}