1
0
Fork 0
nix-flake-base/languages/typst/default.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
);
}
);
}
);
}