{ pkgs, config, lib, ... }: let inherit (lib) mkOption mkEnableOption mkIf maintainers literalExpression types platforms; inherit (lib.hm.assertions) assertPlatform; cfg = config.services.espanso; yaml = pkgs.formats.yaml { }; in { meta.maintainers = with maintainers; [ lucasew ]; options = { services.espanso = { enable = mkEnableOption "Espanso: cross platform text expander in Rust"; package = mkOption { type = types.package; description = "Which espanso package to use"; default = pkgs.espanso; defaultText = literalExpression "pkgs.espanso"; }; settings = mkOption { type = yaml.type; default = { matches = [ ]; }; example = literalExpression '' { matches = [ { # Simple text replacement trigger = ":espanso"; replace = "Hi there!"; } { # Dates trigger = ":date"; replace = "{{mydate}}"; vars = [{ name = "mydate"; type = "date"; params = { format = "%m/%d/%Y"; }; }]; } { # Shell commands trigger = ":shell"; replace = "{{output}}"; vars = [{ name = "output"; type = "shell"; params = { cmd = "echo Hello from your shell"; }; }]; } ]; } ''; description = '' The Espanso configuration to use. See for a description of available options. ''; }; }; }; config = mkIf cfg.enable { assertions = [ (assertPlatform "services.espanso" pkgs platforms.linux) ]; home.packages = [ cfg.package ]; xdg.configFile."espanso/default.yml".source = yaml.generate "espanso-default.yml" cfg.settings; systemd.user.services.espanso = { Unit = { Description = "Espanso: cross platform text expander in Rust"; }; Service = { Type = "exec"; ExecStart = "${cfg.package}/bin/espanso daemon"; Restart = "on-failure"; }; Install = { WantedBy = [ "default.target" ]; }; }; }; }