152 lines
4.7 KiB
Nix
152 lines
4.7 KiB
Nix
# SPDX-FileCopyrightText: 2025 Ethan Reece <contact@ethanreece.com>
|
|
#
|
|
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
|
|
{ module-name, ... }:
|
|
{ flake-parts-lib, lib, ... }:
|
|
{
|
|
options.perSystem = flake-parts-lib.mkPerSystemOption (
|
|
{
|
|
config,
|
|
mkHelixPackage,
|
|
nixGLPkgs,
|
|
pkgs,
|
|
...
|
|
}:
|
|
{
|
|
options.languages.${module-name} = {
|
|
enable = lib.mkEnableOption "Typst";
|
|
entrypoints = lib.mkOption {
|
|
description = ''
|
|
Entrypoint files for Typst. Default file for `typst-` commands.
|
|
'';
|
|
type = lib.types.attrsOf lib.types.string;
|
|
default = {
|
|
default = "main.typ";
|
|
};
|
|
};
|
|
fonts = lib.mkOption {
|
|
description = ''
|
|
Fonts package for Typst.
|
|
'';
|
|
type = lib.types.package;
|
|
default = pkgs.buildEnv {
|
|
name = "fonts";
|
|
paths = [ ];
|
|
};
|
|
};
|
|
package = lib.mkOption {
|
|
description = ''
|
|
Package for Typst.
|
|
'';
|
|
type = lib.types.package;
|
|
default = pkgs.typst;
|
|
};
|
|
args = lib.mkOption {
|
|
description = ''
|
|
Args for Typst.
|
|
'';
|
|
type = lib.types.listOf lib.types.string;
|
|
default = [ ];
|
|
};
|
|
};
|
|
config = lib.mkIf config.languages.${module-name}.enable (
|
|
let
|
|
tinymist = {
|
|
url = "127.0.0.1:23635";
|
|
config = {
|
|
command = "${pkgs.tinymist}/bin/tinymist";
|
|
config = {
|
|
preview.background = {
|
|
enabled = true;
|
|
args = [
|
|
"--data-plane-host=${tinymist.url}"
|
|
"--invert-colors=never"
|
|
];
|
|
};
|
|
typstExtraArgs = [
|
|
"--ignore-system-fonts"
|
|
"--font-path"
|
|
"${config.languages.${module-name}.fonts}/share/fonts"
|
|
] ++ config.languages.${module-name}.args;
|
|
};
|
|
};
|
|
};
|
|
in
|
|
{
|
|
languages.en-us.dictionary = [
|
|
"typ"
|
|
"Typst"
|
|
];
|
|
editors.helix.languages = {
|
|
language = [
|
|
{
|
|
name = "typst";
|
|
language-servers =
|
|
[ "tinymist" ]
|
|
++ (lib.optionals config.languages.en-us.enable [
|
|
"harper-ls"
|
|
"typos"
|
|
]);
|
|
formatter = {
|
|
command = "${config.treefmt.build.wrapper}/bin/treefmt";
|
|
args = [
|
|
"--stdin"
|
|
"%{buffer_name}"
|
|
"--quiet"
|
|
];
|
|
};
|
|
auto-format = true;
|
|
}
|
|
];
|
|
language-server.tinymist = {
|
|
command = "${pkgs.tinymist}/bin/tinymist";
|
|
config = tinymist.config;
|
|
};
|
|
};
|
|
treefmt.programs.typstyle.enable = true;
|
|
devshells.default.commands = lib.mkIf config.editors.helix.enable (
|
|
lib.mapAttrsToList (
|
|
name: value:
|
|
let
|
|
tinymist' = tinymist // {
|
|
config = tinymist.config // {
|
|
config = tinymist.config.config // {
|
|
typstExtraArgs = tinymist.config.config.typstExtraArgs ++ [ value ];
|
|
};
|
|
};
|
|
};
|
|
helix' = {
|
|
base = config.editors.helix;
|
|
config = helix'.base // {
|
|
languages = helix'.base.languages // {
|
|
language-server = helix'.base.languages.language-server // {
|
|
tinymist = tinymist'.config;
|
|
};
|
|
};
|
|
};
|
|
package = mkHelixPackage helix'.config;
|
|
};
|
|
in
|
|
{
|
|
help = " launch Typst editing environment for ${name}";
|
|
name = "typst-${name}";
|
|
category = " Typst";
|
|
command = ''
|
|
#!${pkgs.nushell}/bin/nu
|
|
let git_root = (^"${pkgs.git}/bin/git" rev-parse --show-toplevel | str trim)
|
|
let file_path = $"($git_root)/${value}"
|
|
let bg_process = (job spawn {
|
|
^"${nixGLPkgs.nixgl.nixGLMesa}/bin/nixGLMesa" "${pkgs.qutebrowser}/bin/qutebrowser" "${tinymist.url}"
|
|
})
|
|
^"${helix'.package}/bin/hx" $file_path
|
|
job kill $bg_process
|
|
'';
|
|
}
|
|
) config.languages.${module-name}.entrypoints
|
|
);
|
|
}
|
|
);
|
|
}
|
|
);
|
|
}
|