diff --git a/modules/misc/news.nix b/modules/misc/news.nix index dfa9b81f..1492296e 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -1200,6 +1200,13 @@ in A new module is available: 'programs.qcal'. ''; } + + { + time = "2023-08-23T12:01:06+00:00"; + message = '' + A new module is available: 'programs.yazi'. + ''; + } ]; }; } diff --git a/modules/modules.nix b/modules/modules.nix index 4c82d204..4e0f5635 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -221,6 +221,7 @@ let ./programs/wlogout.nix ./programs/wofi.nix ./programs/xmobar.nix + ./programs/yazi.nix ./programs/yt-dlp.nix ./programs/z-lua.nix ./programs/zathura.nix diff --git a/modules/programs/yazi.nix b/modules/programs/yazi.nix new file mode 100644 index 00000000..bb0f07e4 --- /dev/null +++ b/modules/programs/yazi.nix @@ -0,0 +1,132 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.programs.yazi; + tomlFormat = pkgs.formats.toml { }; + + shellIntegration = '' + function ya() { + tmp="$(mktemp -t "yazi-cwd.XXXXX")" + yazi --cwd-file="$tmp" + if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then + cd -- "$cwd" + fi + rm -f -- "$tmp" + } + ''; +in { + meta.maintainers = [ maintainers.xyenon ]; + + options.programs.yazi = { + enable = mkEnableOption "yazi"; + + package = mkOption { + type = types.package; + default = pkgs.yazi; + defaultText = literalExpression "pkgs.yazi"; + description = "Yazi package to install."; + }; + + enableBashIntegration = mkEnableOption "Bash integration"; + + enableZshIntegration = mkEnableOption "Zsh integration"; + + keymap = mkOption { + type = tomlFormat.type; + default = { }; + example = literalExpression '' + { + input.keymap = [ + { exec = "close"; on = [ "" ]; } + { exec = "close --submit"; on = [ "" ]; } + { exec = "escape"; on = [ "" ]; } + { exec = "backspace"; on = [ "" ]; } + ]; + manager.keymap = [ + { exec = "escape"; on = [ "" ]; } + { exec = "quit"; on = [ "q" ]; } + { exec = "close"; on = [ "" ]; } + ]; + } + ''; + description = '' + Configuration written to + {file}`$XDG_CONFIG_HOME/yazi/keymap.toml`. + + See + for the full list of options. + ''; + }; + + settings = mkOption { + type = tomlFormat.type; + default = { }; + example = literalExpression '' + { + log = { + enabled = false; + }; + manager = { + show_hidden = false; + sort_by = "modified"; + sort_dir_first = true; + sort_reverse = true; + }; + } + ''; + description = '' + Configuration written to + {file}`$XDG_CONFIG_HOME/yazi/yazi.toml`. + + See + for the full list of options. + ''; + }; + + theme = mkOption { + type = tomlFormat.type; + default = { }; + example = literalExpression '' + { + filetype = { + rules = [ + { fg = "#7AD9E5"; mime = "image/*"; } + { fg = "#F3D398"; mime = "video/*"; } + { fg = "#F3D398"; mime = "audio/*"; } + { fg = "#CD9EFC"; mime = "application/x-bzip"; } + ]; + }; + } + ''; + description = '' + Configuration written to + {file}`$XDG_CONFIG_HOME/yazi/theme.toml`. + + See + for the full list of options + ''; + }; + }; + + config = mkIf cfg.enable { + home.packages = [ cfg.package ]; + + programs.bash.initExtra = mkIf cfg.enableBashIntegration shellIntegration; + + programs.zsh.initExtra = mkIf cfg.enableZshIntegration shellIntegration; + + xdg.configFile = { + "yazi/keymap.toml" = mkIf (cfg.keymap != { }) { + source = tomlFormat.generate "yazi-keymap" cfg.keymap; + }; + "yazi/yazi.toml" = mkIf (cfg.settings != { }) { + source = tomlFormat.generate "yazi-settings" cfg.settings; + }; + "yazi/theme.toml" = mkIf (cfg.theme != { }) { + source = tomlFormat.generate "yazi-theme" cfg.theme; + }; + }; + }; +} diff --git a/tests/default.nix b/tests/default.nix index b407f5fb..0aca7a3c 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -143,6 +143,7 @@ import nmt { ./modules/programs/vscode ./modules/programs/watson ./modules/programs/wezterm + ./modules/programs/yazi ./modules/programs/zellij ./modules/programs/zplug ./modules/programs/zsh diff --git a/tests/modules/programs/yazi/bash-integration-enabled.nix b/tests/modules/programs/yazi/bash-integration-enabled.nix new file mode 100644 index 00000000..d54bbb88 --- /dev/null +++ b/tests/modules/programs/yazi/bash-integration-enabled.nix @@ -0,0 +1,27 @@ +{ ... }: + +let + shellIntegration = '' + function ya() { + tmp="$(mktemp -t "yazi-cwd.XXXXX")" + yazi --cwd-file="$tmp" + if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then + cd -- "$cwd" + fi + rm -f -- "$tmp" + } + ''; +in { + programs.bash.enable = true; + + programs.yazi = { + enable = true; + enableBashIntegration = true; + }; + + test.stubs.yazi = { }; + + nmt.script = '' + assertFileContains home-files/.bashrc '${shellIntegration}' + ''; +} diff --git a/tests/modules/programs/yazi/default.nix b/tests/modules/programs/yazi/default.nix new file mode 100644 index 00000000..65104a8b --- /dev/null +++ b/tests/modules/programs/yazi/default.nix @@ -0,0 +1,5 @@ +{ + yazi-settings = ./settings.nix; + yazi-bash-integration-enabled = ./bash-integration-enabled.nix; + yazi-zsh-integration-enabled = ./zsh-integration-enabled.nix; +} diff --git a/tests/modules/programs/yazi/keymap-expected.toml b/tests/modules/programs/yazi/keymap-expected.toml new file mode 100644 index 00000000..6733978a --- /dev/null +++ b/tests/modules/programs/yazi/keymap-expected.toml @@ -0,0 +1,27 @@ +[[input.keymap]] +exec = "close" +on = [""] + +[[input.keymap]] +exec = "close --submit" +on = [""] + +[[input.keymap]] +exec = "escape" +on = [""] + +[[input.keymap]] +exec = "backspace" +on = [""] + +[[manager.keymap]] +exec = "escape" +on = [""] + +[[manager.keymap]] +exec = "quit" +on = ["q"] + +[[manager.keymap]] +exec = "close" +on = [""] diff --git a/tests/modules/programs/yazi/settings-expected.toml b/tests/modules/programs/yazi/settings-expected.toml new file mode 100644 index 00000000..678895c5 --- /dev/null +++ b/tests/modules/programs/yazi/settings-expected.toml @@ -0,0 +1,8 @@ +[log] +enabled = false + +[manager] +show_hidden = false +sort_by = "modified" +sort_dir_first = true +sort_reverse = true diff --git a/tests/modules/programs/yazi/settings.nix b/tests/modules/programs/yazi/settings.nix new file mode 100644 index 00000000..5a540caf --- /dev/null +++ b/tests/modules/programs/yazi/settings.nix @@ -0,0 +1,84 @@ +{ ... }: + +{ + programs.yazi = { + enable = true; + + keymap = { + input.keymap = [ + { + exec = "close"; + on = [ "" ]; + } + { + exec = "close --submit"; + on = [ "" ]; + } + { + exec = "escape"; + on = [ "" ]; + } + { + exec = "backspace"; + on = [ "" ]; + } + ]; + manager.keymap = [ + { + exec = "escape"; + on = [ "" ]; + } + { + exec = "quit"; + on = [ "q" ]; + } + { + exec = "close"; + on = [ "" ]; + } + ]; + }; + settings = { + log = { enabled = false; }; + manager = { + show_hidden = false; + sort_by = "modified"; + sort_dir_first = true; + sort_reverse = true; + }; + }; + theme = { + filetype = { + rules = [ + { + fg = "#7AD9E5"; + mime = "image/*"; + } + { + fg = "#F3D398"; + mime = "video/*"; + } + { + fg = "#F3D398"; + mime = "audio/*"; + } + { + fg = "#CD9EFC"; + mime = "application/x-bzip"; + } + ]; + }; + }; + }; + + test.stubs.yazi = { }; + + nmt.script = '' + assertFileContent home-files/.config/yazi/keymap.toml \ + ${./keymap-expected.toml} + assertFileContent home-files/.config/yazi/yazi.toml \ + ${./settings-expected.toml} + assertFileContent home-files/.config/yazi/theme.toml \ + ${./theme-expected.toml} + ''; +} diff --git a/tests/modules/programs/yazi/theme-expected.toml b/tests/modules/programs/yazi/theme-expected.toml new file mode 100644 index 00000000..cfd1e985 --- /dev/null +++ b/tests/modules/programs/yazi/theme-expected.toml @@ -0,0 +1,15 @@ +[[filetype.rules]] +fg = "#7AD9E5" +mime = "image/*" + +[[filetype.rules]] +fg = "#F3D398" +mime = "video/*" + +[[filetype.rules]] +fg = "#F3D398" +mime = "audio/*" + +[[filetype.rules]] +fg = "#CD9EFC" +mime = "application/x-bzip" diff --git a/tests/modules/programs/yazi/zsh-integration-enabled.nix b/tests/modules/programs/yazi/zsh-integration-enabled.nix new file mode 100644 index 00000000..d27e868a --- /dev/null +++ b/tests/modules/programs/yazi/zsh-integration-enabled.nix @@ -0,0 +1,27 @@ +{ ... }: + +let + shellIntegration = '' + function ya() { + tmp="$(mktemp -t "yazi-cwd.XXXXX")" + yazi --cwd-file="$tmp" + if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then + cd -- "$cwd" + fi + rm -f -- "$tmp" + } + ''; +in { + programs.zsh.enable = true; + + programs.yazi = { + enable = true; + enableBashIntegration = true; + }; + + test.stubs.yazi = { }; + + nmt.script = '' + assertFileContains home-files/.zshrc '${shellIntegration}' + ''; +}