helix.drv/flake.nix

122 lines
4.1 KiB
Nix

{
description = "jolheiser helix derivation";
inputs = {
jolheiser.url = "git+https://git.jolheiser.com/nixpkgs.git";
nixpkgs.follows = "jolheiser/nixpkgs";
};
outputs =
{
nixpkgs,
...
}:
let
pkgs = nixpkgs.legacyPackages.x86_64-linux;
tomlFormat = pkgs.formats.toml { };
config = import ./config.nix { pkgs = pkgs; };
buildGrammar =
grammar:
let
source = pkgs.fetchgit {
inherit (grammar) url rev sha256;
};
linkQueries = pkgs.lib.optionalString (builtins.hasAttr "queries" grammar) "cp -r ${source}/${grammar.queries} $out/queries";
in
pkgs.stdenv.mkDerivation {
pname = "helix-tree-sitter-grammar-${grammar.name}";
version = grammar.rev;
buildInputs = [
pkgs.helix
pkgs.git
];
src = source;
dontInstall = true;
buildPhase = ''
runHook preBuild
mkdir .helix
cat << EOF > .helix/languages.toml
use-grammars = { only = ["${grammar.name}"] }
[[grammar]]
name = "${grammar.name}"
source = { git = "${grammar.url}", rev = "${grammar.rev}" }
EOF
mkdir -p runtime/grammars/sources
cp -r ${source} runtime/grammars/sources/${grammar.name}
export CARGO_MANIFEST_DIR=$(pwd)/.helix
#hx -g fetch
hx -g build
mkdir $out
cp runtime/grammars/${grammar.name}.so $out/${grammar.name}.so
${linkQueries}
runHook postBuild
'';
};
builtGrammars = builtins.map (grammar: {
inherit (grammar) name;
artifact = buildGrammar grammar;
}) config.grammars;
ignoreFile = pkgs.writeText "ignore" (builtins.concatStringsSep "\n" config.ignore);
configFile = pkgs.writeText "config.toml" (
builtins.readFile (tomlFormat.generate "helix-config" config.settings)
);
languageFile = pkgs.writeText "languages.toml" (
builtins.readFile (tomlFormat.generate "helix-languages" config.languages)
);
themeFiles = pkgs.lib.mapAttrsToList (name: value: {
inherit name;
file = pkgs.writeText "${name}.toml" (
builtins.readFile (tomlFormat.generate "helix-theme-${name}" value)
);
}) config.themes;
themeLinks = builtins.map (
theme: "ln -s ${theme.file} $out/home/helix/themes/${theme.name}.toml"
) themeFiles;
grammarLinks = builtins.map (
grammar: "ln -s ${grammar.artifact}/${grammar.name}.so $out/lib/runtime/grammars/${grammar.name}.so"
) builtGrammars;
queryLinks = builtins.map (
grammar: "ln -s ${grammar.artifact}/queries $out/lib/runtime/queries/${grammar.name}"
) builtGrammars;
in
{
packages.x86_64-linux.default =
pkgs.runCommand "hx"
{
buildInputs = [ pkgs.makeWrapper ];
}
''
mkdir $out
ln -s ${pkgs.helix}/* $out
rm $out/bin
rm $out/lib
mkdir -p $out/lib/runtime
ln -s ${pkgs.helix}/lib/runtime/* $out/lib/runtime
rm $out/lib/runtime/grammars
mkdir $out/lib/runtime/grammars
ln -s ${pkgs.helix}/lib/runtime/grammars/* $out/lib/runtime/grammars
${builtins.concatStringsSep "\n" grammarLinks}
rm $out/lib/runtime/queries
mkdir $out/lib/runtime/queries
ln -s ${pkgs.helix}/lib/runtime/queries/* $out/lib/runtime/queries
${builtins.concatStringsSep "\n" queryLinks}
mkdir -p $out/home/helix/themes
ln -s ${configFile} $out/home/helix/config.toml
ln -s ${languageFile} $out/home/helix/languages.toml
${builtins.concatStringsSep "\n" themeLinks}
mkdir -p $out/home/git
ln -s ${ignoreFile} $out/home/git/ignore
makeWrapper ${pkgs.helix}/bin/hx $out/bin/hx --set HELIX_RUNTIME $out/lib/runtime --set XDG_CONFIG_HOME $out/home
'';
};
}