about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAleksana <me@aleksana.moe>2024-05-18 12:44:27 +0800
committerGitHub <noreply@github.com>2024-05-18 12:44:27 +0800
commit419fffedfb9043d5190be155ec53c9cc94cd0a59 (patch)
tree89cf380e01592bb793be06099fec83d3895da5b7
parent951f6c89244bf19969c23996c13be701d546a299 (diff)
parentced6734812dd664e3a9ef870aafc4d5159bde25d (diff)
Merge pull request #295846 from linsui/yazi
nixos/yazi: support plugins and flavors
-rw-r--r--nixos/modules/programs/yazi.nix63
-rw-r--r--pkgs/by-name/ya/yazi-unwrapped/package.nix2
-rw-r--r--pkgs/by-name/ya/yazi/package.nix45
3 files changed, 95 insertions, 15 deletions
diff --git a/nixos/modules/programs/yazi.nix b/nixos/modules/programs/yazi.nix
index 5905f2afb946d..d9f38d8d81185 100644
--- a/nixos/modules/programs/yazi.nix
+++ b/nixos/modules/programs/yazi.nix
@@ -5,7 +5,7 @@ let
 
   settingsFormat = pkgs.formats.toml { };
 
-  names = [ "yazi" "theme" "keymap" ];
+  files = [ "yazi" "theme" "keymap" ];
 in
 {
   options.programs.yazi = {
@@ -15,7 +15,7 @@ in
 
     settings = lib.mkOption {
       type = with lib.types; submodule {
-        options = lib.listToAttrs (map
+        options = (lib.listToAttrs (map
           (name: lib.nameValuePair name (lib.mkOption {
             inherit (settingsFormat) type;
             default = { };
@@ -25,26 +25,65 @@ in
               See https://yazi-rs.github.io/docs/configuration/${name}/ for documentation.
             '';
           }))
-          names);
+          files));
       };
       default = { };
       description = ''
         Configuration included in `$YAZI_CONFIG_HOME`.
       '';
     };
+
+    initLua = lib.mkOption {
+      type = with lib.types; nullOr path;
+      default = null;
+      description = ''
+        The init.lua for Yazi itself.
+      '';
+      example = lib.literalExpression "./init.lua";
+    };
+
+    plugins = lib.mkOption {
+      type = with lib.types; attrsOf (oneOf [ path package ]);
+      default = { };
+      description = ''
+        Lua plugins.
+
+        See https://yazi-rs.github.io/docs/plugins/overview/ for documentation.
+      '';
+      example = lib.literalExpression ''
+        {
+          foo = ./foo;
+          bar = pkgs.bar;
+        }
+      '';
+    };
+
+    flavors = lib.mkOption {
+      type = with lib.types; attrsOf (oneOf [ path package ]);
+      default = { };
+      description = ''
+        Pre-made themes.
+
+        See https://yazi-rs.github.io/docs/flavors/overview/ for documentation.
+      '';
+      example = lib.literalExpression ''
+        {
+          foo = ./foo;
+          bar = pkgs.bar;
+        }
+      '';
+    };
+
   };
 
   config = lib.mkIf cfg.enable {
-    environment = {
-      systemPackages = [ cfg.package ];
-      variables.YAZI_CONFIG_HOME = "/etc/yazi/";
-      etc = lib.attrsets.mergeAttrsList (map
-        (name: lib.optionalAttrs (cfg.settings.${name} != { }) {
-          "yazi/${name}.toml".source = settingsFormat.generate "${name}.toml" cfg.settings.${name};
-        })
-        names);
-    };
+    environment.systemPackages = [
+      (cfg.package.override {
+        inherit (cfg) settings initLua plugins flavors;
+      })
+    ];
   };
+
   meta = {
     maintainers = with lib.maintainers; [ linsui ];
   };
diff --git a/pkgs/by-name/ya/yazi-unwrapped/package.nix b/pkgs/by-name/ya/yazi-unwrapped/package.nix
index d0a0d77ecfec6..77a9b9ad8b5bb 100644
--- a/pkgs/by-name/ya/yazi-unwrapped/package.nix
+++ b/pkgs/by-name/ya/yazi-unwrapped/package.nix
@@ -44,7 +44,7 @@ rustPlatform.buildRustPackage rec {
     description = "Blazing fast terminal file manager written in Rust, based on async I/O";
     homepage = "https://github.com/sxyazi/yazi";
     license = lib.licenses.mit;
-    maintainers = with lib.maintainers; [ xyenon matthiasbeyer ];
+    maintainers = with lib.maintainers; [ xyenon matthiasbeyer linsui ];
     mainProgram = "yazi";
   };
 }
diff --git a/pkgs/by-name/ya/yazi/package.nix b/pkgs/by-name/ya/yazi/package.nix
index 134db023edd96..ee807645c3fd4 100644
--- a/pkgs/by-name/ya/yazi/package.nix
+++ b/pkgs/by-name/ya/yazi/package.nix
@@ -3,6 +3,7 @@
 , makeWrapper
 , yazi-unwrapped
 
+, withRuntimeDeps ? true
 , withFile ? true
 , file
 , withJq ? true
@@ -21,10 +22,16 @@
 , fzf
 , withZoxide ? true
 , zoxide
+, settings ? { }
+, formats
+, plugins ? { }
+, flavors ? { }
+, initLua ? null
 }:
 
 let
-  runtimePaths = with lib; [ ]
+  runtimePaths = with lib;
+    [ ]
     ++ optional withFile file
     ++ optional withJq jq
     ++ optional withPoppler poppler_utils
@@ -34,7 +41,40 @@ let
     ++ optional withRipgrep ripgrep
     ++ optional withFzf fzf
     ++ optional withZoxide zoxide;
+
+  settingsFormat = formats.toml { };
+
+  files = [ "yazi" "theme" "keymap" ];
+
+  configHome = if (settings == { } && initLua == null && plugins == { } && flavors == { }) then null else
+  runCommand "YAZI_CONFIG_HOME" { } ''
+    mkdir -p $out
+    ${lib.concatMapStringsSep
+      "\n"
+      (name: lib.optionalString (settings ? ${name} && settings.${name} != { }) ''
+        ln -s ${settingsFormat.generate "${name}.toml" settings.${name}} $out/${name}.toml
+      '')
+      files}
+
+    mkdir $out/plugins
+    ${lib.optionalString (plugins != { }) ''
+        ${lib.concatMapStringsSep
+        "\n"
+        (lib.mapAttrsToList (name: value: "ln -s ${value} $out/plugins/${name}") plugins)}
+    ''}
+
+    mkdir $out/flavors
+    ${lib.optionalString (flavors != { }) ''
+        ${lib.concatMapStringsSep
+        "\n"
+        (lib.mapAttrsToList (name: value: "ln -s ${value} $out/flavors/${name}") flavors)}
+    ''}
+
+
+    ${lib.optionalString (initLua != null) "ln -s ${initLua} $out/init.lua"}
+  '';
 in
+if (!withRuntimeDeps && configHome == null) then yazi-unwrapped else
 runCommand yazi-unwrapped.name
 {
   inherit (yazi-unwrapped) pname version meta;
@@ -44,5 +84,6 @@ runCommand yazi-unwrapped.name
   mkdir -p $out/bin
   ln -s ${yazi-unwrapped}/share $out/share
   makeWrapper ${yazi-unwrapped}/bin/yazi $out/bin/yazi \
-    --prefix PATH : "${lib.makeBinPath runtimePaths}"
+    ${lib.optionalString withRuntimeDeps "--prefix PATH : \"${lib.makeBinPath runtimePaths}\""} \
+    ${lib.optionalString (configHome != null) "--set YAZI_CONFIG_HOME ${configHome}"}
 ''