1
0
Fork 0
nix-flake-base/editors/helix/default.nix

99 lines
3.1 KiB
Nix

# SPDX-FileCopyrightText: 2025 Ethan Reece <contact@ethanreece.com>
#
# SPDX-License-Identifier: LGPL-3.0-or-later
{ module-name, ... }:
{ flake-parts-lib, lib, ... }:
{
imports = [ ../../base ];
options.perSystem = flake-parts-lib.mkPerSystemOption (
{
config,
pkgs,
system,
...
}:
{
options.editors.${module-name} = {
enable = lib.mkEnableOption "Helix";
# https://github.com/helix-editor/helix/blob/master/languages.toml
# https://helix-editor.vercel.app/reference/formatters
# https://docs.helix-editor.com/lang-support.html
# https://docs.helix-editor.com/languages.html
languages = lib.mkOption {
description = ''
Configuration for Helix `languages.toml`.
'';
# type = types.attrs;
type = lib.types.submodule {
options = {
language = lib.mkOption {
description = ''
`language` in `languages.toml`.
'';
type = lib.types.listOf lib.types.attrs;
default = [ ];
};
language-server = lib.mkOption {
description = ''
`language-server` in `languages.toml`.
'';
type = lib.types.attrs;
default = { };
};
};
};
default = { };
};
};
config =
let
tomlFormatter = pkgs.formats.toml { };
helix = rec {
languages = {
name = "languages.toml";
};
directory = {
name = ".helix";
};
mkHelixDir =
hx-config:
pkgs.linkFarm directory.name [
{
name = languages.name;
path = tomlFormatter.generate languages.name hx-config.languages;
}
];
mkHelixPackage =
hx-config:
let
dir = mkHelixDir hx-config;
in
pkgs.writers.writeNuBin "hx" ''
def --wrapped main [...args] {
let git_root = (^"${pkgs.git}/bin/git" rev-parse --show-toplevel | str trim)
^"${pkgs.uutils-coreutils-noprefix}/bin/ln" -fsn ${dir} $"($git_root)/${directory.name}"
^"${pkgs.helix}/bin/hx" ...$args
rm -rf $"($git_root)/${directory.name}"
}
'';
package = mkHelixPackage config.editors.${module-name};
};
in
{
_module.args.mkHelixPackage = helix.mkHelixPackage;
devshells.default = lib.mkIf config.editors.${module-name}.enable {
commands = [
{
help = " generate Helix grammars";
name = "helix-grammars";
command = "${helix.package}/bin/hx --grammar fetch && hx --grammar build";
category = "󰤀 Helix";
}
];
packages = [ helix.package ];
};
};
}
);
}