{lib, ...}: let inherit (lib) mkOption types; mkPreferenceCmdOption = name: commandDefault: mkOption { type = types.str; description = "The command to start your preferred ${name}."; default = commandDefault; }; mkPreferenceDesktopOption = name: desktopDefault: mkOption { type = types.str; description = "The desktop (application) file for your preferred ${name}."; default = desktopDefault; }; mkPreferenceOptions = name: commandDefault: desktopDefault: { command = mkPreferenceCmdOption name commandDefault; desktop = mkPreferenceDesktopOption name desktopDefault; }; in { options.myOptions.home-manager.preferences = { browser = mkPreferenceOptions "browser" "firefox" "firefox.desktop"; terminalEmulator = mkPreferenceOptions "terminal emulator" "kitty" "kitty.desktop"; textEditor = mkPreferenceOptions "editor" "nvim" "nvim.desktop"; fileManager = mkPreferenceOptions "file manager" "pcmanfm-qt" "pcmanfm-qt.desktop"; imageViewer = mkPreferenceOptions "image viewer" "qimgv" "qimgv.desktop"; mediaPlayer = mkPreferenceOptions "media player" "mpv" "mpv.desktop"; archiveManager = mkPreferenceOptions "archive manager" "ark" "org.kde.ark.desktop"; documentViewer = mkPreferenceOptions "document viewer" "firefox" "firefox.desktop"; # TODO: consider zathura (org.pwmt.zathura.desktop.desktop) emailClient = mkPreferenceOptions "email client" "firefox" "firefox.desktop"; launcher.command = mkPreferenceCmdOption "launcher" "walker"; }; }