user-config/modules/neovim-config.nix
2023-07-25 14:38:50 +00:00

87 lines
1.9 KiB
Nix

{ pkgs, lib, fromGitHub }: with builtins;
rec
{
mkSettings = s:
concatStringsSep
"\n"
(attrValues
(mapAttrs
(k: v:
if typeOf v == "bool" then
if v then "set ${k}" else "set no${k}"
else
"set ${k}=${toString v}")
s
)
);
boolToString = b: if b then "true" else "false";
toLuaTable = as:
"{" +
( concatStringsSep
", "
( filter
(attr: !isNull attr)
( attrValues
( mapAttrs
(k: v: if v then "${k}=true" else null)
as
)
)
)
) +
"}";
mkMapping = {
mode,
binding,
command,
nowait?false,
silent?false,
unique?false,
expr?false
}:
"vim.api.nvim_set_keymap(${toJSON mode}, ${toJSON binding}, ${toJSON command}, ${toLuaTable {inherit nowait silent unique expr;}})";
mkMappings =
m:
"lua << END-OF-KEYBINDS\n" +
(concatStringsSep "\n" (map mkMapping m)) +
"\nEND-OF-KEYBINDS";
mkRuntimes = rs:
if rs == [] then "" else
"set runtimepath+=" +
( concatStringsSep
","
(map (rt: "${rt}") rs)
);
mkVimHeader = h: "\"\"\"\"\"\"\"\" ${h} \"\"\"\"\"\"\"\"\"";
mkVimSection = section:
(concatStringsSep "\n\n\n"
(filter
(v: !isNull v)
(attrValues
(mapAttrs
(k: v: if "" == v then null else (mkVimHeader k) + "\n" + v)
section
)
)
)
);
mkVimSections = sections: concatStringsSep "\n\n\n" (map mkVimSection sections);
mkConfig = { settings?{}, mappings?[], runtimes?[], extra?"" }:
mkVimSections [
{"ADDITIONAL RUNTIME DIRS" = mkRuntimes runtimes;}
{"SETTINGS" = mkSettings settings;}
{"KEY BINGINGS" = mkMappings mappings;}
{"MANUAL SETTINGS" = extra;}
];
# Via https://gist.github.com/nat-418/d76586da7a5d113ab90578ed56069509
fromGitHub = ref: repo: pkgs.vimUtils.buildVimPluginFrom2Nix {
pname = "${lib.strings.sanitizeDerivationName repo}";
version = ref;
src = builtins.fetchGit {
url = "https://github.com/${repo}.git";
ref = ref;
};
};
}