Apply nixfmt on many files

This commit is contained in:
Robert Helgesson 2020-02-02 00:39:17 +01:00
parent 9799d3de2d
commit 45abf3d38a
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89
177 changed files with 2850 additions and 3565 deletions

View file

@ -1,13 +1,10 @@
{ pkgs ? import <nixpkgs> { } }: { pkgs ? import <nixpkgs> { } }:
rec { rec {
home-manager = pkgs.callPackage ./home-manager { home-manager = pkgs.callPackage ./home-manager { path = toString ./.; };
path = toString ./.;
};
install = pkgs.callPackage ./home-manager/install.nix { install =
inherit home-manager; pkgs.callPackage ./home-manager/install.nix { inherit home-manager; };
};
nixos = import ./nixos; nixos = import ./nixos;
} }

View file

@ -1,8 +1,6 @@
{ {
# Note, this should be "the standard library" + HM extensions. # Note, this should be "the standard library" + HM extensions.
lib lib, pkgs }:
, pkgs
}:
let let
@ -19,23 +17,19 @@ let
# Make sure the used package is scrubbed to avoid actually # Make sure the used package is scrubbed to avoid actually
# instantiating derivations. # instantiating derivations.
scrubbedPkgsModule = { scrubbedPkgsModule = {
imports = [ imports = [{
{
_module.args = { _module.args = {
pkgs = lib.mkForce (nmd.scrubDerivations "pkgs" pkgs); pkgs = lib.mkForce (nmd.scrubDerivations "pkgs" pkgs);
pkgs_i686 = lib.mkForce { }; pkgs_i686 = lib.mkForce { };
}; };
} }];
];
}; };
hmModulesDocs = nmd.buildModulesDocs { hmModulesDocs = nmd.buildModulesDocs {
modules = modules = import ../modules/modules.nix {
import ../modules/modules.nix {
inherit lib pkgs; inherit lib pkgs;
check = false; check = false;
} } ++ [ scrubbedPkgsModule ];
++ [ scrubbedPkgsModule ];
moduleRootPaths = [ ./.. ]; moduleRootPaths = [ ./.. ];
mkModuleUrl = path: mkModuleUrl = path:
"https://github.com/rycee/home-manager/blob/master/${path}#blob-path"; "https://github.com/rycee/home-manager/blob/master/${path}#blob-path";
@ -58,9 +52,7 @@ let
''; '';
}; };
in in {
{
inherit nmdSrc; inherit nmdSrc;
options = { options = {
@ -71,7 +63,5 @@ in
manPages = docs.manPages; manPages = docs.manPages;
manual = { manual = { inherit (docs) html htmlOpenTool; };
inherit (docs) html htmlOpenTool;
};
} }

View file

@ -1,8 +1,6 @@
{ home-manager, runCommand }: { home-manager, runCommand }:
runCommand runCommand "home-manager-install" {
"home-manager-install"
{
propagatedBuildInputs = [ home-manager ]; propagatedBuildInputs = [ home-manager ];
preferLocalBuild = true; preferLocalBuild = true;
allowSubstitutes = false; allowSubstitutes = false;
@ -63,8 +61,7 @@ runCommand
exit 1 exit 1
fi fi
''; '';
} } ''
''
echo This derivation is not buildable, instead run it using nix-shell. echo This derivation is not buildable, instead run it using nix-shell.
exit 1 exit 1
'' ''

View file

@ -16,10 +16,8 @@ rec {
emptyDag = { }; emptyDag = { };
isDag = dag: isDag = dag:
let let isEntry = e: (e ? data) && (e ? after) && (e ? before);
isEntry = e: (e ? data) && (e ? after) && (e ? before); in builtins.isAttrs dag && all (x: x) (mapAttrsToList (n: isEntry) dag);
in
builtins.isAttrs dag && all (x: x) (mapAttrsToList (n: isEntry) dag);
# Takes an attribute set containing entries built by # Takes an attribute set containing entries built by
# dagEntryAnywhere, dagEntryAfter, and dagEntryBefore to a # dagEntryAnywhere, dagEntryAfter, and dagEntryBefore to a
@ -80,21 +78,18 @@ rec {
dagTopoSort = dag: dagTopoSort = dag:
let let
dagBefore = dag: name: dagBefore = dag: name:
mapAttrsToList (n: v: n) ( mapAttrsToList (n: v: n)
filterAttrs (n: v: any (a: a == name) v.before) dag (filterAttrs (n: v: any (a: a == name) v.before) dag);
); normalizedDag = mapAttrs (n: v: {
normalizedDag =
mapAttrs (n: v: {
name = n; name = n;
data = v.data; data = v.data;
after = v.after ++ dagBefore dag n; after = v.after ++ dagBefore dag n;
}) dag; }) dag;
before = a: b: any (c: a.name == c) b.after; before = a: b: any (c: a.name == c) b.after;
sorted = toposort before (mapAttrsToList (n: v: v) normalizedDag); sorted = toposort before (mapAttrsToList (n: v: v) normalizedDag);
in in if sorted ? result then {
if sorted ? result then result = map (v: { inherit (v) name data; }) sorted.result;
{ result = map (v: { inherit (v) name data; }) sorted.result; } } else
else
sorted; sorted;
# Applies a function to each element of the given DAG. # Applies a function to each element of the given DAG.
@ -107,9 +102,7 @@ rec {
after = [ ]; after = [ ];
}; };
dagEntryBetween = before: after: data: { dagEntryBetween = before: after: data: { inherit data before after; };
inherit data before after;
};
dagEntryAfter = after: data: { dagEntryAfter = after: data: {
inherit data after; inherit data after;

View file

@ -2,7 +2,7 @@
rec { rec {
# Produces a Bourne shell like variable export statement. # Produces a Bourne shell like variable export statement.
export = n: v: "export ${n}=\"${toString v}\""; export = n: v: ''export ${n}="${toString v}"'';
# Given an attribute set containing shell variable names and their # Given an attribute set containing shell variable names and their
# assignment, this function produces a string containing an export # assignment, this function produces a string containing an export

View file

@ -3,9 +3,5 @@
nixpkgsLib: nixpkgsLib:
let let mkHmLib = import ./.;
mkHmLib = import ./.; in nixpkgsLib.extend (self: super: { hm = mkHmLib { lib = super; }; })
in
nixpkgsLib.extend (self: super: {
hm = mkHmLib { lib = super; };
})

View file

@ -9,19 +9,14 @@ with lib;
# All characters that are considered safe. Note "-" is not # All characters that are considered safe. Note "-" is not
# included to avoid "-" followed by digit being interpreted as a # included to avoid "-" followed by digit being interpreted as a
# version. # version.
safeChars = safeChars = [ "+" "." "_" "?" "=" ] ++ lowerChars ++ upperChars
[ "+" "." "_" "?" "=" ]
++ lowerChars
++ upperChars
++ stringToCharacters "0123456789"; ++ stringToCharacters "0123456789";
empties = l: genList (x: "") (length l); empties = l: genList (x: "") (length l);
unsafeInName = stringToCharacters ( unsafeInName =
replaceStrings safeChars (empties safeChars) path stringToCharacters (replaceStrings safeChars (empties safeChars) path);
);
safeName = replaceStrings unsafeInName (empties unsafeInName) path; safeName = replaceStrings unsafeInName (empties unsafeInName) path;
in in "hm_" + safeName;
"hm_" + safeName;
} }

View file

@ -6,7 +6,8 @@ let
isDagEntry = e: isAttrs e && (e ? data) && (e ? after) && (e ? before); isDagEntry = e: isAttrs e && (e ? data) && (e ? after) && (e ? before);
dagContentType = elemType: types.submodule { dagContentType = elemType:
types.submodule {
options = { options = {
data = mkOption { type = elemType; }; data = mkOption { type = elemType; };
after = mkOption { type = with types; uniq (listOf str); }; after = mkOption { type = with types; uniq (listOf str); };
@ -14,24 +15,16 @@ let
}; };
}; };
in in {
{
# A directed acyclic graph of some inner type. # A directed acyclic graph of some inner type.
dagOf = elemType: dagOf = elemType:
let let
convertAllToDags = convertAllToDags = let
let maybeConvert = n: v: if isDagEntry v then v else dag.entryAnywhere v;
maybeConvert = n: v: in map (def: def // { value = mapAttrs maybeConvert def.value; });
if isDagEntry v
then v
else dag.entryAnywhere v;
in
map (def: def // { value = mapAttrs maybeConvert def.value; });
attrEquivalent = types.attrsOf (dagContentType elemType); attrEquivalent = types.attrsOf (dagContentType elemType);
in in mkOptionType rec {
mkOptionType rec {
name = "dagOf"; name = "dagOf";
description = "DAG of ${elemType.description}s"; description = "DAG of ${elemType.description}s";
check = isAttrs; check = isAttrs;
@ -55,35 +48,30 @@ in
listOrDagOf = elemType: listOrDagOf = elemType:
let let
paddedIndexStr = list: i: paddedIndexStr = list: i:
let let padWidth = stringLength (toString (length list));
padWidth = stringLength (toString (length list)); in fixedWidthNumber padWidth i;
in
fixedWidthNumber padWidth i;
convertAllToDags = defs: convertAllToDags = defs:
let let
convertAttrValue = n: v: convertAttrValue = n: v:
if isDagEntry v then v if isDagEntry v then v else dag.entryAnywhere v;
else dag.entryAnywhere v;
convertListValue = namePrefix: vs: convertListValue = namePrefix: vs:
let let
pad = paddedIndexStr vs; pad = paddedIndexStr vs;
makeEntry = i: v: makeEntry = i: v:
nameValuePair "${namePrefix}.${pad i}" (dag.entryAnywhere v); nameValuePair "${namePrefix}.${pad i}" (dag.entryAnywhere v);
in in listToAttrs (imap1 makeEntry vs);
listToAttrs (imap1 makeEntry vs);
convertValue = i: value: convertValue = i: value:
if isList value if isList value then
then convertListValue "unnamed-${paddedIndexStr defs i}" value convertListValue "unnamed-${paddedIndexStr defs i}" value
else mapAttrs convertAttrValue value; else
in mapAttrs convertAttrValue value;
imap1 (i: def: def // { value = convertValue i def.value; }) defs; in imap1 (i: def: def // { value = convertValue i def.value; }) defs;
attrEquivalent = types.attrsOf (dagContentType elemType); attrEquivalent = types.attrsOf (dagContentType elemType);
in in mkOptionType rec {
mkOptionType rec {
name = "dagOf"; name = "dagOf";
description = "DAG of ${elemType.description}s"; description = "DAG of ${elemType.description}s";
check = x: isAttrs x || isList x; check = x: isAttrs x || isList x;

View file

@ -2,13 +2,15 @@
rec { rec {
# Produces a Zsh shell like value # Produces a Zsh shell like value
toZshValue = v: if builtins.isBool v then toZshValue = v:
if builtins.isBool v then
if v then "true" else "false" if v then "true" else "false"
else if builtins.isString v then else if builtins.isString v then
"\"${v}\"" ''"${v}"''
else if builtins.isList v then else if builtins.isList v then
"(${lib.concatStringsSep " " (map toZshValue v)})" "(${lib.concatStringsSep " " (map toZshValue v)})"
else "\"${toString v}\""; else
''"${toString v}"'';
# Produces a Zsh shell like definition statement # Produces a Zsh shell like definition statement
define = n: v: "${n}=${toZshValue v}"; define = n: v: "${n}=${toZshValue v}";

View file

@ -8,15 +8,15 @@ let
profileDirectory = config.home.profileDirectory; profileDirectory = config.home.profileDirectory;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
imports = [ imports = [
(mkRenamedOptionModule (mkRenamedOptionModule [ "fonts" "fontconfig" "enableProfileFonts" ] [
[ "fonts" "fontconfig" "enableProfileFonts" ] "fonts"
[ "fonts" "fontconfig" "enable" ]) "fontconfig"
"enable"
])
]; ];
options = { options = {

View file

@ -6,12 +6,8 @@ let
cfg = config.xsession.numlock; cfg = config.xsession.numlock;
in in {
options = { xsession.numlock.enable = mkEnableOption "Num Lock"; };
{
options = {
xsession.numlock.enable = mkEnableOption "Num Lock";
};
config = mkIf cfg.enable { config = mkIf cfg.enable {
systemd.user.services.numlockx = { systemd.user.services.numlockx = {
@ -27,9 +23,7 @@ in
ExecStart = "${pkgs.numlockx}/bin/numlockx"; ExecStart = "${pkgs.numlockx}/bin/numlockx";
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
}; };
}; };
} }

View file

@ -6,9 +6,7 @@ let
vars = config.pam.sessionVariables; vars = config.pam.sessionVariables;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
@ -28,9 +26,7 @@ in
}; };
config = mkIf (vars != { }) { config = mkIf (vars != { }) {
home.file.".pam_environment".text = home.file.".pam_environment".text = concatStringsSep "\n"
concatStringsSep "\n" ( (mapAttrsToList (n: v: ''${n} OVERRIDE="${toString v}"'') vars) + "\n";
mapAttrsToList (n: v: "${n} OVERRIDE=\"${toString v}\"") vars
) + "\n";
}; };
} }

View file

@ -6,19 +6,13 @@ let
cfg = config.qt; cfg = config.qt;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
imports = [ imports = [
(mkChangedOptionModule (mkChangedOptionModule [ "qt" "useGtkTheme" ] [ "qt" "platformTheme" ]
[ "qt" "useGtkTheme" ]
[ "qt" "platformTheme" ]
(config: (config:
if getAttrFromPath [ "qt" "useGtkTheme" ] config if getAttrFromPath [ "qt" "useGtkTheme" ] config then "gtk" else null))
then "gtk"
else null))
]; ];
options = { options = {
@ -29,10 +23,8 @@ in
type = types.nullOr (types.enum [ "gtk" "gnome" ]); type = types.nullOr (types.enum [ "gtk" "gnome" ]);
default = null; default = null;
example = "gnome"; example = "gnome";
relatedPackages = [ relatedPackages =
"qgnomeplatform" [ "qgnomeplatform" [ "libsForQt5" "qtstyleplugins" ] ];
["libsForQt5" "qtstyleplugins"]
];
description = '' description = ''
Selects the platform theme to use for Qt applications.</para> Selects the platform theme to use for Qt applications.</para>
<para>The options are <para>The options are
@ -59,10 +51,10 @@ in
home.sessionVariables.QT_QPA_PLATFORMTHEME = home.sessionVariables.QT_QPA_PLATFORMTHEME =
if cfg.platformTheme == "gnome" then "gnome" else "gtk2"; if cfg.platformTheme == "gnome" then "gnome" else "gtk2";
home.packages = home.packages = if cfg.platformTheme == "gnome" then
if cfg.platformTheme == "gnome" [ pkgs.qgnomeplatform ]
then [ pkgs.qgnomeplatform ] else
else [ pkgs.libsForQt5.qtstyleplugins ]; [ pkgs.libsForQt5.qtstyleplugins ];
xsession.importedVariables = [ "QT_QPA_PLATFORMTHEME" ]; xsession.importedVariables = [ "QT_QPA_PLATFORMTHEME" ];

View file

@ -9,9 +9,7 @@ let
strListOrSingleton = with types; strListOrSingleton = with types;
coercedTo (either (listOf str) str) toList (listOf str); coercedTo (either (listOf str) str) toList (listOf str);
in in {
{
meta.maintainers = with maintainers; [ pacien ]; meta.maintainers = with maintainers; [ pacien ];
options.xdg.mimeApps = { options.xdg.mimeApps = {
@ -80,10 +78,8 @@ in
config.xdg.configFile."mimeapps.list".source; config.xdg.configFile."mimeapps.list".source;
xdg.configFile."mimeapps.list".text = xdg.configFile."mimeapps.list".text =
let let joinValues = mapAttrs (n: concatStringsSep ";");
joinValues = mapAttrs (n: concatStringsSep ";"); in generators.toINI { } {
in
generators.toINI {} {
"Added Associations" = joinValues cfg.associations.added; "Added Associations" = joinValues cfg.associations.added;
"Removed Associations" = joinValues cfg.associations.removed; "Removed Associations" = joinValues cfg.associations.removed;
"Default Applications" = joinValues cfg.defaultApplications; "Default Applications" = joinValues cfg.defaultApplications;

View file

@ -6,9 +6,7 @@ let
cfg = config.xdg.mime; cfg = config.xdg.mime;
in in {
{
options = { options = {
xdg.mime.enable = mkOption { xdg.mime.enable = mkOption {
type = types.bool; type = types.bool;

View file

@ -6,15 +6,15 @@ let
cfg = config.xdg.userDirs; cfg = config.xdg.userDirs;
in in {
{
meta.maintainers = with maintainers; [ pacien ]; meta.maintainers = with maintainers; [ pacien ];
imports = [ imports = [
(mkRenamedOptionModule (mkRenamedOptionModule [ "xdg" "userDirs" "publishShare" ] [
[ "xdg" "userDirs" "publishShare" ] "xdg"
[ "xdg" "userDirs" "publicShare" ]) "userDirs"
"publicShare"
])
]; ];
options.xdg.userDirs = { options.xdg.userDirs = {
@ -89,8 +89,7 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
xdg.configFile."user-dirs.dirs".text = generators.toKeyValue {} ( xdg.configFile."user-dirs.dirs".text = generators.toKeyValue { } ({
{
XDG_DESKTOP_DIR = cfg.desktop; XDG_DESKTOP_DIR = cfg.desktop;
XDG_DOCUMENTS_DIR = cfg.documents; XDG_DOCUMENTS_DIR = cfg.documents;
XDG_DOWNLOAD_DIR = cfg.download; XDG_DOWNLOAD_DIR = cfg.download;
@ -99,8 +98,6 @@ in
XDG_PUBLICSHARE_DIR = cfg.publicShare; XDG_PUBLICSHARE_DIR = cfg.publicShare;
XDG_TEMPLATES_DIR = cfg.templates; XDG_TEMPLATES_DIR = cfg.templates;
XDG_VIDEOS_DIR = cfg.videos; XDG_VIDEOS_DIR = cfg.videos;
} } // cfg.extraConfig);
// cfg.extraConfig
);
}; };
} }

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.alacritty; cfg = config.programs.alacritty;
in in {
{
options = { options = {
programs.alacritty = { programs.alacritty = {
enable = mkEnableOption "Alacritty"; enable = mkEnableOption "Alacritty";
@ -46,7 +44,8 @@ in
home.packages = [ pkgs.alacritty ]; home.packages = [ pkgs.alacritty ];
xdg.configFile."alacritty/alacritty.yml" = mkIf (cfg.settings != { }) { xdg.configFile."alacritty/alacritty.yml" = mkIf (cfg.settings != { }) {
text = replaceStrings ["\\\\"] ["\\"] (builtins.toJSON cfg.settings); text =
replaceStrings [ "\\\\" ] [ "\\" ] (builtins.toJSON cfg.settings);
}; };
}) })
]; ];

View file

@ -18,12 +18,10 @@ with lib;
type = types.attrsOf types.str; type = types.attrsOf types.str;
default = { default = {
type = "shellcommand"; type = "shellcommand";
command = "'${pkgs.notmuch}/bin/notmuch address --format=json --output=recipients date:6M..'"; command =
regexp = "'${pkgs.notmuch}/bin/notmuch address --format=json --output=recipients date:6M..'";
"'\\[?{" regexp = "'\\[?{" + ''
+ ''"name": "(?P<name>.*)", '' "name": "(?P<name>.*)", "address": "(?P<email>.+)", "name-addr": ".*"''
+ ''"address": "(?P<email>.+)", ''
+ ''"name-addr": ".*"''
+ "}[,\\]]?'"; + "}[,\\]]?'";
shellcommand_external_filtering = "False"; shellcommand_external_filtering = "False";
}; };
@ -52,10 +50,9 @@ with lib;
}; };
config = mkIf config.notmuch.enable { config = mkIf config.notmuch.enable {
alot.sendMailCommand = mkOptionDefault ( alot.sendMailCommand = mkOptionDefault (if config.msmtp.enable then
if config.msmtp.enable "msmtpq --read-envelope-from --read-recipients"
then "msmtpq --read-envelope-from --read-recipients" else
else null null);
);
}; };
} }

View file

@ -26,8 +26,7 @@ with lib;
}; };
config = mkIf config.notmuch.enable { config = mkIf config.notmuch.enable {
astroid.sendMailCommand = mkIf config.msmtp.enable ( astroid.sendMailCommand = mkIf config.msmtp.enable
mkOptionDefault "msmtpq --read-envelope-from --read-recipients" (mkOptionDefault "msmtpq --read-envelope-from --read-recipients");
);
}; };
} }

View file

@ -8,13 +8,13 @@ let
cfg = config.programs.astroid; cfg = config.programs.astroid;
astroidAccounts = astroidAccounts =
filterAttrs filterAttrs (n: v: v.astroid.enable) config.accounts.email.accounts;
(n: v: v.astroid.enable)
config.accounts.email.accounts;
boolOpt = b: if b then "true" else "false"; boolOpt = b: if b then "true" else "false";
accountAttr = account: with account; { accountAttr = account:
with account;
{
email = address; email = address;
name = realName; name = realName;
sendmail = astroid.sendMailCommand; sendmail = astroid.sendMailCommand;
@ -24,19 +24,16 @@ let
save_sent = "true"; save_sent = "true";
save_sent_to = "${maildir.absPath}/${folders.sent}"; save_sent_to = "${maildir.absPath}/${folders.sent}";
select_query = ""; select_query = "";
} } // optionalAttrs (signature.showSignature != "none") {
// optionalAttrs (signature.showSignature != "none") {
signature_attach = boolOpt (signature.showSignature == "attach"); signature_attach = boolOpt (signature.showSignature == "attach");
signature_default_on = boolOpt (signature.showSignature != "none"); signature_default_on = boolOpt (signature.showSignature != "none");
signature_file = pkgs.writeText "signature.txt" signature.text; signature_file = pkgs.writeText "signature.txt" signature.text;
signature_file_markdown = "false"; signature_file_markdown = "false";
signature_separate = "true"; # prepends '--\n' to the signature signature_separate = "true"; # prepends '--\n' to the signature
} } // optionalAttrs (gpg != null) {
// optionalAttrs (gpg != null) {
always_gpg_sign = boolOpt gpg.signByDefault; always_gpg_sign = boolOpt gpg.signByDefault;
gpgkey = gpg.key; gpgkey = gpg.key;
} } // astroid.extraConfig;
// astroid.extraConfig;
# See https://github.com/astroidmail/astroid/wiki/Configuration-Reference # See https://github.com/astroidmail/astroid/wiki/Configuration-Reference
configFile = mailAccounts: configFile = mailAccounts:
@ -51,12 +48,9 @@ let
cfg.extraConfig cfg.extraConfig
cfg.externalEditor cfg.externalEditor
]; ];
in in builtins.toJSON astroidConfig;
builtins.toJSON astroidConfig;
in in {
{
options = { options = {
programs.astroid = { programs.astroid = {
enable = mkEnableOption "Astroid"; enable = mkEnableOption "Astroid";
@ -81,7 +75,8 @@ in
"cmd" = cmd; "cmd" = cmd;
}; };
}; };
example = "nvim-qt -- -c 'set ft=mail' '+set fileencoding=utf-8' '+set ff=unix' '+set enc=utf-8' '+set fo+=w' %1"; example =
"nvim-qt -- -c 'set ft=mail' '+set fileencoding=utf-8' '+set ff=unix' '+set enc=utf-8' '+set fo+=w' %1";
description = '' description = ''
You can use <code>%1</code>, <code>%2</code>, and You can use <code>%1</code>, <code>%2</code>, and
<code>%3</code> to refer respectively to: <code>%3</code> to refer respectively to:
@ -108,14 +103,11 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.astroid ]; home.packages = [ pkgs.astroid ];
xdg.configFile."astroid/config".source = xdg.configFile."astroid/config".source = pkgs.runCommand "out.json" {
pkgs.runCommand "out.json"
{
json = configFile astroidAccounts; json = configFile astroidAccounts;
preferLocalBuild = true; preferLocalBuild = true;
allowSubstitutes = false; allowSubstitutes = false;
} } ''
''
echo -n "$json" | ${pkgs.jq}/bin/jq . > $out echo -n "$json" | ${pkgs.jq}/bin/jq . > $out
''; '';

View file

@ -6,14 +6,15 @@ let
cfg = config.programs.autorandr; cfg = config.programs.autorandr;
matrixOf = n: m: elemType: mkOptionType rec { matrixOf = n: m: elemType:
mkOptionType rec {
name = "matrixOf"; name = "matrixOf";
description = "${toString n}×${toString m} matrix of ${elemType.description}s"; description =
"${toString n}×${toString m} matrix of ${elemType.description}s";
check = xss: check = xss:
let let listOfSize = l: xs: isList xs && length xs == l;
listOfSize = l: xs: isList xs && length xs == l; in listOfSize n xss
in && all (xs: listOfSize m xs && all elemType.check xs) xss;
listOfSize n xss && all (xs: listOfSize m xs && all elemType.check xs) xss;
merge = mergeOneOption; merge = mergeOneOption;
getSubOptions = prefix: elemType.getSubOptions (prefix ++ [ "*" "*" ]); getSubOptions = prefix: elemType.getSubOptions (prefix ++ [ "*" "*" ]);
getSubModules = elemType.getSubModules; getSubModules = elemType.getSubModules;
@ -189,7 +190,9 @@ let
predetect = mkOption { predetect = mkOption {
type = types.attrsOf hookType; type = types.attrsOf hookType;
description = "Predetect hook executed before autorandr attempts to run xrandr."; description = ''
Predetect hook executed before autorandr attempts to run xrandr.
'';
default = { }; default = { };
}; };
}; };
@ -211,27 +214,37 @@ let
predetect = mkOption { predetect = mkOption {
type = hookType; type = hookType;
description = "Predetect hook executed before autorandr attempts to run xrandr."; description = ''
Predetect hook executed before autorandr attempts to run xrandr.
'';
default = ""; default = "";
}; };
}; };
}; };
hookToFile = folder: name: hook: hookToFile = folder: name: hook:
nameValuePair nameValuePair "autorandr/${folder}/${name}" {
"autorandr/${folder}/${name}" source = "${pkgs.writeShellScriptBin "hook" hook}/bin/hook";
{ source = "${pkgs.writeShellScriptBin "hook" hook}/bin/hook"; }; };
profileToFiles = name: profile: with profile; mkMerge ([ profileToFiles = name: profile:
with profile;
mkMerge ([
{ {
"autorandr/${name}/setup".text = concatStringsSep "\n" (mapAttrsToList fingerprintToString fingerprint); "autorandr/${name}/setup".text = concatStringsSep "\n"
"autorandr/${name}/config".text = concatStringsSep "\n" (mapAttrsToList configToString profile.config); (mapAttrsToList fingerprintToString fingerprint);
"autorandr/${name}/config".text =
concatStringsSep "\n" (mapAttrsToList configToString profile.config);
} }
(mkIf (hooks.postswitch != "") (listToAttrs [ (hookToFile name "postswitch" hooks.postswitch) ])) (mkIf (hooks.postswitch != "")
(mkIf (hooks.preswitch != "") (listToAttrs [ (hookToFile name "preswitch" hooks.preswitch) ])) (listToAttrs [ (hookToFile name "postswitch" hooks.postswitch) ]))
(mkIf (hooks.predetect != "") (listToAttrs [ (hookToFile name "predetect" hooks.predetect) ])) (mkIf (hooks.preswitch != "")
(listToAttrs [ (hookToFile name "preswitch" hooks.preswitch) ]))
(mkIf (hooks.predetect != "")
(listToAttrs [ (hookToFile name "predetect" hooks.predetect) ]))
]); ]);
fingerprintToString = name: edid: "${name} ${edid}"; fingerprintToString = name: edid: "${name} ${edid}";
configToString = name: config: if config.enable then '' configToString = name: config:
if config.enable then ''
output ${name} output ${name}
${optionalString (config.position != "") "pos ${config.position}"} ${optionalString (config.position != "") "pos ${config.position}"}
${optionalString config.primary "primary"} ${optionalString config.primary "primary"}
@ -240,21 +253,17 @@ let
${optionalString (config.mode != "") "mode ${config.mode}"} ${optionalString (config.mode != "") "mode ${config.mode}"}
${optionalString (config.rate != "") "rate ${config.rate}"} ${optionalString (config.rate != "") "rate ${config.rate}"}
${optionalString (config.rotate != null) "rotate ${config.rotate}"} ${optionalString (config.rotate != null) "rotate ${config.rotate}"}
${optionalString (config.scale != null) ( ${optionalString (config.scale != null)
(if config.scale.method == "factor" then "scale" else "scale-from") ((if config.scale.method == "factor" then "scale" else "scale-from")
+ " ${toString config.scale.x}x${toString config.scale.y}" + " ${toString config.scale.x}x${toString config.scale.y}")}
)} ${optionalString (config.transform != null) ("transform "
${optionalString (config.transform != null) ( + concatMapStringsSep "," toString (flatten config.transform))}
"transform " + concatMapStringsSep "," toString (flatten config.transform)
)}
'' else '' '' else ''
output ${name} output ${name}
off off
''; '';
in in {
{
options = { options = {
programs.autorandr = { programs.autorandr = {
enable = mkEnableOption "Autorandr"; enable = mkEnableOption "Autorandr";
@ -323,18 +332,15 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = flatten (mapAttrsToList ( assertions = flatten (mapAttrsToList (profile:
profile: { config, ... }: mapAttrsToList ( { config, ... }:
output: opts: { mapAttrsToList (output: opts: {
assertion = opts.scale == null || opts.transform == null; assertion = opts.scale == null || opts.transform == null;
message = '' message = ''
Cannot use the profile output options 'scale' and 'transform' simultaneously. Cannot use the profile output options 'scale' and 'transform' simultaneously.
Check configuration for: programs.autorandr.profiles.${profile}.config.${output} Check configuration for: programs.autorandr.profiles.${profile}.config.${output}
''; '';
}) }) config) cfg.profiles);
config
)
cfg.profiles);
home.packages = [ pkgs.autorandr ]; home.packages = [ pkgs.autorandr ];
xdg.configFile = mkMerge ([ xdg.configFile = mkMerge ([

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.bat; cfg = config.programs.bat;
in in {
{
meta.maintainers = [ maintainers.marsam ]; meta.maintainers = [ maintainers.marsam ];
options.programs.bat = { options.programs.bat = {
@ -32,9 +30,8 @@ in
home.packages = [ pkgs.bat ]; home.packages = [ pkgs.bat ];
xdg.configFile."bat/config" = mkIf (cfg.config != { }) { xdg.configFile."bat/config" = mkIf (cfg.config != { }) {
text = concatStringsSep "\n" ( text = concatStringsSep "\n"
mapAttrsToList (n: v: ''--${n}="${v}"'') cfg.config (mapAttrsToList (n: v: ''--${n}="${v}"'') cfg.config);
);
}; };
}; };
} }

View file

@ -6,19 +6,17 @@ let
cfg = config.programs.beets; cfg = config.programs.beets;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
programs.beets = { programs.beets = {
enable = mkOption { enable = mkOption {
type = types.bool; type = types.bool;
default = default = if versionAtLeast config.home.stateVersion "19.03" then
if versionAtLeast config.home.stateVersion "19.03" false
then false else
else cfg.settings != {}; cfg.settings != { };
defaultText = "false"; defaultText = "false";
description = '' description = ''
Whether to enable the beets music library manager. This Whether to enable the beets music library manager. This
@ -32,7 +30,8 @@ in
type = types.package; type = types.package;
default = pkgs.beets; default = pkgs.beets;
defaultText = literalExample "pkgs.beets"; defaultText = literalExample "pkgs.beets";
example = literalExample "(pkgs.beets.override { enableCheck = true; })"; example =
literalExample "(pkgs.beets.override { enableCheck = true; })";
description = '' description = ''
The <literal>beets</literal> package to use. The <literal>beets</literal> package to use.
Can be used to specify extensions. Can be used to specify extensions.

View file

@ -7,13 +7,11 @@ let
cfg = config.programs.broot; cfg = config.programs.broot;
configFile = config: configFile = config:
pkgs.runCommand "conf.toml" pkgs.runCommand "conf.toml" {
{
buildInputs = [ pkgs.remarshal ]; buildInputs = [ pkgs.remarshal ];
preferLocalBuild = true; preferLocalBuild = true;
allowSubstitutes = false; allowSubstitutes = false;
} } ''
''
remarshal -if json -of toml \ remarshal -if json -of toml \
< ${pkgs.writeText "verbs.json" (builtins.toJSON config)} \ < ${pkgs.writeText "verbs.json" (builtins.toJSON config)} \
> $out > $out
@ -21,15 +19,11 @@ let
brootConf = { brootConf = {
verbs = verbs =
mapAttrsToList mapAttrsToList (name: value: value // { invocation = name; }) cfg.verbs;
(name: value: value // { invocation = name; })
cfg.verbs;
skin = cfg.skin; skin = cfg.skin;
}; };
in in {
{
meta.maintainers = [ maintainers.aheaume ]; meta.maintainers = [ maintainers.aheaume ];
options.programs.broot = { options.programs.broot = {
@ -63,7 +57,10 @@ in
type = with types; attrsOf (attrsOf (either bool str)); type = with types; attrsOf (attrsOf (either bool str));
default = { default = {
"p" = { execution = ":parent"; }; "p" = { execution = ":parent"; };
"edit" = { shortcut = "e"; execution = "$EDITOR {file}" ; }; "edit" = {
shortcut = "e";
execution = "$EDITOR {file}";
};
"create {subpath}" = { execution = "$EDITOR {directory}/{subpath}"; }; "create {subpath}" = { execution = "$EDITOR {directory}/{subpath}"; };
"view" = { execution = "less {file}"; }; "view" = { execution = "less {file}"; };
}; };
@ -177,8 +174,7 @@ in
# Dummy file to prevent broot from trying to reinstall itself # Dummy file to prevent broot from trying to reinstall itself
xdg.configFile."broot/launcher/installed".text = ""; xdg.configFile."broot/launcher/installed".text = "";
programs.bash.initExtra = programs.bash.initExtra = mkIf cfg.enableBashIntegration (
mkIf cfg.enableBashIntegration (
# Using mkAfter to make it more likely to appear after other # Using mkAfter to make it more likely to appear after other
# manipulations of the prompt. # manipulations of the prompt.
mkAfter '' mkAfter ''
@ -207,8 +203,7 @@ in
rm -f "$f" rm -f "$f"
eval "$d" eval "$d"
} }
'' '');
);
programs.zsh.initExtra = mkIf cfg.enableZshIntegration '' programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
# This script was automatically generated by the broot function # This script was automatically generated by the broot function

View file

@ -2,13 +2,7 @@
with lib; with lib;
let let browsers = [ "chrome" "chromium" "firefox" "vivaldi" ];
browsers = [
"chrome"
"chromium"
"firefox"
"vivaldi"
];
in { in {
options = { options = {
programs.browserpass = { programs.browserpass = {
@ -24,25 +18,26 @@ in {
}; };
config = mkIf config.programs.browserpass.enable { config = mkIf config.programs.browserpass.enable {
home.file = home.file = foldl' (a: b: a // b) { } (concatMap (x:
foldl' (a: b: a // b) {} with pkgs.stdenv;
(concatMap (x: with pkgs.stdenv;
if x == "chrome" then if x == "chrome" then
let dir = if isDarwin let
then "Library/Application Support/Google/Chrome/NativeMessagingHosts" dir = if isDarwin then
else ".config/google-chrome/NativeMessagingHosts"; "Library/Application Support/Google/Chrome/NativeMessagingHosts"
in [ else
{ ".config/google-chrome/NativeMessagingHosts";
in [{
"${dir}/com.github.browserpass.native.json".source = "${dir}/com.github.browserpass.native.json".source =
"${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json"; "${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json";
"${dir}/../policies/managed/com.github.browserpass.native.json".source = "${dir}/../policies/managed/com.github.browserpass.native.json".source =
"${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json"; "${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json";
} }]
]
else if x == "chromium" then else if x == "chromium" then
let dir = if isDarwin let
then "Library/Application Support/Chromium/NativeMessagingHosts" dir = if isDarwin then
else ".config/chromium/NativeMessagingHosts"; "Library/Application Support/Chromium/NativeMessagingHosts"
else
".config/chromium/NativeMessagingHosts";
in [ in [
{ {
"${dir}/com.github.browserpass.native.json".source = "${dir}/com.github.browserpass.native.json".source =
@ -54,28 +49,28 @@ in {
} }
] ]
else if x == "firefox" then else if x == "firefox" then
let dir = if isDarwin let
then "Library/Application Support/Mozilla/NativeMessagingHosts" dir = if isDarwin then
else ".mozilla/native-messaging-hosts"; "Library/Application Support/Mozilla/NativeMessagingHosts"
in [ else
{ ".mozilla/native-messaging-hosts";
in [{
"${dir}/com.github.browserpass.native.json".source = "${dir}/com.github.browserpass.native.json".source =
"${pkgs.browserpass}/lib/browserpass/hosts/firefox/com.github.browserpass.native.json"; "${pkgs.browserpass}/lib/browserpass/hosts/firefox/com.github.browserpass.native.json";
} }]
]
else if x == "vivaldi" then else if x == "vivaldi" then
let dir = if isDarwin let
then "Library/Application Support/Vivaldi/NativeMessagingHosts" dir = if isDarwin then
else ".config/vivaldi/NativeMessagingHosts"; "Library/Application Support/Vivaldi/NativeMessagingHosts"
in [ else
{ ".config/vivaldi/NativeMessagingHosts";
in [{
"${dir}/com.github.browserpass.native.json".source = "${dir}/com.github.browserpass.native.json".source =
"${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json"; "${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json";
"${dir}/../policies/managed/com.github.browserpass.native.json".source = "${dir}/../policies/managed/com.github.browserpass.native.json".source =
"${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json"; "${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json";
} }]
] else
else throw "unknown browser ${x}") config.programs.browserpass.browsers throw "unknown browser ${x}") config.programs.browserpass.browsers);
);
}; };
} }

View file

@ -5,10 +5,8 @@ with lib;
let let
browserModule = defaultPkg: name: visible: browserModule = defaultPkg: name: visible:
let let browser = (builtins.parseDrvName defaultPkg.name).name;
browser = (builtins.parseDrvName defaultPkg.name).name; in {
in
{
enable = mkOption { enable = mkOption {
inherit visible; inherit visible;
default = false; default = false;
@ -57,31 +55,32 @@ let
google-chrome-dev = "Google/Chrome Dev"; google-chrome-dev = "Google/Chrome Dev";
}; };
configDir = if pkgs.stdenv.isDarwin configDir = if pkgs.stdenv.isDarwin then
then "Library/Application Support/${getAttr browser darwinDirs}" "Library/Application Support/${getAttr browser darwinDirs}"
else "${config.xdg.configHome}/${browser}"; else
"${config.xdg.configHome}/${browser}";
extensionJson = ext: { extensionJson = ext: {
name = "${configDir}/External Extensions/${ext}.json"; name = "${configDir}/External Extensions/${ext}.json";
value.text = builtins.toJSON { value.text = builtins.toJSON {
external_update_url = "https://clients2.google.com/service/update2/crx"; external_update_url =
"https://clients2.google.com/service/update2/crx";
}; };
}; };
in in mkIf cfg.enable {
mkIf cfg.enable {
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];
home.file = listToAttrs (map extensionJson cfg.extensions); home.file = listToAttrs (map extensionJson cfg.extensions);
}; };
in in {
{
options.programs = { options.programs = {
chromium = browserModule pkgs.chromium "Chromium" true; chromium = browserModule pkgs.chromium "Chromium" true;
google-chrome = browserModule pkgs.google-chrome "Google Chrome" false; google-chrome = browserModule pkgs.google-chrome "Google Chrome" false;
google-chrome-beta = browserModule pkgs.google-chrome-beta "Google Chrome Beta" false; google-chrome-beta =
google-chrome-dev = browserModule pkgs.google-chrome-dev "Google Chrome Dev" false; browserModule pkgs.google-chrome-beta "Google Chrome Beta" false;
google-chrome-dev =
browserModule pkgs.google-chrome-dev "Google Chrome Dev" false;
}; };
config = mkMerge [ config = mkMerge [

View file

@ -13,8 +13,11 @@ let
isExecutable = true; isExecutable = true;
inherit (pkgs) perl; inherit (pkgs) perl;
inherit (cfg) dbPath; inherit (cfg) dbPath;
perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ") perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ") [
[ pkgs.perlPackages.DBI pkgs.perlPackages.DBDSQLite pkgs.perlPackages.StringShellQuote ]); pkgs.perlPackages.DBI
pkgs.perlPackages.DBDSQLite
pkgs.perlPackages.StringShellQuote
]);
}; };
shInit = commandNotFoundHandlerName: '' shInit = commandNotFoundHandlerName: ''
@ -31,14 +34,13 @@ let
} }
''; '';
in in {
{
options.programs.command-not-found = { options.programs.command-not-found = {
enable = mkEnableOption "command-not-found hook for interactive shell"; enable = mkEnableOption "command-not-found hook for interactive shell";
dbPath = mkOption { dbPath = mkOption {
default = "/nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite" ; default =
"/nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite";
description = '' description = ''
Absolute path to <filename>programs.sqlite</filename>. By Absolute path to <filename>programs.sqlite</filename>. By
default this file will be provided by your channel default this file will be provided by your channel

View file

@ -6,21 +6,17 @@ let
cfg = config.programs.direnv; cfg = config.programs.direnv;
configFile = config: configFile = config:
pkgs.runCommand "config.toml" pkgs.runCommand "config.toml" {
{
buildInputs = [ pkgs.remarshal ]; buildInputs = [ pkgs.remarshal ];
preferLocalBuild = true; preferLocalBuild = true;
allowSubstitutes = false; allowSubstitutes = false;
} } ''
''
remarshal -if json -of toml \ remarshal -if json -of toml \
< ${pkgs.writeText "config.json" (builtins.toJSON config)} \ < ${pkgs.writeText "config.json" (builtins.toJSON config)} \
> $out > $out
''; '';
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options.programs.direnv = { options.programs.direnv = {
@ -79,22 +75,18 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.direnv ]; home.packages = [ pkgs.direnv ];
xdg.configFile."direnv/config.toml" = mkIf (cfg.config != {}) { xdg.configFile."direnv/config.toml" =
source = configFile cfg.config; mkIf (cfg.config != { }) { source = configFile cfg.config; };
};
xdg.configFile."direnv/direnvrc" = mkIf (cfg.stdlib != "") { xdg.configFile."direnv/direnvrc" =
text = cfg.stdlib; mkIf (cfg.stdlib != "") { text = cfg.stdlib; };
};
programs.bash.initExtra = programs.bash.initExtra = mkIf cfg.enableBashIntegration (
mkIf cfg.enableBashIntegration (
# Using mkAfter to make it more likely to appear after other # Using mkAfter to make it more likely to appear after other
# manipulations of the prompt. # manipulations of the prompt.
mkAfter '' mkAfter ''
eval "$(${pkgs.direnv}/bin/direnv hook bash)" eval "$(${pkgs.direnv}/bin/direnv hook bash)"
'' '');
);
programs.zsh.initExtra = mkIf cfg.enableZshIntegration '' programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
eval "$(${pkgs.direnv}/bin/direnv hook zsh)" eval "$(${pkgs.direnv}/bin/direnv hook zsh)"

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.eclipse; cfg = config.programs.eclipse;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
@ -43,9 +41,7 @@ in
home.packages = [ home.packages = [
(pkgs.eclipses.eclipseWithPlugins { (pkgs.eclipses.eclipseWithPlugins {
eclipse = pkgs.eclipses.eclipse-platform; eclipse = pkgs.eclipses.eclipse-platform;
jvmArgs = jvmArgs = cfg.jvmArgs ++ optional cfg.enableLombok
cfg.jvmArgs
++ optional cfg.enableLombok
"-javaagent:${pkgs.lombok}/share/java/lombok.jar"; "-javaagent:${pkgs.lombok}/share/java/lombok.jar";
plugins = cfg.plugins; plugins = cfg.plugins;
}) })

View file

@ -9,16 +9,17 @@ let
disableBinding = func: key: func; disableBinding = func: key: func;
enableBinding = func: key: "${func} ${toString key}"; enableBinding = func: key: "${func} ${toString key}";
in in {
{
options.programs.feh = { options.programs.feh = {
enable = mkEnableOption "feh - a fast and light image viewer"; enable = mkEnableOption "feh - a fast and light image viewer";
buttons = mkOption { buttons = mkOption {
default = { }; default = { };
type = with types; attrsOf (nullOr (either str int)); type = with types; attrsOf (nullOr (either str int));
example = { zoom_in = 4; zoom_out = "C-4"; }; example = {
zoom_in = 4;
zoom_out = "C-4";
};
description = '' description = ''
Override feh's default mouse button mapping. If you want to disable an Override feh's default mouse button mapping. If you want to disable an
action, set its value to null. action, set its value to null.
@ -30,7 +31,10 @@ in
keybindings = mkOption { keybindings = mkOption {
default = { }; default = { };
type = types.attrsOf (types.nullOr types.str); type = types.attrsOf (types.nullOr types.str);
example = { zoom_in = "plus"; zoom_out = "minus"; }; example = {
zoom_in = "plus";
zoom_out = "minus";
};
description = '' description = ''
Override feh's default keybindings. If you want to disable a keybinding Override feh's default keybindings. If you want to disable a keybinding
set its value to null. set its value to null.
@ -41,23 +45,26 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = [ assertions = [{
{
assertion = ((filterAttrs (n: v: v == "") cfg.keybindings) == { }); assertion = ((filterAttrs (n: v: v == "") cfg.keybindings) == { });
message = "To disable a keybinding, use `null` instead of an empty string."; message =
} "To disable a keybinding, use `null` instead of an empty string.";
]; }];
home.packages = [ pkgs.feh ]; home.packages = [ pkgs.feh ];
xdg.configFile."feh/buttons".text = '' xdg.configFile."feh/buttons".text = ''
${concatStringsSep "\n" (mapAttrsToList disableBinding (filterAttrs (n: v: v == null) cfg.buttons))} ${concatStringsSep "\n" (mapAttrsToList disableBinding
${concatStringsSep "\n" (mapAttrsToList enableBinding (filterAttrs (n: v: v != null) cfg.buttons))} (filterAttrs (n: v: v == null) cfg.buttons))}
${concatStringsSep "\n" (mapAttrsToList enableBinding
(filterAttrs (n: v: v != null) cfg.buttons))}
''; '';
xdg.configFile."feh/keys".text = '' xdg.configFile."feh/keys".text = ''
${concatStringsSep "\n" (mapAttrsToList disableBinding (filterAttrs (n: v: v == null) cfg.keybindings))} ${concatStringsSep "\n" (mapAttrsToList disableBinding
${concatStringsSep "\n" (mapAttrsToList enableBinding (filterAttrs (n: v: v != null) cfg.keybindings))} (filterAttrs (n: v: v == null) cfg.keybindings))}
${concatStringsSep "\n" (mapAttrsToList enableBinding
(filterAttrs (n: v: v != null) cfg.keybindings))}
''; '';
}; };
} }

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.fzf; cfg = config.programs.fzf;
in in {
{
options.programs.fzf = { options.programs.fzf = {
enable = mkEnableOption "fzf - a command-line fuzzy finder"; enable = mkEnableOption "fzf - a command-line fuzzy finder";
@ -107,9 +105,8 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.fzf ]; home.packages = [ pkgs.fzf ];
home.sessionVariables = home.sessionVariables = mapAttrs (n: v: toString v)
mapAttrs (n: v: toString v) ( (filterAttrs (n: v: v != [ ] && v != null) {
filterAttrs (n: v: v != [] && v != null) {
FZF_ALT_C_COMMAND = cfg.changeDirWidgetCommand; FZF_ALT_C_COMMAND = cfg.changeDirWidgetCommand;
FZF_ALT_C_OPTS = cfg.changeDirWidgetOptions; FZF_ALT_C_OPTS = cfg.changeDirWidgetOptions;
FZF_CTRL_R_COMMAND = cfg.historyWidgetCommand; FZF_CTRL_R_COMMAND = cfg.historyWidgetCommand;
@ -118,8 +115,7 @@ in
FZF_CTRL_T_OPTS = cfg.fileWidgetOptions; FZF_CTRL_T_OPTS = cfg.fileWidgetOptions;
FZF_DEFAULT_COMMAND = cfg.defaultCommand; FZF_DEFAULT_COMMAND = cfg.defaultCommand;
FZF_DEFAULT_OPTS = cfg.defaultOptions; FZF_DEFAULT_OPTS = cfg.defaultOptions;
} });
);
programs.bash.initExtra = mkIf cfg.enableBashIntegration '' programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
if [[ :$SHELLOPTS: =~ :(vi|emacs): ]]; then if [[ :$SHELLOPTS: =~ :(vi|emacs): ]]; then

View file

@ -4,24 +4,23 @@ with lib;
let let
accounts = filter (a: a.getmail.enable) accounts =
(attrValues config.accounts.email.accounts); filter (a: a.getmail.enable) (attrValues config.accounts.email.accounts);
renderAccountConfig = account: with account; renderAccountConfig = account:
with account;
let let
passCmd = concatMapStringsSep ", " (x: "'${x}'") passwordCommand; passCmd = concatMapStringsSep ", " (x: "'${x}'") passwordCommand;
renderedMailboxes = concatMapStringsSep ", " (x: "'${x}'") getmail.mailboxes; renderedMailboxes =
retrieverType = if imap.tls.enable concatMapStringsSep ", " (x: "'${x}'") getmail.mailboxes;
then "SimpleIMAPSSLRetriever" retrieverType = if imap.tls.enable then
else "SimpleIMAPRetriever"; "SimpleIMAPSSLRetriever"
destination = if getmail.destinationCommand != null else
then "SimpleIMAPRetriever";
{ destination = if getmail.destinationCommand != null then {
destinationType = "MDA_external"; destinationType = "MDA_external";
destinationPath = getmail.destinationCommand; destinationPath = getmail.destinationCommand;
} } else {
else
{
destinationType = "Maildir"; destinationType = "Maildir";
destinationPath = "${maildir.absPath}/"; destinationPath = "${maildir.absPath}/";
}; };
@ -46,14 +45,12 @@ let
''; '';
getmailEnabled = length (filter (a: a.getmail.enable) accounts) > 0; getmailEnabled = length (filter (a: a.getmail.enable) accounts) > 0;
# Watch out! This is used by the getmail.service too! # Watch out! This is used by the getmail.service too!
renderConfigFilepath = a: ".getmail/getmail${if a.primary then "rc" else a.name}"; renderConfigFilepath = a:
".getmail/getmail${if a.primary then "rc" else a.name}";
in in {
{
config = mkIf getmailEnabled { config = mkIf getmailEnabled {
home.file = home.file = foldl' (a: b: a // b) { }
foldl' (a: b: a // b) {}
(map (a: { "${renderConfigFilepath a}".text = renderAccountConfig a; }) (map (a: { "${renderConfigFilepath a}".text = renderAccountConfig a; })
accounts); accounts);
}; };

View file

@ -14,36 +14,31 @@ let
section = head sections; section = head sections;
subsections = tail sections; subsections = tail sections;
subsection = concatStringsSep "." subsections; subsection = concatStringsSep "." subsections;
in in if containsQuote || subsections == [ ] then
if containsQuote || subsections == [] name
then name else
else "${section} \"${subsection}\""; ''${section} "${subsection}"'';
# generation for multiple ini values # generation for multiple ini values
mkKeyValue = k: v: mkKeyValue = k: v:
let let mkKeyValue = generators.mkKeyValueDefault { } "=" k;
mkKeyValue = generators.mkKeyValueDefault {} "=" k; in concatStringsSep "\n" (map mkKeyValue (toList v));
in
concatStringsSep "\n" (map mkKeyValue (toList v));
# converts { a.b.c = 5; } to { "a.b".c = 5; } for toINI # converts { a.b.c = 5; } to { "a.b".c = 5; } for toINI
gitFlattenAttrs = gitFlattenAttrs = let
let
recurse = path: value: recurse = path: value:
if isAttrs value then if isAttrs value then
mapAttrsToList (name: value: recurse ([ name ] ++ path) value) value mapAttrsToList (name: value: recurse ([ name ] ++ path) value) value
else if length path > 1 then else if length path > 1 then {
{ ${concatStringsSep "." (reverseList (tail path))}.${head path} = value; } ${concatStringsSep "." (reverseList (tail path))}.${head path} = value;
else } else {
{ ${head path} = value; }; ${head path} = value;
in };
attrs: foldl recursiveUpdate {} (flatten (recurse [] attrs)); in attrs: foldl recursiveUpdate { } (flatten (recurse [ ] attrs));
gitToIni = attrs: gitToIni = attrs:
let let toIni = generators.toINI { inherit mkKeyValue mkSectionName; };
toIni = generators.toINI { inherit mkKeyValue mkSectionName; }; in toIni (gitFlattenAttrs attrs);
in
toIni (gitFlattenAttrs attrs);
gitIniType = with types; gitIniType = with types;
let let
@ -51,8 +46,7 @@ let
multipleType = either primitiveType (listOf primitiveType); multipleType = either primitiveType (listOf primitiveType);
sectionType = attrsOf multipleType; sectionType = attrsOf multipleType;
supersectionType = attrsOf (either multipleType sectionType); supersectionType = attrsOf (either multipleType sectionType);
in in attrsOf supersectionType;
attrsOf supersectionType;
signModule = types.submodule { signModule = types.submodule {
options = { options = {
@ -105,14 +99,11 @@ let
}; };
}; };
config.path = mkIf (config.contents != {}) ( config.path = mkIf (config.contents != { })
mkDefault (pkgs.writeText "contents" (gitToIni config.contents)) (mkDefault (pkgs.writeText "contents" (gitToIni config.contents)));
);
}); });
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
@ -217,8 +208,7 @@ in
}; };
}; };
config = mkIf cfg.enable ( config = mkIf cfg.enable (mkMerge [
mkMerge [
{ {
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];
@ -241,22 +231,20 @@ in
} }
{ {
programs.git.iniContent = programs.git.iniContent = let
let
hasSmtp = name: account: account.smtp != null; hasSmtp = name: account: account.smtp != null;
genIdentity = name: account: with account; genIdentity = name: account:
with account;
nameValuePair "sendemail.${name}" ({ nameValuePair "sendemail.${name}" ({
smtpEncryption = if smtp.tls.enable then "tls" else ""; smtpEncryption = if smtp.tls.enable then "tls" else "";
smtpServer = smtp.host; smtpServer = smtp.host;
smtpUser = userName; smtpUser = userName;
from = address; from = address;
} } // optionalAttrs (smtp.port != null) {
// optionalAttrs (smtp.port != null) {
smtpServerPort = smtp.port; smtpServerPort = smtp.port;
}); });
in in mapAttrs' genIdentity
mapAttrs' genIdentity
(filterAttrs hasSmtp config.accounts.email.accounts); (filterAttrs hasSmtp config.accounts.email.accounts);
} }
@ -268,58 +256,48 @@ in
}; };
}) })
(mkIf (cfg.aliases != {}) { (mkIf (cfg.aliases != { }) { programs.git.iniContent.alias = cfg.aliases; })
programs.git.iniContent.alias = cfg.aliases;
})
(mkIf (lib.isAttrs cfg.extraConfig) { (mkIf (lib.isAttrs cfg.extraConfig) {
programs.git.iniContent = cfg.extraConfig; programs.git.iniContent = cfg.extraConfig;
}) })
(mkIf (lib.isString cfg.extraConfig) { (mkIf (lib.isString cfg.extraConfig) {
warnings = [ warnings = [''
''
Using programs.git.extraConfig as a string option is Using programs.git.extraConfig as a string option is
deprecated and will be removed in the future. Please deprecated and will be removed in the future. Please
change to using it as an attribute set instead. change to using it as an attribute set instead.
'' ''];
];
xdg.configFile."git/config".text = cfg.extraConfig; xdg.configFile."git/config".text = cfg.extraConfig;
}) })
(mkIf (cfg.includes != [ ]) { (mkIf (cfg.includes != [ ]) {
xdg.configFile."git/config".text = xdg.configFile."git/config".text = let
let include = i:
include = i: with i; with i;
if condition != null if condition != null then {
then { includeIf.${condition}.path = "${path}"; } includeIf.${condition}.path = "${path}";
else { include.path = "${path}"; }; } else {
in include.path = "${path}";
mkAfter };
(concatStringsSep "\n" in mkAfter
(map gitToIni (concatStringsSep "\n" (map gitToIni (map include cfg.includes)));
(map include cfg.includes)));
}) })
(mkIf cfg.lfs.enable { (mkIf cfg.lfs.enable {
home.packages = [ pkgs.git-lfs ]; home.packages = [ pkgs.git-lfs ];
programs.git.iniContent.filter.lfs = programs.git.iniContent.filter.lfs =
let let skipArg = optional cfg.lfs.skipSmudge "--skip";
skipArg = optional cfg.lfs.skipSmudge "--skip"; in {
in
{
clean = "git-lfs clean -- %f"; clean = "git-lfs clean -- %f";
process = concatStringsSep " " ( process =
[ "git-lfs" "filter-process" ] ++ skipArg concatStringsSep " " ([ "git-lfs" "filter-process" ] ++ skipArg);
);
required = true; required = true;
smudge = concatStringsSep " " ( smudge = concatStringsSep " "
[ "git-lfs" "smudge" ] ++ skipArg ++ [ "--" "%f" ] ([ "git-lfs" "smudge" ] ++ skipArg ++ [ "--" "%f" ]);
);
}; };
}) })
] ]);
);
} }

View file

@ -11,8 +11,7 @@ let
. ${pkgs.gnome3.vte}/etc/profile.d/vte.sh . ${pkgs.gnome3.vte}/etc/profile.d/vte.sh
''; '';
backForeSubModule = types.submodule ( backForeSubModule = types.submodule ({ ... }: {
{ ... }: {
options = { options = {
foreground = mkOption { foreground = mkOption {
type = types.str; type = types.str;
@ -24,11 +23,9 @@ let
description = "The background color."; description = "The background color.";
}; };
}; };
} });
);
profileColorsSubModule = types.submodule ( profileColorsSubModule = types.submodule ({ ... }: {
{ ... }: {
options = { options = {
foregroundColor = mkOption { foregroundColor = mkOption {
type = types.str; type = types.str;
@ -63,11 +60,9 @@ let
description = "The colors for the terminals highlighted area."; description = "The colors for the terminals highlighted area.";
}; };
}; };
} });
);
profileSubModule = types.submodule ( profileSubModule = types.submodule ({ name, config, ... }: {
{ name, config, ... }: {
options = { options = {
default = mkOption { default = mkOption {
default = false; default = false;
@ -122,14 +117,12 @@ let
scrollbackLines = mkOption { scrollbackLines = mkOption {
default = 10000; default = 10000;
type = types.nullOr types.int; type = types.nullOr types.int;
description = description = ''
''
The number of scrollback lines to keep, null for infinite. The number of scrollback lines to keep, null for infinite.
''; '';
}; };
}; };
} });
);
buildProfileSet = pcfg: buildProfileSet = pcfg:
{ {
@ -137,56 +130,41 @@ let
scrollbar-policy = if pcfg.showScrollbar then "always" else "never"; scrollbar-policy = if pcfg.showScrollbar then "always" else "never";
scrollback-lines = pcfg.scrollbackLines; scrollback-lines = pcfg.scrollbackLines;
cursor-shape = pcfg.cursorShape; cursor-shape = pcfg.cursorShape;
} } // (if (pcfg.font == null) then {
// ( use-system-font = true;
if (pcfg.font == null) } else {
then { use-system-font = true; } use-system-font = false;
else { use-system-font = false; font = pcfg.font; } font = pcfg.font;
) // ( }) // (if (pcfg.colors == null) then {
if (pcfg.colors == null) use-theme-colors = true;
then { use-theme-colors = true; } } else
else ( ({
{
use-theme-colors = false; use-theme-colors = false;
foreground-color = pcfg.colors.foregroundColor; foreground-color = pcfg.colors.foregroundColor;
background-color = pcfg.colors.backgroundColor; background-color = pcfg.colors.backgroundColor;
palette = pcfg.colors.palette; palette = pcfg.colors.palette;
} } // optionalAttrs (pcfg.allowBold != null) {
// optionalAttrs (pcfg.allowBold != null) {
allow-bold = pcfg.allowBold; allow-bold = pcfg.allowBold;
} } // (if (pcfg.colors.boldColor == null) then {
// ( bold-color-same-as-fg = true;
if (pcfg.colors.boldColor == null) } else {
then { bold-color-same-as-fg = true; }
else {
bold-color-same-as-fg = false; bold-color-same-as-fg = false;
bold-color = pcfg.colors.boldColor; bold-color = pcfg.colors.boldColor;
} }) // (if (pcfg.colors.cursor != null) then {
)
// (
if (pcfg.colors.cursor != null)
then {
cursor-colors-set = true; cursor-colors-set = true;
cursor-foreground-color = pcfg.colors.cursor.foreground; cursor-foreground-color = pcfg.colors.cursor.foreground;
cursor-background-color = pcfg.colors.cursor.background; cursor-background-color = pcfg.colors.cursor.background;
} } else {
else { cursor-colors-set = false; } cursor-colors-set = false;
) }) // (if (pcfg.colors.highlight != null) then {
// (
if (pcfg.colors.highlight != null)
then {
highlight-colors-set = true; highlight-colors-set = true;
highlight-foreground-color = pcfg.colors.highlight.foreground; highlight-foreground-color = pcfg.colors.highlight.foreground;
highlight-background-color = pcfg.colors.highlight.background; highlight-background-color = pcfg.colors.highlight.background;
} } else {
else { highlight-colors-set = false; } highlight-colors-set = false;
) })));
)
);
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
@ -216,11 +194,8 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.gnome3.gnome_terminal ]; home.packages = [ pkgs.gnome3.gnome_terminal ];
dconf.settings = dconf.settings = let dconfPath = "org/gnome/terminal/legacy";
let in {
dconfPath = "org/gnome/terminal/legacy";
in
{
"${dconfPath}" = { "${dconfPath}" = {
default-show-menubar = cfg.showMenubar; default-show-menubar = cfg.showMenubar;
theme-variant = cfg.themeVariant; theme-variant = cfg.themeVariant;
@ -231,10 +206,9 @@ in
default = head (attrNames (filterAttrs (n: v: v.default) cfg.profile)); default = head (attrNames (filterAttrs (n: v: v.default) cfg.profile));
list = attrNames cfg.profile; list = attrNames cfg.profile;
}; };
} } // mapAttrs'
// mapAttrs' (n: v: (n: v: nameValuePair ("${dconfPath}/profiles:/:${n}") (buildProfileSet v))
nameValuePair ("${dconfPath}/profiles:/:${n}") (buildProfileSet v) cfg.profile;
) cfg.profile;
programs.bash.initExtra = mkBefore vteInitStr; programs.bash.initExtra = mkBefore vteInitStr;
programs.zsh.initExtra = vteInitStr; programs.zsh.initExtra = vteInitStr;

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.go; cfg = config.programs.go;
in in {
{
meta.maintainers = [ maintainers.rvolosatovs ]; meta.maintainers = [ maintainers.rvolosatovs ];
options = { options = {
@ -49,11 +47,8 @@ in
type = types.listOf types.str; type = types.listOf types.str;
default = [ ]; default = [ ];
example = [ "extraGoPath1" "extraGoPath2" ]; example = [ "extraGoPath1" "extraGoPath2" ];
description = description = let goPathOpt = "programs.go.goPath";
let in ''
goPathOpt = "programs.go.goPath";
in
''
Extra <envar>GOPATH</envar>s relative to <envar>HOME</envar> appended Extra <envar>GOPATH</envar>s relative to <envar>HOME</envar> appended
after after
<varname><link linkend="opt-${goPathOpt}">${goPathOpt}</link></varname>, <varname><link linkend="opt-${goPathOpt}">${goPathOpt}</link></varname>,
@ -74,24 +69,21 @@ in
{ {
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];
home.file = home.file = let
let
goPath = if cfg.goPath != null then cfg.goPath else "go"; goPath = if cfg.goPath != null then cfg.goPath else "go";
mkSrc = n: v: { "${goPath}/src/${n}".source = v; }; mkSrc = n: v: { "${goPath}/src/${n}".source = v; };
in in foldl' (a: b: a // b) { } (mapAttrsToList mkSrc cfg.packages);
foldl' (a: b: a // b) {} (mapAttrsToList mkSrc cfg.packages);
} }
(mkIf (cfg.goPath != null) { (mkIf (cfg.goPath != null) {
home.sessionVariables.GOPATH = home.sessionVariables.GOPATH = concatStringsSep ":" (map builtins.toPath
concatStringsSep ":"
(map builtins.toPath
(map (path: "${config.home.homeDirectory}/${path}") (map (path: "${config.home.homeDirectory}/${path}")
([ cfg.goPath ] ++ cfg.extraGoPaths))); ([ cfg.goPath ] ++ cfg.extraGoPaths)));
}) })
(mkIf (cfg.goBin != null) { (mkIf (cfg.goBin != null) {
home.sessionVariables.GOBIN = builtins.toPath "${config.home.homeDirectory}/${cfg.goBin}"; home.sessionVariables.GOBIN =
builtins.toPath "${config.home.homeDirectory}/${cfg.goBin}";
}) })
]); ]);
} }

View file

@ -8,9 +8,7 @@ let
dag = config.lib.dag; dag = config.lib.dag;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
@ -33,10 +31,7 @@ in
}; };
config = mkIf (cfg.enable && !config.submoduleSupport.enable) { config = mkIf (cfg.enable && !config.submoduleSupport.enable) {
home.packages = [ home.packages =
(pkgs.callPackage ../../home-manager { [ (pkgs.callPackage ../../home-manager { inherit (cfg) path; }) ];
inherit (cfg) path;
})
];
}; };
} }

View file

@ -3,6 +3,7 @@
with lib; with lib;
let let
cfg = config.programs.htop; cfg = config.programs.htop;
list = xs: concatMapStrings (x: "${toString x} ") xs; list = xs: concatMapStrings (x: "${toString x} ") xs;
@ -87,10 +88,9 @@ let
"CPU(4)" = 1; "CPU(4)" = 1;
}; };
singleMeterType = types.coercedTo singleMeterType = let
(types.enum (attrNames meters)) meterEnum = types.enum (attrNames meters);
(m: { kind = m; mode = meters.${m}; }) meterSubmodule = types.submodule {
(types.submodule {
options = { options = {
kind = mkOption { kind = mkOption {
type = types.enum (attrNames meters); type = types.enum (attrNames meters);
@ -101,10 +101,15 @@ let
mode = mkOption { mode = mkOption {
type = types.enum [ 1 2 3 4 ]; type = types.enum [ 1 2 3 4 ];
example = 2; example = 2;
description = "Which mode the meter should use, one of 1(Bar) 2(Text) 3(Graph) 4(LED)."; description =
"Which mode the meter should use, one of 1(Bar) 2(Text) 3(Graph) 4(LED).";
}; };
}; };
}); };
in types.coercedTo meterEnum (m: {
kind = m;
mode = meters.${m};
}) meterSubmodule;
meterType = types.submodule { meterType = types.submodule {
options = { options = {
@ -115,7 +120,10 @@ let
"Memory" "Memory"
"LeftCPUs2" "LeftCPUs2"
"RightCPUs2" "RightCPUs2"
{ kind = "CPU"; mode = 3; } {
kind = "CPU";
mode = 3;
}
]; ];
type = types.listOf singleMeterType; type = types.listOf singleMeterType;
}; };
@ -123,7 +131,10 @@ let
description = "Meters shown in the right header."; description = "Meters shown in the right header.";
default = [ "Tasks" "LoadAverage" "Uptime" ]; default = [ "Tasks" "LoadAverage" "Uptime" ];
example = [ example = [
{ kind = "Clock"; mode = 4; } {
kind = "Clock";
mode = 4;
}
"Uptime" "Uptime"
"Tasks" "Tasks"
]; ];
@ -131,15 +142,37 @@ let
}; };
}; };
}; };
in
{ in {
options.programs.htop = { options.programs.htop = {
enable = mkEnableOption "htop"; enable = mkEnableOption "htop";
fields = mkOption { fields = mkOption {
type = types.listOf (types.enum (attrNames fields)); type = types.listOf (types.enum (attrNames fields));
default = [ "PID" "USER" "PRIORITY" "NICE" "M_SIZE" "M_RESIDENT" "M_SHARE" "STATE" "PERCENT_CPU" "PERCENT_MEM" "TIME" "COMM" ]; default = [
example = [ "PID" "USER" "PRIORITY" "PERCENT_CPU" "M_RESIDENT" "PERCENT_MEM" "TIME" "COMM" ]; "PID"
"USER"
"PRIORITY"
"NICE"
"M_SIZE"
"M_RESIDENT"
"M_SHARE"
"STATE"
"PERCENT_CPU"
"PERCENT_MEM"
"TIME"
"COMM"
];
example = [
"PID"
"USER"
"PRIORITY"
"PERCENT_CPU"
"M_RESIDENT"
"PERCENT_MEM"
"TIME"
"COMM"
];
description = "Active fields shown in the table."; description = "Active fields shown in the table.";
}; };
@ -225,7 +258,8 @@ in
detailedCpuTime = mkOption { detailedCpuTime = mkOption {
type = types.bool; type = types.bool;
default = false; default = false;
description = "Detailed CPU time (System/IO-Wait/Hard-IRQ/Soft-IRQ/Steal/Guest)."; description =
"Detailed CPU time (System/IO-Wait/Hard-IRQ/Soft-IRQ/Steal/Guest).";
}; };
cpuCountFromZero = mkOption { cpuCountFromZero = mkOption {
@ -272,14 +306,23 @@ in
"CPU" "CPU"
"LeftCPUs2" "LeftCPUs2"
"RightCPUs2" "RightCPUs2"
{ kind = "CPU"; mode = 3; } {
kind = "CPU";
mode = 3;
}
]; ];
right = [ right = [
{ kind = "Clock"; mode = 4; } {
kind = "Clock";
mode = 4;
}
"Uptime" "Uptime"
"Tasks" "Tasks"
"LoadAverage" "LoadAverage"
{ kind = "Battery"; mode = 1; } {
kind = "Battery";
mode = 1;
}
]; ];
}; };
type = meterType; type = meterType;

View file

@ -34,9 +34,7 @@ let
# from this package in the activation script. # from this package in the activation script.
infoPkg = pkgs.texinfoInteractive; infoPkg = pkgs.texinfoInteractive;
in in {
{
options = { options = {
programs.info = { programs.info = {
enable = mkEnableOption "GNU Info"; enable = mkEnableOption "GNU Info";
@ -55,7 +53,8 @@ in
home.sessionVariables.INFOPATH = home.sessionVariables.INFOPATH =
"${cfg.homeInfoDirLocation}\${INFOPATH:+:}\${INFOPATH}"; "${cfg.homeInfoDirLocation}\${INFOPATH:+:}\${INFOPATH}";
home.activation.createHomeInfoDir = hm.dag.entryAfter ["installPackages"] '' home.activation.createHomeInfoDir =
hm.dag.entryAfter [ "installPackages" ] ''
oPATH=$PATH oPATH=$PATH
export PATH="${lib.makeBinPath [ pkgs.gzip ]}''${PATH:+:}$PATH" export PATH="${lib.makeBinPath [ pkgs.gzip ]}''${PATH:+:}$PATH"
$DRY_RUN_CMD mkdir -p "${cfg.homeInfoDirLocation}" $DRY_RUN_CMD mkdir -p "${cfg.homeInfoDirLocation}"

View file

@ -25,9 +25,7 @@ let
}; };
}; };
in in {
{
options = { options = {
programs.jq = { programs.jq = {
enable = mkEnableOption "the jq command-line JSON processor"; enable = mkEnableOption "the jq command-line JSON processor";
@ -69,8 +67,10 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.jq ]; home.packages = [ pkgs.jq ];
home.sessionVariables = let c = cfg.colors; in { home.sessionVariables = let c = cfg.colors;
JQ_COLORS = "${c.null}:${c.false}:${c.true}:${c.numbers}:${c.strings}:${c.arrays}:${c.objects}"; in {
JQ_COLORS =
"${c.null}:${c.false}:${c.true}:${c.numbers}:${c.strings}:${c.arrays}:${c.objects}";
}; };
}; };
} }

View file

@ -10,16 +10,44 @@ let
options = { options = {
name = mkOption { name = mkOption {
type = types.enum [ type = types.enum [
"NormalBegin" "NormalIdle" "NormalEnd" "NormalKey" "NormalBegin"
"InsertBegin" "InsertIdle" "InsertEnd" "InsertKey" "NormalIdle"
"InsertChar" "InsertDelete" "InsertMove" "WinCreate" "NormalEnd"
"WinClose" "WinResize" "WinDisplay" "WinSetOption" "NormalKey"
"BufSetOption" "BufNewFile" "BufOpenFile" "BufCreate" "InsertBegin"
"BufWritePre" "BufWritePost" "BufReload" "BufClose" "InsertIdle"
"BufOpenFifo" "BufReadFifo" "BufCloseFifo" "RuntimeError" "InsertEnd"
"ModeChange" "PromptIdle" "GlobalSetOption" "KakBegin" "InsertKey"
"KakEnd" "FocusIn" "FocusOut" "RawKey" "InsertChar"
"InsertCompletionShow" "InsertCompletionHide" "InsertDelete"
"InsertMove"
"WinCreate"
"WinClose"
"WinResize"
"WinDisplay"
"WinSetOption"
"BufSetOption"
"BufNewFile"
"BufOpenFile"
"BufCreate"
"BufWritePre"
"BufWritePost"
"BufReload"
"BufClose"
"BufOpenFifo"
"BufReadFifo"
"BufCloseFifo"
"RuntimeError"
"ModeChange"
"PromptIdle"
"GlobalSetOption"
"KakBegin"
"KakEnd"
"FocusIn"
"FocusOut"
"RawKey"
"InsertCompletionShow"
"InsertCompletionHide"
"InsertCompletionSelect" "InsertCompletionSelect"
]; ];
example = "SetOption"; example = "SetOption";
@ -159,7 +187,8 @@ let
}; };
autoInfo = mkOption { autoInfo = mkOption {
type = types.nullOr (types.listOf (types.enum [ "command" "onkey" "normal" ])); type = types.nullOr
(types.listOf (types.enum [ "command" "onkey" "normal" ]));
default = null; default = null;
example = [ "command" "normal" ]; example = [ "command" "normal" ];
description = '' description = ''
@ -468,24 +497,28 @@ let
}; };
}; };
configFile = configFile = let
let wrapOptions = with cfg.config.wrapLines;
wrapOptions = with cfg.config.wrapLines; concatStrings [ concatStrings [
"${optionalString word " -word"}" "${optionalString word " -word"}"
"${optionalString indent " -indent"}" "${optionalString indent " -indent"}"
"${optionalString (marker != null) " -marker ${marker}"}" "${optionalString (marker != null) " -marker ${marker}"}"
"${optionalString (maxWidth != null) " -width ${toString maxWidth}"}" "${optionalString (maxWidth != null) " -width ${toString maxWidth}"}"
]; ];
numberLinesOptions = with cfg.config.numberLines; concatStrings [ numberLinesOptions = with cfg.config.numberLines;
concatStrings [
"${optionalString relative " -relative "}" "${optionalString relative " -relative "}"
"${optionalString highlightCursor " -hlcursor"}" "${optionalString highlightCursor " -hlcursor"}"
"${optionalString (separator != null) " -separator ${separator}"}" "${optionalString (separator != null) " -separator ${separator}"}"
]; ];
uiOptions = with cfg.config.ui; concatStringsSep " " [ uiOptions = with cfg.config.ui;
concatStringsSep " " [
"ncurses_set_title=${if setTitle then "true" else "false"}" "ncurses_set_title=${if setTitle then "true" else "false"}"
"ncurses_status_on_top=${if (statusLine == "top") then "true" else "false"}" "ncurses_status_on_top=${
if (statusLine == "top") then "true" else "false"
}"
"ncurses_assistant=${assistant}" "ncurses_assistant=${assistant}"
"ncurses_enable_mouse=${if enableMouse then "true" else "false"}" "ncurses_enable_mouse=${if enableMouse then "true" else "false"}"
"ncurses_change_colors=${if changeColors then "true" else "false"}" "ncurses_change_colors=${if changeColors then "true" else "false"}"
@ -495,58 +528,65 @@ let
"ncurses_wheel_up_button=${wheelUpButton}"}" "ncurses_wheel_up_button=${wheelUpButton}"}"
"${optionalString (shiftFunctionKeys != null) "${optionalString (shiftFunctionKeys != null)
"ncurses_shift_function_key=${toString shiftFunctionKeys}"}" "ncurses_shift_function_key=${toString shiftFunctionKeys}"}"
"ncurses_builtin_key_parser=${if useBuiltinKeyParser then "true" else "false"}" "ncurses_builtin_key_parser=${
if useBuiltinKeyParser then "true" else "false"
}"
]; ];
keyMappingString = km: concatStringsSep " " [ keyMappingString = km:
concatStringsSep " " [
"map global" "map global"
"${km.mode} ${km.key} '${km.effect}'" "${km.mode} ${km.key} '${km.effect}'"
"${optionalString (km.docstring != null) "-docstring '${km.docstring}'"}" "${optionalString (km.docstring != null)
"-docstring '${km.docstring}'"}"
]; ];
hookString = h: concatStringsSep " " [ hookString = h:
"hook" "${optionalString (h.group != null) "-group ${group}"}" concatStringsSep " " [
"${optionalString (h.once) "-once"}" "global" "hook"
"${h.name}" "${optionalString (h.option != null) h.option}" "${optionalString (h.group != null) "-group ${group}"}"
"${optionalString (h.once) "-once"}"
"global"
"${h.name}"
"${optionalString (h.option != null) h.option}"
"%{ ${h.commands} }" "%{ ${h.commands} }"
]; ];
cfgStr = with cfg.config; concatStringsSep "\n" ( cfgStr = with cfg.config;
[ "# Generated by home-manager" ] concatStringsSep "\n" ([ "# Generated by home-manager" ]
++ optional (colorScheme != null) "colorscheme ${colorScheme}" ++ optional (colorScheme != null) "colorscheme ${colorScheme}"
++ optional (tabStop != null) "set-option global tabstop ${toString tabStop}" ++ optional (tabStop != null)
++ optional (indentWidth != null) "set-option global indentwidth ${toString indentWidth}" "set-option global tabstop ${toString tabStop}"
++ optional (indentWidth != null)
"set-option global indentwidth ${toString indentWidth}"
++ optional (!incrementalSearch) "set-option global incsearch false" ++ optional (!incrementalSearch) "set-option global incsearch false"
++ optional (alignWithTabs) "set-option global aligntab true" ++ optional (alignWithTabs) "set-option global aligntab true"
++ optional (autoInfo != null) "set-option global autoinfo ${concatStringsSep "|" autoInfo}" ++ optional (autoInfo != null)
++ optional (autoComplete != null) "set-option global autocomplete ${concatStringsSep "|" autoComplete}" "set-option global autoinfo ${concatStringsSep "|" autoInfo}"
++ optional (autoReload != null) "set-option global/ autoreload ${autoReload}" ++ optional (autoComplete != null)
++ optional (wrapLines != null && wrapLines.enable) "add-highlighter global/ wrap${wrapOptions}" "set-option global autocomplete ${concatStringsSep "|" autoComplete}"
++ optional (autoReload != null)
"set-option global/ autoreload ${autoReload}"
++ optional (wrapLines != null && wrapLines.enable)
"add-highlighter global/ wrap${wrapOptions}"
++ optional (numberLines != null && numberLines.enable) ++ optional (numberLines != null && numberLines.enable)
"add-highlighter global/ number-lines${numberLinesOptions}" "add-highlighter global/ number-lines${numberLinesOptions}"
++ optional showMatching "add-highlighter global/ show-matching" ++ optional showMatching "add-highlighter global/ show-matching"
++ optional (scrollOff != null) ++ optional (scrollOff != null)
"set-option global scrolloff ${toString scrollOff.lines},${toString scrollOff.columns}" "set-option global scrolloff ${toString scrollOff.lines},${
toString scrollOff.columns
}"
++ [ "# UI options" ] ++ [ "# UI options" ]
++ optional (ui != null) "set-option global ui_options ${uiOptions}" ++ optional (ui != null) "set-option global ui_options ${uiOptions}"
++ [ "# Key mappings" ] ++ [ "# Key mappings" ] ++ map keyMappingString keyMappings
++ map keyMappingString keyMappings
++ [ "# Hooks" ] ++ [ "# Hooks" ] ++ map hookString hooks);
++ map hookString hooks in pkgs.writeText "kakrc"
); (optionalString (cfg.config != null) cfgStr + "\n" + cfg.extraConfig);
in
pkgs.writeText "kakrc" (
optionalString (cfg.config != null) cfgStr
+ "\n"
+ cfg.extraConfig
);
in in {
{
options = { options = {
programs.kakoune = { programs.kakoune = {
enable = mkEnableOption "the kakoune text editor"; enable = mkEnableOption "the kakoune text editor";

View file

@ -6,15 +6,16 @@ let
cfg = config.programs.keychain; cfg = config.programs.keychain;
flags = cfg.extraFlags flags = cfg.extraFlags ++ optional (cfg.agents != [ ])
++ optional (cfg.agents != []) "--agents ${concatStringsSep "," cfg.agents}" "--agents ${concatStringsSep "," cfg.agents}"
++ optional (cfg.inheritType != null) "--inherit ${cfg.inheritType}"; ++ optional (cfg.inheritType != null) "--inherit ${cfg.inheritType}";
shellCommand = "${cfg.package}/bin/keychain --eval ${concatStringsSep " " flags} ${concatStringsSep " " cfg.keys}"; shellCommand =
"${cfg.package}/bin/keychain --eval ${concatStringsSep " " flags} ${
concatStringsSep " " cfg.keys
}";
in in {
{
meta.maintainers = [ maintainers.marsam ]; meta.maintainers = [ maintainers.marsam ];
options.programs.keychain = { options.programs.keychain = {
@ -46,7 +47,8 @@ in
}; };
inheritType = mkOption { inheritType = mkOption {
type = types.nullOr (types.enum ["local" "any" "local-once" "any-once"]); type =
types.nullOr (types.enum [ "local" "any" "local-once" "any-once" ]);
default = null; default = null;
description = '' description = ''
Inherit type to attempt from agent variables from the environment. Inherit type to attempt from agent variables from the environment.

View file

@ -14,9 +14,7 @@ let
lla = "ls -la"; lla = "ls -la";
}; };
in in {
{
meta.maintainers = [ maintainers.marsam ]; meta.maintainers = [ maintainers.marsam ];
options.programs.lsd = { options.programs.lsd = {

View file

@ -9,16 +9,13 @@ let
formatLine = o: n: v: formatLine = o: n: v:
let let
formatValue = v: formatValue = v:
if isBool v then (if v then "True" else "False") if isBool v then (if v then "True" else "False") else toString v;
else toString v; in if isAttrs v then
in concatStringsSep "\n" (mapAttrsToList (formatLine "${o}${n}.") v)
if isAttrs v else
then concatStringsSep "\n" (mapAttrsToList (formatLine "${o}${n}.") v) (if v == "" then "" else "${o}${n}: ${formatValue v}");
else (if v == "" then "" else "${o}${n}: ${formatValue v}");
in in {
{
meta.maintainers = [ maintainers.rprospero ]; meta.maintainers = [ maintainers.rprospero ];
options.programs.matplotlib = { options.programs.matplotlib = {
@ -55,10 +52,8 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
xdg.configFile."matplotlib/matplotlibrc".text = xdg.configFile."matplotlib/matplotlibrc".text = concatStringsSep "\n" ([ ]
concatStringsSep "\n" ([]
++ mapAttrsToList (formatLine "") cfg.config ++ mapAttrsToList (formatLine "") cfg.config
++ optional (cfg.extraConfig != "") cfg.extraConfig ++ optional (cfg.extraConfig != "") cfg.extraConfig) + "\n";
) + "\n";
}; };
} }

View file

@ -6,9 +6,7 @@ let
extraConfigType = with lib.types; attrsOf (either (either str int) bool); extraConfigType = with lib.types; attrsOf (either (either str int) bool);
in in {
{
options.mbsync = { options.mbsync = {
enable = mkEnableOption "synchronization using mbsync"; enable = mkEnableOption "synchronization using mbsync";

View file

@ -10,14 +10,15 @@ let
mbsyncAccounts = mbsyncAccounts =
filter (a: a.mbsync.enable) (attrValues config.accounts.email.accounts); filter (a: a.mbsync.enable) (attrValues config.accounts.email.accounts);
genTlsConfig = tls: { genTlsConfig = tls:
SSLType = {
if !tls.enable then "None" SSLType = if !tls.enable then
else if tls.useStartTls then "STARTTLS" "None"
else "IMAPS"; else if tls.useStartTls then
} "STARTTLS"
// else
optionalAttrs (tls.enable && tls.certificatesFile != null) { "IMAPS";
} // optionalAttrs (tls.enable && tls.certificatesFile != null) {
CertificateFile = toString tls.certificatesFile; CertificateFile = toString tls.certificatesFile;
}; };
@ -30,56 +31,45 @@ let
genSection = header: entries: genSection = header: entries:
let let
escapeValue = escape [ "\"" ]; escapeValue = escape [ ''"'' ];
hasSpace = v: builtins.match ".* .*" v != null; hasSpace = v: builtins.match ".* .*" v != null;
genValue = n: v: genValue = n: v:
if isList v if isList v then
then concatMapStringsSep " " (genValue n) v concatMapStringsSep " " (genValue n) v
else if isBool v then (if v then "yes" else "no") else if isBool v then
else if isInt v then toString v (if v then "yes" else "no")
else if isString v && hasSpace v then "\"${escapeValue v}\"" else if isInt v then
else if isString v then v toString v
else if isString v && hasSpace v then
''"${escapeValue v}"''
else if isString v then
v
else else
let prettyV = lib.generators.toPretty { } v; let prettyV = lib.generators.toPretty { } v;
in throw "mbsync: unexpected value for option ${n}: '${prettyV}'"; in throw "mbsync: unexpected value for option ${n}: '${prettyV}'";
in in ''
''
${header} ${header}
${concatStringsSep "\n" ${concatStringsSep "\n"
(mapAttrsToList (n: v: "${n} ${genValue n v}") entries)} (mapAttrsToList (n: v: "${n} ${genValue n v}") entries)}
''; '';
genAccountConfig = account: with account; genAccountConfig = account:
genSection "IMAPAccount ${name}" ( with account;
{ genSection "IMAPAccount ${name}" ({
Host = imap.host; Host = imap.host;
User = userName; User = userName;
PassCmd = toString passwordCommand; PassCmd = toString passwordCommand;
} } // genTlsConfig imap.tls
// genTlsConfig imap.tls
// optionalAttrs (imap.port != null) { Port = toString imap.port; } // optionalAttrs (imap.port != null) { Port = toString imap.port; }
// mbsync.extraConfig.account // mbsync.extraConfig.account) + "\n"
) + genSection "IMAPStore ${name}-remote"
+ "\n" ({ Account = name; } // mbsync.extraConfig.remote) + "\n"
+ genSection "IMAPStore ${name}-remote" ( + genSection "MaildirStore ${name}-local" ({
{
Account = name;
}
// mbsync.extraConfig.remote
)
+ "\n"
+ genSection "MaildirStore ${name}-local" (
{
Path = "${maildir.absPath}/"; Path = "${maildir.absPath}/";
Inbox = "${maildir.absPath}/${folders.inbox}"; Inbox = "${maildir.absPath}/${folders.inbox}";
SubFolders = "Verbatim"; SubFolders = "Verbatim";
} } // optionalAttrs (mbsync.flatten != null) { Flatten = mbsync.flatten; }
// optionalAttrs (mbsync.flatten != null) { Flatten = mbsync.flatten; } // mbsync.extraConfig.local) + "\n" + genSection "Channel ${name}" ({
// mbsync.extraConfig.local
)
+ "\n"
+ genSection "Channel ${name}" (
{
Master = ":${name}-remote:"; Master = ":${name}-remote:";
Slave = ":${name}-local:"; Slave = ":${name}-local:";
Patterns = mbsync.patterns; Patterns = mbsync.patterns;
@ -87,22 +77,15 @@ let
Remove = masterSlaveMapping.${mbsync.remove}; Remove = masterSlaveMapping.${mbsync.remove};
Expunge = masterSlaveMapping.${mbsync.expunge}; Expunge = masterSlaveMapping.${mbsync.expunge};
SyncState = "*"; SyncState = "*";
} } // mbsync.extraConfig.channel) + "\n";
// mbsync.extraConfig.channel
)
+ "\n";
genGroupConfig = name: channels: genGroupConfig = name: channels:
let let
genGroupChannel = n: boxes: "Channel ${n}:${concatStringsSep "," boxes}"; genGroupChannel = n: boxes: "Channel ${n}:${concatStringsSep "," boxes}";
in in concatStringsSep "\n"
concatStringsSep "\n" ( ([ "Group ${name}" ] ++ mapAttrsToList genGroupChannel channels);
[ "Group ${name}" ] ++ mapAttrsToList genGroupChannel channels
);
in in {
{
options = { options = {
programs.mbsync = { programs.mbsync = {
enable = mkEnableOption "mbsync IMAP4 and Maildir mailbox synchronizer"; enable = mkEnableOption "mbsync IMAP4 and Maildir mailbox synchronizer";
@ -142,18 +125,15 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = assertions = let
let
checkAccounts = pred: msg: checkAccounts = pred: msg:
let let badAccounts = filter pred mbsyncAccounts;
badAccounts = filter pred mbsyncAccounts;
in { in {
assertion = badAccounts == [ ]; assertion = badAccounts == [ ];
message = "mbsync: ${msg} for accounts: " message = "mbsync: ${msg} for accounts: "
+ concatMapStringsSep ", " (a: a.name) badAccounts; + concatMapStringsSep ", " (a: a.name) badAccounts;
}; };
in in [
[
(checkAccounts (a: a.maildir == null) "Missing maildir configuration") (checkAccounts (a: a.maildir == null) "Missing maildir configuration")
(checkAccounts (a: a.imap == null) "Missing IMAP configuration") (checkAccounts (a: a.imap == null) "Missing IMAP configuration")
(checkAccounts (a: a.passwordCommand == null) "Missing passwordCommand") (checkAccounts (a: a.passwordCommand == null) "Missing passwordCommand")
@ -164,17 +144,13 @@ in
programs.notmuch.new.ignore = [ ".uidvalidity" ".mbsyncstate" ]; programs.notmuch.new.ignore = [ ".uidvalidity" ".mbsyncstate" ];
home.file.".mbsyncrc".text = home.file.".mbsyncrc".text = let
let
accountsConfig = map genAccountConfig mbsyncAccounts; accountsConfig = map genAccountConfig mbsyncAccounts;
groupsConfig = mapAttrsToList genGroupConfig cfg.groups; groupsConfig = mapAttrsToList genGroupConfig cfg.groups;
in in concatStringsSep "\n" ([''
concatStringsSep "\n" ( # Generated by Home Manager.
[ "# Generated by Home Manager.\n" ] ''] ++ optional (cfg.extraConfig != "") cfg.extraConfig ++ accountsConfig
++ optional (cfg.extraConfig != "") cfg.extraConfig ++ groupsConfig) + "\n";
++ accountsConfig
++ groupsConfig
) + "\n";
home.activation = mkIf (mbsyncAccounts != [ ]) { home.activation = mkIf (mbsyncAccounts != [ ]) {
createMaildir = createMaildir =

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.mercurial; cfg = config.programs.mercurial;
in in {
{
options = { options = {
programs.mercurial = { programs.mercurial = {
@ -65,8 +63,7 @@ in
}; };
}; };
config = mkIf cfg.enable ( config = mkIf cfg.enable (mkMerge [
mkMerge [
{ {
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];
@ -81,9 +78,11 @@ in
programs.mercurial.iniContent.ui.ignore = programs.mercurial.iniContent.ui.ignore =
"${config.xdg.configHome}/hg/hgignore_global"; "${config.xdg.configHome}/hg/hgignore_global";
xdg.configFile."hg/hgignore_global".text = xdg.configFile."hg/hgignore_global".text = ''
"syntax: glob\n" + concatStringsSep "\n" cfg.ignores + "\n" + syntax: glob
"syntax: regexp\n" + concatStringsSep "\n" cfg.ignoresRegexp + "\n"; '' + concatStringsSep "\n" cfg.ignores + "\n" + ''
syntax: regexp
'' + concatStringsSep "\n" cfg.ignoresRegexp + "\n";
}) })
(mkIf (cfg.aliases != { }) { (mkIf (cfg.aliases != { }) {
@ -97,6 +96,5 @@ in
(mkIf (lib.isString cfg.extraConfig) { (mkIf (lib.isString cfg.extraConfig) {
xdg.configFile."hg/hgrc".text = cfg.extraConfig; xdg.configFile."hg/hgrc".text = cfg.extraConfig;
}) })
] ]);
);
} }

View file

@ -23,31 +23,21 @@ let
}.${typeOf option}; }.${typeOf option};
renderOptions = options: renderOptions = options:
concatStringsSep "\n" concatStringsSep "\n" (mapAttrsToList (name: value:
(mapAttrsToList
(name: value:
let let
rendered = renderOption value; rendered = renderOption value;
length = toString (stringLength rendered); length = toString (stringLength rendered);
in in "${name}=%${length}%${rendered}") options);
"${name}=%${length}%${rendered}")
options);
renderProfiles = profiles: renderProfiles = profiles:
concatStringsSep "\n" concatStringsSep "\n" (mapAttrsToList (name: value: ''
(mapAttrsToList
(name: value: ''
[${name}] [${name}]
${renderOptions value} ${renderOptions value}
'') '') profiles);
profiles);
renderBindings = bindings: renderBindings = bindings:
concatStringsSep "\n" concatStringsSep "\n"
(mapAttrsToList (mapAttrsToList (name: value: "${name} ${value}") bindings);
(name: value:
"${name} ${value}")
bindings);
in { in {
options = { options = {
@ -131,11 +121,12 @@ in {
config = mkIf cfg.enable (mkMerge [ config = mkIf cfg.enable (mkMerge [
{ {
home.packages = [( home.packages = [
if cfg.scripts == [] (if cfg.scripts == [ ] then
then pkgs.mpv pkgs.mpv
else pkgs.mpv-with-scripts.override { scripts = cfg.scripts; } else
)]; pkgs.mpv-with-scripts.override { scripts = cfg.scripts; })
];
} }
(mkIf (cfg.config != { } || cfg.profiles != { }) { (mkIf (cfg.config != { } || cfg.profiles != { }) {
xdg.configFile."mpv/mpv.conf".text = '' xdg.configFile."mpv/mpv.conf".text = ''

View file

@ -23,7 +23,8 @@ with lib;
}; };
tls.fingerprint = mkOption { tls.fingerprint = mkOption {
type = types.nullOr (types.strMatching "([[:alnum:]]{2}\:)+[[:alnum:]]{2}"); type =
types.nullOr (types.strMatching "([[:alnum:]]{2}:)+[[:alnum:]]{2}");
default = null; default = null;
example = "my:SH:a2:56:ha:sh"; example = "my:SH:a2:56:ha:sh";
description = '' description = ''

View file

@ -6,16 +6,15 @@ let
cfg = config.programs.msmtp; cfg = config.programs.msmtp;
msmtpAccounts = filter (a: a.msmtp.enable) msmtpAccounts =
(attrValues config.accounts.email.accounts); filter (a: a.msmtp.enable) (attrValues config.accounts.email.accounts);
onOff = p: if p then "on" else "off"; onOff = p: if p then "on" else "off";
accountStr = account: with account; accountStr = account:
concatStringsSep "\n" ( with account;
[ "account ${name}" ] concatStringsSep "\n" ([ "account ${name}" ]
++ mapAttrsToList (n: v: n + " " + v) ( ++ mapAttrsToList (n: v: n + " " + v) ({
{
host = smtp.host; host = smtp.host;
from = address; from = address;
auth = "on"; auth = "on";
@ -23,21 +22,16 @@ let
tls = onOff smtp.tls.enable; tls = onOff smtp.tls.enable;
tls_starttls = onOff smtp.tls.useStartTls; tls_starttls = onOff smtp.tls.useStartTls;
tls_trust_file = smtp.tls.certificatesFile; tls_trust_file = smtp.tls.certificatesFile;
} } // optionalAttrs (msmtp.tls.fingerprint != null) {
// optionalAttrs (msmtp.tls.fingerprint != null) {
tls_fingerprint = msmtp.tls.fingerprint; tls_fingerprint = msmtp.tls.fingerprint;
} } // optionalAttrs (smtp.port != null) { port = toString smtp.port; }
// optionalAttrs (smtp.port != null) {
port = toString smtp.port;
}
// optionalAttrs (passwordCommand != null) { // optionalAttrs (passwordCommand != null) {
# msmtp requires the password to finish with a newline. # msmtp requires the password to finish with a newline.
passwordeval = ''${pkgs.bash}/bin/bash -c "${toString passwordCommand}; echo"''; passwordeval =
} ''${pkgs.bash}/bin/bash -c "${toString passwordCommand}; echo"'';
// msmtp.extraConfig } // msmtp.extraConfig) ++ optional primary ''
)
++ optional primary "\naccount default : ${name}" account default : ${name}'');
);
configFile = mailAccounts: '' configFile = mailAccounts: ''
# Generated by Home Manager. # Generated by Home Manager.
@ -47,9 +41,7 @@ let
${concatStringsSep "\n\n" (map accountStr mailAccounts)} ${concatStringsSep "\n\n" (map accountStr mailAccounts)}
''; '';
in in {
{
options = { options = {
programs.msmtp = { programs.msmtp = {

View file

@ -26,10 +26,9 @@ with lib;
}; };
config = mkIf config.neomutt.enable { config = mkIf config.neomutt.enable {
neomutt.sendMailCommand = mkOptionDefault ( neomutt.sendMailCommand = mkOptionDefault (if config.msmtp.enable then
if config.msmtp.enable "msmtpq --read-envelope-from --read-recipients"
then "msmtpq --read-envelope-from --read-recipients" else
else null null);
);
}; };
} }

View file

@ -6,8 +6,8 @@ let
cfg = config.programs.neomutt; cfg = config.programs.neomutt;
neomuttAccounts = filter (a: a.neomutt.enable) neomuttAccounts =
(attrValues config.accounts.email.accounts); filter (a: a.neomutt.enable) (attrValues config.accounts.email.accounts);
sidebarModule = types.submodule { sidebarModule = types.submodule {
options = { options = {
@ -78,11 +78,10 @@ let
setOption = n: v: if v == null then "unset ${n}" else "set ${n}=${v}"; setOption = n: v: if v == null then "unset ${n}" else "set ${n}=${v}";
escape = replaceStrings [ "%" ] [ "%25" ]; escape = replaceStrings [ "%" ] [ "%25" ];
accountFilename = account: accountFilename = account: config.xdg.configHome + "/neomutt/" + account.name;
config.xdg.configHome + "/neomutt/" + account.name;
genCommonFolderHooks = account: with account; genCommonFolderHooks = account:
{ with account; {
from = "'${address}'"; from = "'${address}'";
realname = "'${realName}'"; realname = "'${realName}'";
spoolfile = "'+${folders.inbox}'"; spoolfile = "'+${folders.inbox}'";
@ -91,13 +90,13 @@ let
trash = "'+${folders.trash}'"; trash = "'+${folders.trash}'";
}; };
mtaSection = account: with account; mtaSection = account:
let with account;
passCmd = concatStringsSep " " passwordCommand; let passCmd = concatStringsSep " " passwordCommand;
in in if neomutt.sendMailCommand != null then {
if neomutt.sendMailCommand != null then {
sendmail = "'${neomutt.sendMailCommand}'"; sendmail = "'${neomutt.sendMailCommand}'";
} else let } else
let
smtpProto = if smtp.tls.enable then "smtps" else "smtp"; smtpProto = if smtp.tls.enable then "smtps" else "smtp";
smtpBaseUrl = "${smtpProto}://${escape userName}@${smtp.host}"; smtpBaseUrl = "${smtpProto}://${escape userName}@${smtp.host}";
in { in {
@ -105,35 +104,32 @@ let
smtp_pass = "'`${passCmd}`'"; smtp_pass = "'`${passCmd}`'";
}; };
genMaildirAccountConfig = account: with account; genMaildirAccountConfig = account:
with account;
let let
folderHook = folderHook = mapAttrsToList setOption (genCommonFolderHooks account // {
mapAttrsToList setOption ( folder = "'${account.maildir.absPath}'";
genCommonFolderHooks account }) ++ optional (neomutt.extraConfig != "") neomutt.extraConfig;
// { folder = "'${account.maildir.absPath}'"; } in ''
)
++ optional (neomutt.extraConfig != "") neomutt.extraConfig;
in
''
${concatStringsSep "\n" folderHook} ${concatStringsSep "\n" folderHook}
''; '';
registerAccount = account: with account; registerAccount = account:
'' with account; ''
# register account ${name} # register account ${name}
mailboxes "${account.maildir.absPath}/${folders.inbox}" mailboxes "${account.maildir.absPath}/${folders.inbox}"
folder-hook ${account.maildir.absPath}/ " \ folder-hook ${account.maildir.absPath}/ " \
source ${accountFilename account} " source ${accountFilename account} "
''; '';
mraSection = account: with account; mraSection = account:
if account.maildir != null with account;
then genMaildirAccountConfig account if account.maildir != null then
else throw "Only maildir is supported at the moment"; genMaildirAccountConfig account
else
optionsStr = attrs: throw "Only maildir is supported at the moment";
concatStringsSep "\n" (mapAttrsToList setOption attrs);
optionsStr = attrs: concatStringsSep "\n" (mapAttrsToList setOption attrs);
sidebarSection = '' sidebarSection = ''
# Sidebar # Sidebar
@ -143,30 +139,27 @@ let
set sidebar_format = '${cfg.sidebar.format}' set sidebar_format = '${cfg.sidebar.format}'
''; '';
bindSection = bindSection = concatMapStringsSep "\n"
concatMapStringsSep (bind: ''bind ${bind.map} ${bind.key} "${bind.action}"'') cfg.binds;
"\n"
(bind: "bind ${bind.map} ${bind.key} \"${bind.action}\"")
cfg.binds;
macroSection = macroSection = concatMapStringsSep "\n"
concatMapStringsSep (bind: ''macro ${bind.map} ${bind.key} "${bind.action}"'') cfg.macros;
"\n"
(bind: "macro ${bind.map} ${bind.key} \"${bind.action}\"")
cfg.macros;
mailCheckSection = '' mailCheckSection = ''
set mail_check_stats set mail_check_stats
set mail_check_stats_interval = ${toString cfg.checkStatsInterval} set mail_check_stats_interval = ${toString cfg.checkStatsInterval}
''; '';
notmuchSection = account: with account; '' notmuchSection = account:
with account; ''
# notmuch section # notmuch section
set nm_default_uri = "notmuch://${config.accounts.email.maildirBasePath}" set nm_default_uri = "notmuch://${config.accounts.email.maildirBasePath}"
virtual-mailboxes "My INBOX" "notmuch://?query=tag:inbox" virtual-mailboxes "My INBOX" "notmuch://?query=tag:inbox"
''; '';
accountStr = account: with account; '' accountStr = account:
with account;
''
# Generated by Home Manager. # Generated by Home Manager.
set ssl_force_tls = yes set ssl_force_tls = yes
set certificate_file=${config.accounts.email.certificatesFile} set certificate_file=${config.accounts.email.certificatesFile}
@ -190,15 +183,11 @@ let
# Extra configuration # Extra configuration
${account.neomutt.extraConfig} ${account.neomutt.extraConfig}
'' '' + optionalString (account.signature.showSignature != "none") ''
+ optionalString (account.signature.showSignature != "none") ''
set signature = ${pkgs.writeText "signature.txt" account.signature.text} set signature = ${pkgs.writeText "signature.txt" account.signature.text}
'' '' + optionalString account.notmuch.enable (notmuchSection account);
+ optionalString account.notmuch.enable (notmuchSection account);
in in {
{
options = { options = {
programs.neomutt = { programs.neomutt = {
enable = mkEnableOption "the NeoMutt mail client"; enable = mkEnableOption "the NeoMutt mail client";
@ -277,15 +266,11 @@ in
rcFile = account: { rcFile = account: {
"${accountFilename account}".text = accountStr account; "${accountFilename account}".text = accountStr account;
}; };
in in foldl' (a: b: a // b) { } (map rcFile neomuttAccounts);
foldl' (a: b: a // b) {} (map rcFile neomuttAccounts);
xdg.configFile."neomutt/neomuttrc" = mkIf (neomuttAccounts != [ ]) { xdg.configFile."neomutt/neomuttrc" = mkIf (neomuttAccounts != [ ]) {
text = text = let primary = filter (a: a.primary) neomuttAccounts;
let in ''
primary = filter (a: a.primary) neomuttAccounts;
in
''
# Generated by Home Manager. # Generated by Home Manager.
set header_cache = "${config.xdg.cacheHome}/neomutt/headers/" set header_cache = "${config.xdg.cacheHome}/neomutt/headers/"
set message_cachedir = "${config.xdg.cacheHome}/neomutt/messages/" set message_cachedir = "${config.xdg.cacheHome}/neomutt/messages/"
@ -302,16 +287,14 @@ in
# Macros # Macros
${macroSection} ${macroSection}
${optionalString cfg.vimKeys "source ${pkgs.neomutt}/share/doc/neomutt/vim-keys/vim-keys.rc"} ${optionalString cfg.vimKeys
"source ${pkgs.neomutt}/share/doc/neomutt/vim-keys/vim-keys.rc"}
# Extra configuration # Extra configuration
${optionsStr cfg.settings} ${optionsStr cfg.settings}
${cfg.extraConfig} ${cfg.extraConfig}
'' '' + concatMapStringsSep "\n" registerAccount neomuttAccounts +
+
concatMapStringsSep "\n" registerAccount neomuttAccounts
+
# source primary account # source primary account
"source ${accountFilename (builtins.head primary)}"; "source ${accountFilename (builtins.head primary)}";
}; };

View file

@ -4,11 +4,9 @@ with lib;
let let
cfg = config.programs.newsboat; cfg = config.programs.newsboat;
wrapQuote = x: "\"${x}\""; wrapQuote = x: ''"${x}"'';
in in {
{
options = { options = {
programs.newsboat = { programs.newsboat = {
enable = mkEnableOption "the Newsboat feed reader"; enable = mkEnableOption "the Newsboat feed reader";
@ -38,7 +36,10 @@ in
}; };
}); });
default = [ ]; default = [ ];
example = [{url = "http://example.com"; tags = ["foo" "bar"];}]; example = [{
url = "http://example.com";
tags = [ "foo" "bar" ];
}];
description = "List of news feeds."; description = "List of news feeds.";
}; };
@ -57,7 +58,9 @@ in
autoReload = mkOption { autoReload = mkOption {
type = types.bool; type = types.bool;
default = false; default = false;
description = "Whether to enable automatic reloading while newsboat is running."; description = ''
Whether to enable automatic reloading while newsboat is running.
'';
}; };
reloadTime = mkOption { reloadTime = mkOption {
@ -75,42 +78,39 @@ in
queries = mkOption { queries = mkOption {
type = types.attrsOf types.str; type = types.attrsOf types.str;
default = { }; default = { };
example = { example = { "foo" = ''rssurl =~ "example.com"''; };
"foo" = "rssurl =~ \"example.com\"";
};
description = "A list of queries to use."; description = "A list of queries to use.";
}; };
extraConfig = mkOption { extraConfig = mkOption {
type = types.lines; type = types.lines;
default = ""; default = "";
description = "Extra configuration values that will be appended to the end."; description = ''
Extra configuration values that will be appended to the end.
'';
}; };
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.newsboat ]; home.packages = [ pkgs.newsboat ];
home.file.".newsboat/urls".text = home.file.".newsboat/urls".text = let
let mkUrlEntry = u:
mkUrlEntry = u: concatStringsSep " " ( concatStringsSep " " ([ u.url ] ++ map wrapQuote u.tags
[u.url] ++ optional (u.title != null) (wrapQuote "~${u.title}"));
++ map wrapQuote u.tags
++ optional (u.title != null) (wrapQuote "~${u.title}")
);
urls = map mkUrlEntry cfg.urls; urls = map mkUrlEntry cfg.urls;
mkQueryEntry = n: v: "\"query:${n}:${escape ["\""] v}\""; mkQueryEntry = n: v: ''"query:${n}:${escape [ ''"'' ] v}"'';
queries = mapAttrsToList mkQueryEntry cfg.queries; queries = mapAttrsToList mkQueryEntry cfg.queries;
in in concatStringsSep "\n" (urls ++ queries) + "\n";
concatStringsSep "\n" (urls ++ queries) + "\n";
home.file.".newsboat/config".text = '' home.file.".newsboat/config".text = ''
max-items ${toString cfg.maxItems} max-items ${toString cfg.maxItems}
browser ${cfg.browser} browser ${cfg.browser}
reload-threads ${toString cfg.reloadThreads} reload-threads ${toString cfg.reloadThreads}
auto-reload ${if cfg.autoReload then "yes" else "no"} auto-reload ${if cfg.autoReload then "yes" else "no"}
${optionalString (cfg.reloadTime != null) (toString "reload-time ${toString cfg.reloadTime}")} ${optionalString (cfg.reloadTime != null)
(toString "reload-time ${toString cfg.reloadTime}")}
prepopulate-query-feeds yes prepopulate-query-feeds yes
${cfg.extraConfig} ${cfg.extraConfig}

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.noti; cfg = config.programs.noti;
in in {
{
meta.maintainers = [ maintainers.marsam ]; meta.maintainers = [ maintainers.marsam ];
options.programs.noti = { options.programs.noti = {
@ -45,9 +43,8 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.noti ]; home.packages = [ pkgs.noti ];
xdg.configFile."noti/noti.yaml" = mkIf (cfg.settings != {}) { xdg.configFile."noti/noti.yaml" =
text = generators.toYAML {} cfg.settings; mkIf (cfg.settings != { }) { text = generators.toYAML { } cfg.settings; };
};
}; };
} }

View file

@ -1,7 +1,5 @@
{ lib, ... }: { lib, ... }:
{ {
options.notmuch = { options.notmuch = { enable = lib.mkEnableOption "notmuch indexing"; };
enable = lib.mkEnableOption "notmuch indexing";
};
} }

View file

@ -9,53 +9,42 @@ let
mkIniKeyValue = key: value: mkIniKeyValue = key: value:
let let
tweakVal = v: tweakVal = v:
if isString v then v if isString v then
else if isList v then concatMapStringsSep ";" tweakVal v v
else if isBool v then (if v then "true" else "false") else if isList v then
else toString v; concatMapStringsSep ";" tweakVal v
in else if isBool v then
"${key}=${tweakVal value}"; (if v then "true" else "false")
else
toString v;
in "${key}=${tweakVal value}";
notmuchIni = notmuchIni = recursiveUpdate {
recursiveUpdate database = { path = config.accounts.email.maildirBasePath; };
{
database = {
path = config.accounts.email.maildirBasePath;
};
maildir = { maildir = { synchronize_flags = cfg.maildir.synchronizeFlags; };
synchronize_flags = cfg.maildir.synchronizeFlags;
};
new = { new = {
ignore = cfg.new.ignore; ignore = cfg.new.ignore;
tags = cfg.new.tags; tags = cfg.new.tags;
}; };
user = user = let
let accounts = filter (a: a.notmuch.enable)
accounts =
filter (a: a.notmuch.enable)
(attrValues config.accounts.email.accounts); (attrValues config.accounts.email.accounts);
primary = filter (a: a.primary) accounts; primary = filter (a: a.primary) accounts;
secondaries = filter (a: !a.primary) accounts; secondaries = filter (a: !a.primary) accounts;
in { in {
name = catAttrs "realName" primary; name = catAttrs "realName" primary;
primary_email = catAttrs "address" primary; primary_email = catAttrs "address" primary;
other_email = catAttrs "aliases" primary other_email = catAttrs "aliases" primary ++ catAttrs "address" secondaries
++ catAttrs "address" secondaries
++ catAttrs "aliases" secondaries; ++ catAttrs "aliases" secondaries;
}; };
search = { search = { exclude_tags = cfg.search.excludeTags; };
exclude_tags = cfg.search.excludeTags; } cfg.extraConfig;
};
}
cfg.extraConfig;
in in {
{
options = { options = {
programs.notmuch = { programs.notmuch = {
enable = mkEnableOption "Notmuch mail indexer"; enable = mkEnableOption "Notmuch mail indexer";
@ -176,16 +165,14 @@ in
}; };
xdg.configFile."notmuch/notmuchrc".text = xdg.configFile."notmuch/notmuchrc".text =
let let toIni = generators.toINI { mkKeyValue = mkIniKeyValue; };
toIni = generators.toINI { mkKeyValue = mkIniKeyValue; }; in ''
in # Generated by Home Manager.
"# Generated by Home Manager.\n\n"
+ toIni notmuchIni;
home.file = '' + toIni notmuchIni;
let
hook = name: cmds: home.file = let
{ hook = name: cmds: {
"${notmuchIni.database.path}/.notmuch/hooks/${name}".source = "${notmuchIni.database.path}/.notmuch/hooks/${name}".source =
pkgs.writeShellScript name '' pkgs.writeShellScript name ''
export PATH="${pkgs.notmuch}/bin''${PATH:+:}$PATH" export PATH="${pkgs.notmuch}/bin''${PATH:+:}$PATH"
@ -195,14 +182,10 @@ in
${cmds} ${cmds}
''; '';
}; };
in in optionalAttrs (cfg.hooks.preNew != "") (hook "pre-new" cfg.hooks.preNew)
optionalAttrs (cfg.hooks.preNew != "") // optionalAttrs (cfg.hooks.postNew != "")
(hook "pre-new" cfg.hooks.preNew)
//
optionalAttrs (cfg.hooks.postNew != "")
(hook "post-new" cfg.hooks.postNew) (hook "post-new" cfg.hooks.postNew)
// // optionalAttrs (cfg.hooks.postInsert != "")
optionalAttrs (cfg.hooks.postInsert != "")
(hook "post-insert" cfg.hooks.postInsert); (hook "post-insert" cfg.hooks.postInsert);
}; };
} }

View file

@ -11,13 +11,10 @@ let
let let
pluginDirs = map (pkg: "${pkg}/share/obs/obs-plugins") packages; pluginDirs = map (pkg: "${pkg}/share/obs/obs-plugins") packages;
plugins = concatMapStringsSep " " (p: "${p}/*") pluginDirs; plugins = concatMapStringsSep " " (p: "${p}/*") pluginDirs;
in in pkgs.runCommand "obs-studio-plugins" {
pkgs.runCommand "obs-studio-plugins"
{
preferLocalBuild = true; preferLocalBuild = true;
allowSubstitutes = false; allowSubstitutes = false;
} } ''
''
mkdir $out mkdir $out
[[ '${plugins}' ]] || exit 0 [[ '${plugins}' ]] || exit 0
for plugin in ${plugins}; do for plugin in ${plugins}; do
@ -25,9 +22,7 @@ let
done done
''; '';
in in {
{
meta.maintainers = [ maintainers.adisbladis ]; meta.maintainers = [ maintainers.adisbladis ];
options = { options = {
@ -46,8 +41,7 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ package ]; home.packages = [ package ];
xdg.configFile."obs-studio/plugins" = mkIf (cfg.plugins != []) { xdg.configFile."obs-studio/plugins" =
source = mkPluginEnv cfg.plugins; mkIf (cfg.plugins != [ ]) { source = mkPluginEnv cfg.plugins; };
};
}; };
} }

View file

@ -6,18 +6,14 @@ let
extraConfigType = with types; attrsOf (either (either str int) bool); extraConfigType = with types; attrsOf (either (either str int) bool);
in in {
{
options.offlineimap = { options.offlineimap = {
enable = mkEnableOption "OfflineIMAP"; enable = mkEnableOption "OfflineIMAP";
extraConfig.account = mkOption { extraConfig.account = mkOption {
type = extraConfigType; type = extraConfigType;
default = { }; default = { };
example = { example = { autorefresh = 20; };
autorefresh = 20;
};
description = '' description = ''
Extra configuration options to add to the account section. Extra configuration options to add to the account section.
''; '';
@ -26,9 +22,7 @@ in
extraConfig.local = mkOption { extraConfig.local = mkOption {
type = extraConfigType; type = extraConfigType;
default = { }; default = { };
example = { example = { sync_deletes = true; };
sync_deletes = true;
};
description = '' description = ''
Extra configuration options to add to the local account Extra configuration options to add to the local account
section. section.

View file

@ -12,11 +12,11 @@ let
toIni = generators.toINI { toIni = generators.toINI {
mkKeyValue = key: value: mkKeyValue = key: value:
let let
value' = value' = if isBool value then
if isBool value then (if value then "yes" else "no") (if value then "yes" else "no")
else toString value; else
in toString value;
"${key} = ${value'}"; in "${key} = ${value'}";
}; };
# Generates a script to fetch only a specific account. # Generates a script to fetch only a specific account.
@ -29,90 +29,65 @@ let
# Something like # Something like
# #
# $ email <account name> <program name> <program args> # $ email <account name> <program name> <program args>
genOfflineImapScript = account: with account; genOfflineImapScript = account:
with account;
pkgs.writeShellScriptBin "offlineimap-${name}" '' pkgs.writeShellScriptBin "offlineimap-${name}" ''
exec ${pkgs.offlineimap}/bin/offlineimap -a${account.name} "$@" exec ${pkgs.offlineimap}/bin/offlineimap -a${account.name} "$@"
''; '';
accountStr = account: with account; accountStr = account:
with account;
let let
postSyncHook = optionalAttrs (offlineimap.postSyncHookCommand != "") { postSyncHook = optionalAttrs (offlineimap.postSyncHookCommand != "") {
postsynchook = postsynchook = pkgs.writeShellScriptBin "postsynchook"
pkgs.writeShellScriptBin offlineimap.postSyncHookCommand + "/bin/postsynchook";
"postsynchook"
offlineimap.postSyncHookCommand
+ "/bin/postsynchook";
}; };
localType = localType =
if account.flavor == "gmail.com" if account.flavor == "gmail.com" then "GmailMaildir" else "Maildir";
then "GmailMaildir"
else "Maildir";
remoteType = remoteType = if account.flavor == "gmail.com" then "Gmail" else "IMAP";
if account.flavor == "gmail.com"
then "Gmail"
else "IMAP";
remoteHost = optionalAttrs (imap.host != null) { remoteHost =
remotehost = imap.host; optionalAttrs (imap.host != null) { remotehost = imap.host; };
};
remotePort = optionalAttrs ((imap.port or null) != null) { remotePort =
remoteport = imap.port; optionalAttrs ((imap.port or null) != null) { remoteport = imap.port; };
};
ssl = ssl = if imap.tls.enable then {
if imap.tls.enable
then
{
ssl = true; ssl = true;
sslcacertfile = imap.tls.certificatesFile; sslcacertfile = imap.tls.certificatesFile;
starttls = imap.tls.useStartTls; starttls = imap.tls.useStartTls;
} } else {
else
{
ssl = false; ssl = false;
}; };
remotePassEval = remotePassEval =
let let arglist = concatMapStringsSep "," (x: "'${x}'") passwordCommand;
arglist = concatMapStringsSep "," (x: "'${x}'") passwordCommand; in optionalAttrs (passwordCommand != null) {
in
optionalAttrs (passwordCommand != null) {
remotepasseval = ''get_pass("${name}", [${arglist}])''; remotepasseval = ''get_pass("${name}", [${arglist}])'';
}; };
in in toIni {
toIni {
"Account ${name}" = { "Account ${name}" = {
localrepository = "${name}-local"; localrepository = "${name}-local";
remoterepository = "${name}-remote"; remoterepository = "${name}-remote";
} } // postSyncHook // offlineimap.extraConfig.account;
// postSyncHook
// offlineimap.extraConfig.account;
"Repository ${name}-local" = { "Repository ${name}-local" = {
type = localType; type = localType;
localfolders = maildir.absPath; localfolders = maildir.absPath;
} } // offlineimap.extraConfig.local;
// offlineimap.extraConfig.local;
"Repository ${name}-remote" = { "Repository ${name}-remote" = {
type = remoteType; type = remoteType;
remoteuser = userName; remoteuser = userName;
} } // remoteHost // remotePort // remotePassEval // ssl
// remoteHost
// remotePort
// remotePassEval
// ssl
// offlineimap.extraConfig.remote; // offlineimap.extraConfig.remote;
}; };
extraConfigType = with types; attrsOf (either (either str int) bool); extraConfigType = with types; attrsOf (either (either str int) bool);
in in {
{
options = { options = {
programs.offlineimap = { programs.offlineimap = {
enable = mkEnableOption "OfflineIMAP"; enable = mkEnableOption "OfflineIMAP";
@ -147,9 +122,7 @@ in
extraConfig.default = mkOption { extraConfig.default = mkOption {
type = extraConfigType; type = extraConfigType;
default = { }; default = { };
example = { example = { gmailtrashfolder = "[Gmail]/Papierkorb"; };
gmailtrashfolder = "[Gmail]/Papierkorb";
};
description = '' description = ''
Extra configuration options added to the Extra configuration options added to the
<option>DEFAULT</option> section. <option>DEFAULT</option> section.
@ -181,27 +154,20 @@ in
xdg.configFile."offlineimap/get_settings.py".text = cfg.pythonFile; xdg.configFile."offlineimap/get_settings.py".text = cfg.pythonFile;
xdg.configFile."offlineimap/config".text = xdg.configFile."offlineimap/config".text = ''
''
# Generated by Home Manager. # Generated by Home Manager.
# See https://github.com/OfflineIMAP/offlineimap/blob/master/offlineimap.conf # See https://github.com/OfflineIMAP/offlineimap/blob/master/offlineimap.conf
# for an exhaustive list of options. # for an exhaustive list of options.
'' '' + toIni ({
+ toIni ({
general = { general = {
accounts = concatMapStringsSep "," (a: a.name) accounts; accounts = concatMapStringsSep "," (a: a.name) accounts;
pythonfile = "${config.xdg.configHome}/offlineimap/get_settings.py"; pythonfile = "${config.xdg.configHome}/offlineimap/get_settings.py";
metadata = "${config.xdg.dataHome}/offlineimap"; metadata = "${config.xdg.dataHome}/offlineimap";
} } // cfg.extraConfig.general;
// cfg.extraConfig.general; } // optionalAttrs (cfg.extraConfig.mbnames != { }) {
}
// optionalAttrs (cfg.extraConfig.mbnames != {}) {
mbnames = { enabled = true; } // cfg.extraConfig.mbnames; mbnames = { enabled = true; } // cfg.extraConfig.mbnames;
} } // optionalAttrs (cfg.extraConfig.default != { }) {
// optionalAttrs (cfg.extraConfig.default != {}) {
DEFAULT = cfg.extraConfig.default; DEFAULT = cfg.extraConfig.default;
}) }) + "\n" + concatStringsSep "\n" (map accountStr accounts);
+ "\n"
+ concatStringsSep "\n" (map accountStr accounts);
}; };
} }

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.opam; cfg = config.programs.opam;
in in {
{
meta.maintainers = [ maintainers.marsam ]; meta.maintainers = [ maintainers.marsam ];
options.programs.opam = { options.programs.opam = {

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.password-store; cfg = config.programs.password-store;
in in {
{
meta.maintainers = with maintainers; [ pacien ]; meta.maintainers = with maintainers; [ pacien ];
options.programs.password-store = { options.programs.password-store = {

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.pazi; cfg = config.programs.pazi;
in in {
{
meta.maintainers = [ maintainers.marsam ]; meta.maintainers = [ maintainers.marsam ];
options.programs.pazi = { options.programs.pazi = {

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.pidgin; cfg = config.programs.pidgin;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {

View file

@ -9,26 +9,28 @@ let
mkSetVariableStr = n: v: mkSetVariableStr = n: v:
let let
mkValueStr = v: mkValueStr = v:
if v == true then "on" if v == true then
else if v == false then "off" "on"
else if isInt v then toString v else if v == false then
else if isString v then v "off"
else abort ("values ${toPretty v} is of unsupported type"); else if isInt v then
in toString v
"set ${n} ${mkValueStr v}"; else if isString v then
v
else
abort ("values ${toPretty v} is of unsupported type");
in "set ${n} ${mkValueStr v}";
mkBindingStr = k: v: "\"${k}\": ${v}"; mkBindingStr = k: v: ''"${k}": ${v}'';
in in {
{
options.programs.readline = { options.programs.readline = {
enable = mkEnableOption "readline"; enable = mkEnableOption "readline";
bindings = mkOption { bindings = mkOption {
default = { }; default = { };
type = types.attrsOf types.str; type = types.attrsOf types.str;
example = { "\C-h" = "backward-kill-word"; }; example = { "\\C-h" = "backward-kill-word"; };
description = "Readline bindings."; description = "Readline bindings.";
}; };
@ -58,15 +60,12 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.file.".inputrc".text = home.file.".inputrc".text = let
let configStr = concatStringsSep "\n"
configStr = concatStringsSep "\n" ( (optional cfg.includeSystemConfig "$include /etc/inputrc"
optional cfg.includeSystemConfig "$include /etc/inputrc"
++ mapAttrsToList mkSetVariableStr cfg.variables ++ mapAttrsToList mkSetVariableStr cfg.variables
++ mapAttrsToList mkBindingStr cfg.bindings ++ mapAttrsToList mkBindingStr cfg.bindings);
); in ''
in
''
# Generated by Home Manager. # Generated by Home Manager.
${configStr} ${configStr}

View file

@ -7,7 +7,8 @@ let
cfg = config.programs.rofi; cfg = config.programs.rofi;
colorOption = description: mkOption { colorOption = description:
mkOption {
type = types.str; type = types.str;
description = description; description = description;
}; };
@ -71,29 +72,22 @@ let
}; };
valueToString = value: valueToString = value:
if isBool value if isBool value then (if value then "true" else "else") else toString value;
then (if value then "true" else "else")
else toString value;
windowColorsToString = window: concatStringsSep ", " (with window; [ windowColorsToString = window:
background concatStringsSep ", " (with window; [ background border separator ]);
border
separator
]);
rowsColorsToString = rows: '' rowsColorsToString = rows: ''
${optionalString ${optionalString (rows.normal != null)
(rows.normal != null)
(setOption "color-normal" (rowColorsToString rows.normal))} (setOption "color-normal" (rowColorsToString rows.normal))}
${optionalString ${optionalString (rows.active != null)
(rows.active != null)
(setOption "color-active" (rowColorsToString rows.active))} (setOption "color-active" (rowColorsToString rows.active))}
${optionalString ${optionalString (rows.urgent != null)
(rows.urgent != null)
(setOption "color-urgent" (rowColorsToString rows.urgent))} (setOption "color-urgent" (rowColorsToString rows.urgent))}
''; '';
rowColorsToString = row: concatStringsSep ", " (with row; [ rowColorsToString = row:
concatStringsSep ", " (with row; [
background background
foreground foreground
backgroundAlt backgroundAlt
@ -104,13 +98,11 @@ let
setOption = name: value: setOption = name: value:
optionalString (value != null) "rofi.${name}: ${valueToString value}"; optionalString (value != null) "rofi.${name}: ${valueToString value}";
setColorScheme = colors: optionalString (colors != null) '' setColorScheme = colors:
${optionalString optionalString (colors != null) ''
(colors.window != null) ${optionalString (colors.window != null) setOption "color-window"
setOption "color-window" (windowColorsToString colors.window)} (windowColorsToString colors.window)}
${optionalString ${optionalString (colors.rows != null) (rowsColorsToString colors.rows)}
(colors.rows != null)
(rowsColorsToString colors.rows)}
''; '';
locationsMap = { locationsMap = {
@ -125,18 +117,19 @@ let
left = 8; left = 8;
}; };
themeName = themeName = if (cfg.theme == null) then
if (cfg.theme == null) then null null
else if (lib.isString cfg.theme) then cfg.theme else if (lib.isString cfg.theme) then
else lib.removeSuffix ".rasi" (baseNameOf cfg.theme); cfg.theme
else
lib.removeSuffix ".rasi" (baseNameOf cfg.theme);
themePath = if (lib.isString cfg.theme) then null else cfg.theme; themePath = if (lib.isString cfg.theme) then null else cfg.theme;
in in {
{
options.programs.rofi = { options.programs.rofi = {
enable = mkEnableOption "Rofi: A window switcher, application launcher and dmenu replacement"; enable = mkEnableOption
"Rofi: A window switcher, application launcher and dmenu replacement";
width = mkOption { width = mkOption {
default = null; default = null;
@ -295,14 +288,12 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = [ assertions = [{
{
assertion = cfg.theme == null || cfg.colors == null; assertion = cfg.theme == null || cfg.colors == null;
message = '' message = ''
Cannot use the rofi options 'theme' and 'colors' simultaneously. Cannot use the rofi options 'theme' and 'colors' simultaneously.
''; '';
} }];
];
home.packages = [ pkgs.rofi ]; home.packages = [ pkgs.rofi ];
@ -314,11 +305,8 @@ in
${setOption "eh" cfg.rowHeight} ${setOption "eh" cfg.rowHeight}
${setOption "padding" cfg.padding} ${setOption "padding" cfg.padding}
${setOption "separator-style" cfg.separator} ${setOption "separator-style" cfg.separator}
${setOption "hide-scrollbar" ( ${setOption "hide-scrollbar"
if (cfg.scrollbar != null) (if (cfg.scrollbar != null) then (!cfg.scrollbar) else cfg.scrollbar)}
then (! cfg.scrollbar)
else cfg.scrollbar
)}
${setOption "terminal" cfg.terminal} ${setOption "terminal" cfg.terminal}
${setOption "cycle" cfg.cycle} ${setOption "cycle" cfg.cycle}
${setOption "fullscreen" cfg.fullscreen} ${setOption "fullscreen" cfg.fullscreen}

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.rtorrent; cfg = config.programs.rtorrent;
in in {
{
meta.maintainers = [ maintainers.marsam ]; meta.maintainers = [ maintainers.marsam ];
options.programs.rtorrent = { options.programs.rtorrent = {
@ -30,8 +28,7 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.rtorrent ]; home.packages = [ pkgs.rtorrent ];
xdg.configFile."rtorrent/rtorrent.rc" = mkIf (cfg.settings != "") { xdg.configFile."rtorrent/rtorrent.rc" =
text = cfg.settings; mkIf (cfg.settings != "") { text = cfg.settings; };
};
}; };
} }

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.skim; cfg = config.programs.skim;
in in {
{
options.programs.skim = { options.programs.skim = {
enable = mkEnableOption "skim - a command-line fuzzy finder"; enable = mkEnableOption "skim - a command-line fuzzy finder";
@ -98,9 +96,8 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.skim ]; home.packages = [ pkgs.skim ];
home.sessionVariables = home.sessionVariables = mapAttrs (n: v: toString v)
mapAttrs (n: v: toString v) ( (filterAttrs (n: v: v != [ ] && v != null) {
filterAttrs (n: v: v != [] && v != null) {
SKIM_ALT_C_COMMAND = cfg.changeDirWidgetCommand; SKIM_ALT_C_COMMAND = cfg.changeDirWidgetCommand;
SKIM_ALT_C_OPTS = cfg.changeDirWidgetOptions; SKIM_ALT_C_OPTS = cfg.changeDirWidgetOptions;
SKIM_CTRL_R_OPTS = cfg.historyWidgetOptions; SKIM_CTRL_R_OPTS = cfg.historyWidgetOptions;
@ -108,8 +105,7 @@ in
SKIM_CTRL_T_OPTS = cfg.fileWidgetOptions; SKIM_CTRL_T_OPTS = cfg.fileWidgetOptions;
SKIM_DEFAULT_COMMAND = cfg.defaultCommand; SKIM_DEFAULT_COMMAND = cfg.defaultCommand;
SKIM_DEFAULT_OPTIONS = cfg.defaultOptions; SKIM_DEFAULT_OPTIONS = cfg.defaultOptions;
} });
);
programs.bash.initExtra = mkIf cfg.enableBashIntegration '' programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
if [[ :$SHELLOPTS: =~ :(vi|emacs): ]]; then if [[ :$SHELLOPTS: =~ :(vi|emacs): ]]; then

View file

@ -7,20 +7,17 @@ let
cfg = config.programs.starship; cfg = config.programs.starship;
configFile = config: configFile = config:
pkgs.runCommand "config.toml" pkgs.runCommand "config.toml" {
{
buildInputs = [ pkgs.remarshal ]; buildInputs = [ pkgs.remarshal ];
preferLocalBuild = true; preferLocalBuild = true;
allowSubstitutes = false; allowSubstitutes = false;
} } ''
''
remarshal -if json -of toml \ remarshal -if json -of toml \
< ${pkgs.writeText "config.json" (builtins.toJSON config)} \ < ${pkgs.writeText "config.json" (builtins.toJSON config)} \
> $out > $out
''; '';
in
{ in {
meta.maintainers = [ maintainers.marsam ]; meta.maintainers = [ maintainers.marsam ];
options.programs.starship = { options.programs.starship = {
@ -73,9 +70,8 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];
xdg.configFile."starship.toml" = mkIf (cfg.settings != {}) { xdg.configFile."starship.toml" =
source = configFile cfg.settings; mkIf (cfg.settings != { }) { source = configFile cfg.settings; };
};
programs.bash.initExtra = mkIf cfg.enableBashIntegration '' programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
if [[ -z $INSIDE_EMACS ]]; then if [[ -z $INSIDE_EMACS ]]; then

View file

@ -9,31 +9,32 @@ let
themePath = theme: "${pkgs.taskwarrior}/share/doc/task/rc/${theme}.theme"; themePath = theme: "${pkgs.taskwarrior}/share/doc/task/rc/${theme}.theme";
includeTheme = location: includeTheme = location:
if location == null then "" if location == null then
else if isString location then "include ${themePath location}" ""
else "include ${location}"; else if isString location then
"include ${themePath location}"
else
"include ${location}";
formatValue = value: formatValue = value:
if isBool value then if value then "true" else "false" if isBool value then
else if isList value then concatMapStringsSep "," formatValue value if value then "true" else "false"
else toString value; else if isList value then
concatMapStringsSep "," formatValue value
else
toString value;
formatLine = key: value: formatLine = key: value: "${key}=${formatValue value}";
"${key}=${formatValue value}";
formatSet = key: values: formatSet = key: values:
(concatStringsSep "\n" (concatStringsSep "\n"
(mapAttrsToList (mapAttrsToList (subKey: subValue: formatPair "${key}.${subKey}" subValue)
(subKey: subValue: formatPair "${key}.${subKey}" subValue)
values)); values));
formatPair = key: value: formatPair = key: value:
if isAttrs value then formatSet key value if isAttrs value then formatSet key value else formatLine key value;
else formatLine key value;
in in {
{
options = { options = {
programs.taskwarrior = { programs.taskwarrior = {
enable = mkEnableOption "Task Warrior"; enable = mkEnableOption "Task Warrior";
@ -103,8 +104,7 @@ in
data.location=${cfg.dataLocation} data.location=${cfg.dataLocation}
${includeTheme cfg.colorTheme} ${includeTheme cfg.colorTheme}
${concatStringsSep "\n" ( ${concatStringsSep "\n" (mapAttrsToList formatPair cfg.config)}
mapAttrsToList formatPair cfg.config)}
${cfg.extraConfig} ${cfg.extraConfig}
''; '';

View file

@ -13,9 +13,7 @@ let
fi fi
''; '';
in in {
{
options = { options = {
programs.termite = { programs.termite = {
enable = mkEnableOption "Termite VTE-based terminal"; enable = mkEnableOption "Termite VTE-based terminal";
@ -61,7 +59,9 @@ in
mouseAutohide = mkOption { mouseAutohide = mkOption {
default = null; default = null;
type = types.nullOr types.bool; type = types.nullOr types.bool;
description = "Automatically hide the mouse pointer when you start typing."; description = ''
Automatically hide the mouse pointer when you start typing.
'';
}; };
scrollOnOutput = mkOption { scrollOnOutput = mkOption {
@ -73,7 +73,9 @@ in
scrollOnKeystroke = mkOption { scrollOnKeystroke = mkOption {
default = null; default = null;
type = types.nullOr types.bool; type = types.nullOr types.bool;
description = "Scroll to the bottom automatically when a key is pressed."; description = ''
Scroll to the bottom automatically when a key is pressed.
'';
}; };
searchWrap = mkOption { searchWrap = mkOption {
@ -106,14 +108,16 @@ in
default = null; default = null;
example = "terminal"; example = "terminal";
type = types.nullOr types.str; type = types.nullOr types.str;
description = "The name of the icon to be used for the terminal process."; description =
"The name of the icon to be used for the terminal process.";
}; };
scrollbackLines = mkOption { scrollbackLines = mkOption {
default = null; default = null;
example = 10000; example = 10000;
type = types.nullOr types.int; type = types.nullOr types.int;
description = "Set the number of lines to limit the terminal's scrollback."; description =
"Set the number of lines to limit the terminal's scrollback.";
}; };
browser = mkOption { browser = mkOption {
@ -149,7 +153,8 @@ in
filterUnmatchedUrls = mkOption { filterUnmatchedUrls = mkOption {
default = null; default = null;
type = types.nullOr types.bool; type = types.nullOr types.bool;
description = "Whether to hide url hints not matching input in url hints mode."; description =
"Whether to hide url hints not matching input in url hints mode.";
}; };
modifyOtherKeys = mkOption { modifyOtherKeys = mkOption {
@ -290,7 +295,8 @@ in
default = ""; default = "";
example = "fullscreen = true"; example = "fullscreen = true";
type = types.lines; type = types.lines;
description = "Extra options that should be added to [options] section."; description =
"Extra options that should be added to [options] section.";
}; };
colorsExtra = mkOption { colorsExtra = mkOption {
@ -301,24 +307,28 @@ in
color2 = #60b48a color2 = #60b48a
''; '';
type = types.lines; type = types.lines;
description = "Extra colors options that should be added to [colors] section."; description =
"Extra colors options that should be added to [colors] section.";
}; };
hintsExtra = mkOption { hintsExtra = mkOption {
default = ""; default = "";
example = "border = #3f3f3f"; example = "border = #3f3f3f";
type = types.lines; type = types.lines;
description = "Extra hints options that should be added to [hints] section."; description =
"Extra hints options that should be added to [hints] section.";
}; };
}; };
}; };
config = ( config = (let
let
boolToString = v: if v then "true" else "false"; boolToString = v: if v then "true" else "false";
optionalBoolean = name: val: lib.optionalString (val != null) "${name} = ${boolToString val}"; optionalBoolean = name: val:
optionalInteger = name: val: lib.optionalString (val != null) "${name} = ${toString val}"; lib.optionalString (val != null) "${name} = ${boolToString val}";
optionalString = name: val: lib.optionalString (val != null) "${name} = ${val}"; optionalInteger = name: val:
lib.optionalString (val != null) "${name} = ${toString val}";
optionalString = name: val:
lib.optionalString (val != null) "${name} = ${val}";
in mkIf cfg.enable { in mkIf cfg.enable {
home.packages = [ pkgs.termite ]; home.packages = [ pkgs.termite ];
xdg.configFile."termite/config".text = '' xdg.configFile."termite/config".text = ''
@ -373,6 +383,5 @@ in
programs.bash.initExtra = vteInitStr; programs.bash.initExtra = vteInitStr;
programs.zsh.initExtra = vteInitStr; programs.zsh.initExtra = vteInitStr;
} });
);
} }

View file

@ -8,9 +8,7 @@ let
texlivePkgs = cfg.extraPackages pkgs.texlive; texlivePkgs = cfg.extraPackages pkgs.texlive;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
@ -35,13 +33,11 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = [ assertions = [{
{
assertion = texlivePkgs != { }; assertion = texlivePkgs != { };
message = "Must provide at least one extra package in" message = "Must provide at least one extra package in"
+ " 'programs.texlive.extraPackages'."; + " 'programs.texlive.extraPackages'.";
} }];
];
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];

View file

@ -6,9 +6,7 @@ let
cfg = config.programs.urxvt; cfg = config.programs.urxvt;
in in {
{
options.programs.urxvt = { options.programs.urxvt = {
enable = mkEnableOption "rxvt-unicode terminal emulator"; enable = mkEnableOption "rxvt-unicode terminal emulator";
@ -41,7 +39,8 @@ in
iso14755 = mkOption { iso14755 = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
description = "ISO14755 support for viewing and entering unicode characters."; description =
"ISO14755 support for viewing and entering unicode characters.";
}; };
scroll = { scroll = {
@ -75,7 +74,8 @@ in
floating = mkOption { floating = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
description = "Whether to display an rxvt scrollbar without a trough."; description =
"Whether to display an rxvt scrollbar without a trough.";
}; };
}; };
}; };
@ -92,7 +92,8 @@ in
keepPosition = mkOption { keepPosition = mkOption {
type = types.bool; type = types.bool;
default = true; default = true;
description = "Whether to keep a scroll position when TTY receives new lines."; description =
"Whether to keep a scroll position when TTY receives new lines.";
}; };
scrollOnKeystroke = mkOption { scrollOnKeystroke = mkOption {
@ -117,7 +118,8 @@ in
shading = mkOption { shading = mkOption {
type = types.ints.between 0 200; type = types.ints.between 0 200;
default = 100; default = 100;
description = "Darken (0 .. 99) or lighten (101 .. 200) the transparent background."; description =
"Darken (0 .. 99) or lighten (101 .. 200) the transparent background.";
}; };
extraConfig = mkOption { extraConfig = mkOption {
@ -145,12 +147,10 @@ in
"URxvt.transparent" = cfg.transparent; "URxvt.transparent" = cfg.transparent;
"URxvt.shading" = cfg.shading; "URxvt.shading" = cfg.shading;
"URxvt.iso14755" = cfg.iso14755; "URxvt.iso14755" = cfg.iso14755;
} // flip mapAttrs' cfg.keybindings (kb: action: } // flip mapAttrs' cfg.keybindings
nameValuePair "URxvt.keysym.${kb}" action (kb: action: nameValuePair "URxvt.keysym.${kb}" action)
) // optionalAttrs (cfg.fonts != []) { // optionalAttrs (cfg.fonts != [ ]) {
"URxvt.font" = concatStringsSep "," cfg.fonts; "URxvt.font" = concatStringsSep "," cfg.fonts;
} // flip mapAttrs' cfg.extraConfig (k: v: } // flip mapAttrs' cfg.extraConfig (k: v: nameValuePair "URxvt.${k}" v);
nameValuePair "URxvt.${k}" v
);
}; };
} }

View file

@ -31,43 +31,36 @@ let
}; };
vimSettingsType = types.submodule { vimSettingsType = types.submodule {
options = options = let
let opt = name: type:
opt = name: type: mkOption { mkOption {
type = types.nullOr type; type = types.nullOr type;
default = null; default = null;
visible = false; visible = false;
}; };
in in mapAttrs opt knownSettings;
mapAttrs opt knownSettings;
}; };
setExpr = name: value: setExpr = name: value:
let let
v = v = if isBool value then
if isBool value then (if value then "" else "no") + name (if value then "" else "no") + name
else else
"${name}=${ "${name}=${
if isList value if isList value then concatStringsSep "," value else toString value
then concatStringsSep "," value
else toString value
}"; }";
in in optionalString (value != null) ("set " + v);
optionalString (value != null) ("set " + v);
plugins = plugins = let
let
vpkgs = pkgs.vimPlugins; vpkgs = pkgs.vimPlugins;
getPkg = p: getPkg = p:
if isDerivation p if isDerivation p then
then [ p ] [ p ]
else optional (isString p && hasAttr p vpkgs) vpkgs.${p}; else
in optional (isString p && hasAttr p vpkgs) vpkgs.${p};
concatMap getPkg cfg.plugins; in concatMap getPkg cfg.plugins;
in in {
{
options = { options = {
programs.vim = { programs.vim = {
enable = mkEnableOption "Vim"; enable = mkEnableOption "Vim";
@ -75,7 +68,7 @@ in
plugins = mkOption { plugins = mkOption {
type = with types; listOf (either str package); type = with types; listOf (either str package);
default = defaultPlugins; default = defaultPlugins;
example = literalExample ''[ pkgs.vimPlugins.YankRing ]''; example = literalExample "[ pkgs.vimPlugins.YankRing ]";
description = '' description = ''
List of vim plugins to install. To get a list of supported plugins run: List of vim plugins to install. To get a list of supported plugins run:
<command>nix-env -f '&lt;nixpkgs&gt;' -qaP -A vimPlugins</command>. <command>nix-env -f '&lt;nixpkgs&gt;' -qaP -A vimPlugins</command>.
@ -102,14 +95,12 @@ in
options. options.
<informaltable frame="none"><tgroup cols="1"><tbody> <informaltable frame="none"><tgroup cols="1"><tbody>
${concatStringsSep "\n" ( ${concatStringsSep "\n" (mapAttrsToList (n: v: ''
mapAttrsToList (n: v: ''
<row> <row>
<entry><varname>${n}</varname></entry> <entry><varname>${n}</varname></entry>
<entry>${v.description}</entry> <entry>${v.description}</entry>
</row> </row>
'') knownSettings '') knownSettings)}
)}
</tbody></tgroup></informaltable> </tbody></tgroup></informaltable>
See the Vim documentation for detailed descriptions of these See the Vim documentation for detailed descriptions of these
@ -136,13 +127,10 @@ in
}; };
}; };
config = ( config = (let
let
customRC = '' customRC = ''
${concatStringsSep "\n" ( ${concatStringsSep "\n" (filter (v: v != "") (mapAttrsToList setExpr
filter (v: v != "") ( (builtins.intersectAttrs knownSettings cfg.settings)))}
mapAttrsToList setExpr (
builtins.intersectAttrs knownSettings cfg.settings)))}
${cfg.extraConfig} ${cfg.extraConfig}
''; '';
@ -155,26 +143,19 @@ in
packages.home-manager.start = plugins; packages.home-manager.start = plugins;
}; };
}; };
in in mkIf cfg.enable {
mkIf cfg.enable { assertions = let
assertions = packagesNotFound =
let filter (p: isString p && (!hasAttr p pkgs.vimPlugins)) cfg.plugins;
packagesNotFound = filter (p: isString p && (!hasAttr p pkgs.vimPlugins)) cfg.plugins; in [{
in
[
{
assertion = packagesNotFound == [ ]; assertion = packagesNotFound == [ ];
message = "Following VIM plugin not found in pkgs.vimPlugins: ${ message = "Following VIM plugin not found in pkgs.vimPlugins: ${
concatMapStringsSep ", " (p: ''"${p}"'') packagesNotFound concatMapStringsSep ", " (p: ''"${p}"'') packagesNotFound
}"; }";
} }];
];
warnings = warnings = let stringPlugins = filter isString cfg.plugins;
let in optional (stringPlugins != [ ]) ''
stringPlugins = filter isString cfg.plugins;
in
optional (stringPlugins != []) ''
Specifying VIM plugins using strings is deprecated, found ${ Specifying VIM plugins using strings is deprecated, found ${
concatMapStringsSep ", " (p: ''"${p}"'') stringPlugins concatMapStringsSep ", " (p: ''"${p}"'') stringPlugins
} as strings. } as strings.
@ -186,6 +167,5 @@ in
package = vim; package = vim;
plugins = defaultPlugins; plugins = defaultPlugins;
}; };
} });
);
} }

View file

@ -7,8 +7,8 @@ let
cfg = config.programs.vscode.haskell; cfg = config.programs.vscode.haskell;
defaultHieNixExe = hie-nix.hies + "/bin/hie-wrapper"; defaultHieNixExe = hie-nix.hies + "/bin/hie-wrapper";
defaultHieNixExeText = literalExample defaultHieNixExeText =
"\"\${pkgs.hie-nix.hies}/bin/hie-wrapper\""; literalExample ''"''${pkgs.hie-nix.hies}/bin/hie-wrapper"'';
hie-nix = pkgs.hie-nix or (abort '' hie-nix = pkgs.hie-nix or (abort ''
vscode.haskell: pkgs.hie-nix missing. Please add an overlay such as: vscode.haskell: pkgs.hie-nix missing. Please add an overlay such as:
@ -21,9 +21,7 @@ let
] ]
''; '';
in in {
{
options.programs.vscode.haskell = { options.programs.vscode.haskell = {
enable = mkEnableOption "Haskell integration for Visual Studio Code"; enable = mkEnableOption "Haskell integration for Visual Studio Code";
@ -57,9 +55,7 @@ in
}; };
programs.vscode.extensions = programs.vscode.extensions =
[ [ pkgs.vscode-extensions.justusadam.language-haskell ]
pkgs.vscode-extensions.justusadam.language-haskell
]
++ lib.optional cfg.hie.enable ++ lib.optional cfg.hie.enable
pkgs.vscode-extensions.alanz.vscode-hie-server; pkgs.vscode-extensions.alanz.vscode-hie-server;
}; };

View file

@ -14,9 +14,7 @@ let
zh = "z -I -t ."; # fzf zh = "z -I -t ."; # fzf
}; };
in in {
{
meta.maintainers = [ maintainers.marsam ]; meta.maintainers = [ maintainers.marsam ];
options.programs.z-lua = { options.programs.z-lua = {
@ -68,15 +66,21 @@ in
home.packages = [ pkgs.z-lua ]; home.packages = [ pkgs.z-lua ];
programs.bash.initExtra = mkIf cfg.enableBashIntegration '' programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
eval "$(${pkgs.z-lua}/bin/z --init bash ${concatStringsSep " " cfg.options})" eval "$(${pkgs.z-lua}/bin/z --init bash ${
concatStringsSep " " cfg.options
})"
''; '';
programs.zsh.initExtra = mkIf cfg.enableZshIntegration '' programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
eval "$(${pkgs.z-lua}/bin/z --init zsh ${concatStringsSep " " cfg.options})" eval "$(${pkgs.z-lua}/bin/z --init zsh ${
concatStringsSep " " cfg.options
})"
''; '';
programs.fish.shellInit = mkIf cfg.enableFishIntegration '' programs.fish.shellInit = mkIf cfg.enableFishIntegration ''
source (${pkgs.z-lua}/bin/z --init fish ${concatStringsSep " " cfg.options} | psub) source (${pkgs.z-lua}/bin/z --init fish ${
concatStringsSep " " cfg.options
} | psub)
''; '';
programs.bash.shellAliases = mkIf cfg.enableAliases aliases; programs.bash.shellAliases = mkIf cfg.enableAliases aliases;

View file

@ -9,14 +9,10 @@ let
formatLine = n: v: formatLine = n: v:
let let
formatValue = v: formatValue = v:
if isBool v then (if v then "true" else "false") if isBool v then (if v then "true" else "false") else toString v;
else toString v; in ''set ${n} "${formatValue v}"'';
in
"set ${n}\t\"${formatValue v}\"";
in in {
{
meta.maintainers = [ maintainers.rprospero ]; meta.maintainers = [ maintainers.rprospero ];
options.programs.zathura = { options.programs.zathura = {
@ -36,7 +32,10 @@ in
</citerefentry> </citerefentry>
for the full list of options. for the full list of options.
''; '';
example = { default-bg = "#000000"; default-fg = "#FFFFFF"; }; example = {
default-bg = "#000000";
default-fg = "#FFFFFF";
};
}; };
extraConfig = mkOption { extraConfig = mkOption {
@ -52,10 +51,8 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.zathura ]; home.packages = [ pkgs.zathura ];
xdg.configFile."zathura/zathurarc".text = xdg.configFile."zathura/zathurarc".text = concatStringsSep "\n" ([ ]
concatStringsSep "\n" ([]
++ optional (cfg.extraConfig != "") cfg.extraConfig ++ optional (cfg.extraConfig != "") cfg.extraConfig
++ mapAttrsToList formatLine cfg.options ++ mapAttrsToList formatLine cfg.options) + "\n";
) + "\n";
}; };
} }

View file

@ -28,13 +28,9 @@ with lib;
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = { ExecStart = "${pkgs.blueman}/bin/blueman-applet"; };
ExecStart = "${pkgs.blueman}/bin/blueman-applet";
};
}; };
}; };
} }

View file

@ -9,37 +9,24 @@ let
package = pkgs.cbatticon; package = pkgs.cbatticon;
makeCommand = commandName: commandArg: makeCommand = commandName: commandArg:
optional (commandArg != null) ( optional (commandArg != null)
let (let cmd = pkgs.writeShellScript commandName commandArg;
cmd = pkgs.writeShellScript commandName commandArg; in "--${commandName} ${cmd}");
in
"--${commandName} ${cmd}"
);
commandLine = concatStringsSep " " ( commandLine = concatStringsSep " " ([ "${package}/bin/cbatticon" ]
[ "${package}/bin/cbatticon" ]
++ makeCommand "command-critical-level" cfg.commandCriticalLevel ++ makeCommand "command-critical-level" cfg.commandCriticalLevel
++ makeCommand "command-left-click" cfg.commandLeftClick ++ makeCommand "command-left-click" cfg.commandLeftClick
++ optional ++ optional (cfg.iconType != null) "--icon-type ${cfg.iconType}"
(cfg.iconType != null) ++ optional (cfg.lowLevelPercent != null)
"--icon-type ${cfg.iconType}"
++ optional
(cfg.lowLevelPercent != null)
"--low-level ${toString cfg.lowLevelPercent}" "--low-level ${toString cfg.lowLevelPercent}"
++ optional ++ optional (cfg.criticalLevelPercent != null)
(cfg.criticalLevelPercent != null)
"--critical-level ${toString cfg.criticalLevelPercent}" "--critical-level ${toString cfg.criticalLevelPercent}"
++ optional ++ optional (cfg.updateIntervalSeconds != null)
(cfg.updateIntervalSeconds != null)
"--update-interval ${toString cfg.updateIntervalSeconds}" "--update-interval ${toString cfg.updateIntervalSeconds}"
++ optional ++ optional (cfg.hideNotification != null && cfg.hideNotification)
(cfg.hideNotification != null && cfg.hideNotification) "--hide-notification");
"--hide-notification"
);
in in {
{
meta.maintainers = [ maintainers.pmiddend ]; meta.maintainers = [ maintainers.pmiddend ];
options = { options = {
@ -66,7 +53,8 @@ in
}; };
iconType = mkOption { iconType = mkOption {
type = types.nullOr (types.enum [ "standard" "notification" "symbolic" ]); type =
types.nullOr (types.enum [ "standard" "notification" "symbolic" ]);
default = null; default = null;
example = "symbolic"; example = "symbolic";
description = "Icon type to display in the system tray."; description = "Icon type to display in the system tray.";
@ -119,9 +107,7 @@ in
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = {
ExecStart = commandLine; ExecStart = commandLine;

View file

@ -7,16 +7,14 @@ let
cfg = config.services.compton; cfg = config.services.compton;
configFile = pkgs.writeText "compton.conf" configFile = pkgs.writeText "compton.conf" (optionalString cfg.fade ''
(optionalString cfg.fade ''
# fading # fading
fading = true; fading = true;
fade-delta = ${toString cfg.fadeDelta}; fade-delta = ${toString cfg.fadeDelta};
fade-in-step = ${elemAt cfg.fadeSteps 0}; fade-in-step = ${elemAt cfg.fadeSteps 0};
fade-out-step = ${elemAt cfg.fadeSteps 1}; fade-out-step = ${elemAt cfg.fadeSteps 1};
fade-exclude = ${toJSON cfg.fadeExclude}; fade-exclude = ${toJSON cfg.fadeExclude};
'' + '' + optionalString cfg.shadow ''
optionalString cfg.shadow ''
# shadows # shadows
shadow = true; shadow = true;
@ -26,8 +24,7 @@ let
shadow-exclude = ${toJSON cfg.shadowExclude}; shadow-exclude = ${toJSON cfg.shadowExclude};
no-dock-shadow = ${toJSON cfg.noDockShadow}; no-dock-shadow = ${toJSON cfg.noDockShadow};
no-dnd-shadow = ${toJSON cfg.noDNDShadow}; no-dnd-shadow = ${toJSON cfg.noDNDShadow};
'' + '' + optionalString cfg.blur ''
optionalString cfg.blur ''
# blur # blur
blur-background = true; blur-background = true;
@ -62,10 +59,7 @@ in {
blurExclude = mkOption { blurExclude = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = [ ]; default = [ ];
example = [ example = [ "class_g = 'slop'" "class_i = 'polybar'" ];
"class_g = 'slop'"
"class_i = 'polybar'"
];
description = '' description = ''
List of windows to exclude background blur. List of windows to exclude background blur.
See the See the
@ -106,11 +100,7 @@ in {
fadeExclude = mkOption { fadeExclude = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = [ ]; default = [ ];
example = [ example = [ "window_type *= 'menu'" "name ~= 'Firefox$'" "focused = 1" ];
"window_type *= 'menu'"
"name ~= 'Firefox$'"
"focused = 1"
];
description = '' description = ''
List of conditions of windows that should not be faded. List of conditions of windows that should not be faded.
See the See the
@ -151,11 +141,7 @@ in {
shadowExclude = mkOption { shadowExclude = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = [ ]; default = [ ];
example = [ example = [ "window_type *= 'menu'" "name ~= 'Firefox$'" "focused = 1" ];
"window_type *= 'menu'"
"name ~= 'Firefox$'"
"focused = 1"
];
description = '' description = ''
List of conditions of windows that should have no shadow. List of conditions of windows that should have no shadow.
See the See the
@ -213,10 +199,7 @@ in {
opacityRule = mkOption { opacityRule = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = [ ]; default = [ ];
example = [ example = [ "87:class_i ?= 'scratchpad'" "91:class_i ?= 'xterm'" ];
"87:class_i ?= 'scratchpad'"
"91:class_i ?= 'xterm'"
];
description = '' description = ''
List of opacity rules. List of opacity rules.
See the See the
@ -293,16 +276,13 @@ in {
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = {
ExecStart = "${cfg.package}/bin/compton --config ${configFile}"; ExecStart = "${cfg.package}/bin/compton --config ${configFile}";
Restart = "always"; Restart = "always";
RestartSec = 3; RestartSec = 3;
} } // optionalAttrs (cfg.backend == "glx") {
// optionalAttrs (cfg.backend == "glx") {
# Temporarily fixes corrupt colours with Mesa 18. # Temporarily fixes corrupt colours with Mesa 18.
Environment = [ "allow_rgb10_configs=false" ]; Environment = [ "allow_rgb10_configs=false" ];
}; };

View file

@ -6,17 +6,19 @@ let
cfg = config.services.dunst; cfg = config.services.dunst;
eitherStrBoolIntList = with types; either str (either bool (either int (listOf str))); eitherStrBoolIntList = with types;
either str (either bool (either int (listOf str)));
toDunstIni = generators.toINI { toDunstIni = generators.toINI {
mkKeyValue = key: value: mkKeyValue = key: value:
let let
value' = value' = if isBool value then
if isBool value then (if value then "yes" else "no") (if value then "yes" else "no")
else if isString value then "\"${value}\"" else if isString value then
else toString value; ''"${value}"''
in else
"${key}=${value'}"; toString value;
in "${key}=${value'}";
}; };
themeType = types.submodule { themeType = types.submodule {
@ -48,9 +50,7 @@ let
size = "32x32"; size = "32x32";
}; };
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
@ -87,18 +87,15 @@ in
}; };
}; };
config = mkIf cfg.enable ( config = mkIf cfg.enable (mkMerge [
mkMerge [
{ {
xdg.dataFile."dbus-1/services/org.knopwob.dunst.service".source = xdg.dataFile."dbus-1/services/org.knopwob.dunst.service".source =
"${pkgs.dunst}/share/dbus-1/services/org.knopwob.dunst.service"; "${pkgs.dunst}/share/dbus-1/services/org.knopwob.dunst.service";
services.dunst.settings.global.icon_path = services.dunst.settings.global.icon_path = let
let useCustomTheme = cfg.iconTheme.package != hicolorTheme.package
useCustomTheme = || cfg.iconTheme.name != hicolorTheme.name || cfg.iconTheme.size
cfg.iconTheme.package != hicolorTheme.package != hicolorTheme.size;
|| cfg.iconTheme.name != hicolorTheme.name
|| cfg.iconTheme.size != hicolorTheme.size;
basePaths = [ basePaths = [
"/run/current-system/sw" "/run/current-system/sw"
@ -106,12 +103,8 @@ in
cfg.iconTheme.package cfg.iconTheme.package
] ++ optional useCustomTheme hicolorTheme.package; ] ++ optional useCustomTheme hicolorTheme.package;
themes = themes = [ cfg.iconTheme ] ++ optional useCustomTheme
[ (hicolorTheme // { size = cfg.iconTheme.size; });
cfg.iconTheme
] ++ optional useCustomTheme (
hicolorTheme // { size = cfg.iconTheme.size; }
);
categories = [ categories = [
"actions" "actions"
@ -128,16 +121,11 @@ in
"status" "status"
"stock" "stock"
]; ];
in in concatStringsSep ":" (concatMap (theme:
concatStringsSep ":" (
concatMap (theme:
concatMap (basePath: concatMap (basePath:
map (category: map (category:
"${basePath}/share/icons/${theme.name}/${theme.size}/${category}" "${basePath}/share/icons/${theme.name}/${theme.size}/${category}")
) categories categories) basePaths) themes);
) basePaths
) themes
);
systemd.user.services.dunst = { systemd.user.services.dunst = {
Unit = { Unit = {
@ -167,6 +155,5 @@ in
''; '';
}; };
}) })
] ]);
);
} }

View file

@ -10,9 +10,8 @@ let
configText = builtins.toJSON ({ inherit (cfg) order; } // cfg.extraConfig); configText = builtins.toJSON ({ inherit (cfg) order; } // cfg.extraConfig);
configFile = pkgs.writeText "dwm-status.json" configText; configFile = pkgs.writeText "dwm-status.json" configText;
in
{ in {
options = { options = {
services.dwm-status = { services.dwm-status = {
enable = mkEnableOption "dwm-status user service"; enable = mkEnableOption "dwm-status user service";
@ -58,13 +57,9 @@ in
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = { ExecStart = "${cfg.package}/bin/dwm-status ${configFile}"; };
ExecStart = "${cfg.package}/bin/dwm-status ${configFile}";
};
}; };
}; };
} }

View file

@ -8,26 +8,21 @@ let
emacsCfg = config.programs.emacs; emacsCfg = config.programs.emacs;
emacsBinPath = "${emacsCfg.finalPackage}/bin"; emacsBinPath = "${emacsCfg.finalPackage}/bin";
in in {
options.services.emacs = { enable = mkEnableOption "the Emacs daemon"; };
{
options.services.emacs = {
enable = mkEnableOption "the Emacs daemon";
};
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = [ assertions = [{
{
assertion = emacsCfg.enable; assertion = emacsCfg.enable;
message = "The Emacs service module requires" message = "The Emacs service module requires"
+ " 'programs.emacs.enable = true'."; + " 'programs.emacs.enable = true'.";
} }];
];
systemd.user.services.emacs = { systemd.user.services.emacs = {
Unit = { Unit = {
Description = "Emacs: the extensible, self-documenting text editor"; Description = "Emacs: the extensible, self-documenting text editor";
Documentation = "info:emacs man:emacs(1) https://gnu.org/software/emacs/"; Documentation =
"info:emacs man:emacs(1) https://gnu.org/software/emacs/";
# Avoid killing the Emacs session, which may be full of # Avoid killing the Emacs session, which may be full of
# unsaved buffers. # unsaved buffers.
@ -35,14 +30,13 @@ in
}; };
Service = { Service = {
ExecStart = "${pkgs.runtimeShell} -l -c 'exec ${emacsBinPath}/emacs --fg-daemon'"; ExecStart =
"${pkgs.runtimeShell} -l -c 'exec ${emacsBinPath}/emacs --fg-daemon'";
ExecStop = "${emacsBinPath}/emacsclient --eval '(kill-emacs)'"; ExecStop = "${emacsBinPath}/emacsclient --eval '(kill-emacs)'";
Restart = "on-failure"; Restart = "on-failure";
}; };
Install = { Install = { WantedBy = [ "default.target" ]; };
WantedBy = [ "default.target" ];
};
}; };
}; };
} }

View file

@ -7,16 +7,10 @@ let
cfg = config.services.flameshot; cfg = config.services.flameshot;
package = pkgs.flameshot; package = pkgs.flameshot;
in in {
{
meta.maintainers = [ maintainers.hamhut1066 ]; meta.maintainers = [ maintainers.hamhut1066 ];
options = { options = { services.flameshot = { enable = mkEnableOption "Flameshot"; }; };
services.flameshot = {
enable = mkEnableOption "Flameshot";
};
};
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ package ]; home.packages = [ package ];
@ -33,9 +27,7 @@ in
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = {
Environment = "PATH=${config.home.profileDirectory}/bin"; Environment = "PATH=${config.home.profileDirectory}/bin";

View file

@ -6,17 +6,19 @@ let
cfg = config.services.getmail; cfg = config.services.getmail;
accounts = filter (a: a.getmail.enable) accounts =
(attrValues config.accounts.email.accounts); filter (a: a.getmail.enable) (attrValues config.accounts.email.accounts);
# Note: The getmail service does not expect a path, but just the filename! # Note: The getmail service does not expect a path, but just the filename!
renderConfigFilepath = a: if a.primary then "getmailrc" else "getmail${a.name}"; renderConfigFilepath = a:
configFiles = concatMapStringsSep " " (a: " --rcfile ${renderConfigFilepath a}") accounts; if a.primary then "getmailrc" else "getmail${a.name}";
in configFiles =
{ concatMapStringsSep " " (a: " --rcfile ${renderConfigFilepath a}") accounts;
in {
options = { options = {
services.getmail = { services.getmail = {
enable = mkEnableOption "the getmail systemd service to automatically retrieve mail"; enable = mkEnableOption
"the getmail systemd service to automatically retrieve mail";
frequency = mkOption { frequency = mkOption {
type = types.str; type = types.str;
@ -36,25 +38,17 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
systemd.user.services.getmail = { systemd.user.services.getmail = {
Unit = { Unit = { Description = "getmail email fetcher"; };
Description = "getmail email fetcher"; Service = { ExecStart = "${pkgs.getmail}/bin/getmail ${configFiles}"; };
};
Service = {
ExecStart = "${pkgs.getmail}/bin/getmail ${configFiles}";
};
}; };
systemd.user.timers.getmail = { systemd.user.timers.getmail = {
Unit = { Unit = { Description = "getmail email fetcher"; };
Description = "getmail email fetcher";
};
Timer = { Timer = {
OnCalendar = "${cfg.frequency}"; OnCalendar = "${cfg.frequency}";
Unit = "getmail.service"; Unit = "getmail.service";
}; };
Install = { Install = { WantedBy = [ "timers.target" ]; };
WantedBy = [ "timers.target" ];
};
}; };
}; };

View file

@ -6,9 +6,7 @@ let
cfg = config.services.gnome-keyring; cfg = config.services.gnome-keyring;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
@ -34,22 +32,15 @@ in
}; };
Service = { Service = {
ExecStart = ExecStart = let
let args = concatStringsSep " " ([ "--start" "--foreground" ]
args = concatStringsSep " " ( ++ optional (cfg.components != [ ])
[ "--start" "--foreground" ] ("--components=" + concatStringsSep "," cfg.components));
++ optional (cfg.components != []) ( in "${pkgs.gnome3.gnome_keyring}/bin/gnome-keyring-daemon ${args}";
"--components=" + concatStringsSep "," cfg.components
)
);
in
"${pkgs.gnome3.gnome_keyring}/bin/gnome-keyring-daemon ${args}";
Restart = "on-abort"; Restart = "on-abort";
}; };
Install = { Install = { WantedBy = [ "graphical-session-pre.target" ]; };
WantedBy = [ "graphical-session-pre.target" ];
};
}; };
}; };
} }

View file

@ -6,12 +6,10 @@ let
cfg = config.services.grobi; cfg = config.services.grobi;
eitherStrBoolIntList = eitherStrBoolIntList = with types;
with types; either str (either bool (either int (listOf str))); either str (either bool (either int (listOf str)));
in in {
{
meta.maintainers = [ maintainers.mbrgm ]; meta.maintainers = [ maintainers.mbrgm ];
options = { options = {
@ -88,9 +86,7 @@ in
Environment = "PATH=${pkgs.xorg.xrandr}/bin:${pkgs.bash}/bin"; Environment = "PATH=${pkgs.xorg.xrandr}/bin:${pkgs.bash}/bin";
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
}; };
xdg.configFile."grobi.conf".text = builtins.toJSON { xdg.configFile."grobi.conf".text = builtins.toJSON {

View file

@ -6,23 +6,16 @@ let
cfg = config.services.hound; cfg = config.services.hound;
configFile = pkgs.writeText "hound-config.json" ( configFile = pkgs.writeText "hound-config.json" (builtins.toJSON {
builtins.toJSON {
max-concurrent-indexers = cfg.maxConcurrentIndexers; max-concurrent-indexers = cfg.maxConcurrentIndexers;
dbpath = cfg.databasePath; dbpath = cfg.databasePath;
repos = cfg.repositories; repos = cfg.repositories;
health-check-url = "/healthz"; health-check-url = "/healthz";
} });
);
houndOptions = [ houndOptions = [ "--addr ${cfg.listenAddress}" "--conf ${configFile}" ];
"--addr ${cfg.listenAddress}"
"--conf ${configFile}"
];
in in {
{
meta.maintainers = [ maintainers.adisbladis ]; meta.maintainers = [ maintainers.adisbladis ];
options.services.hound = { options.services.hound = {
@ -37,7 +30,7 @@ in
databasePath = mkOption { databasePath = mkOption {
type = types.path; type = types.path;
default = "${config.xdg.dataHome}/hound"; default = "${config.xdg.dataHome}/hound";
defaultText = "\$XDG_DATA_HOME/hound"; defaultText = "$XDG_DATA_HOME/hound";
description = "The Hound database path."; description = "The Hound database path.";
}; };
@ -67,17 +60,14 @@ in
home.packages = [ pkgs.hound ]; home.packages = [ pkgs.hound ];
systemd.user.services.hound = { systemd.user.services.hound = {
Unit = { Unit = { Description = "Hound source code search engine"; };
Description = "Hound source code search engine";
};
Install = { Install = { WantedBy = [ "default.target" ]; };
WantedBy = [ "default.target" ];
};
Service = { Service = {
Environment = "PATH=${makeBinPath [ pkgs.mercurial pkgs.git ]}"; Environment = "PATH=${makeBinPath [ pkgs.mercurial pkgs.git ]}";
ExecStart = "${pkgs.hound}/bin/houndd ${concatStringsSep " " houndOptions}"; ExecStart =
"${pkgs.hound}/bin/houndd ${concatStringsSep " " houndOptions}";
}; };
}; };
}; };

View file

@ -16,7 +16,10 @@ with lib;
onNotifyPost = mkOption { onNotifyPost = mkOption {
type = with types; either str (attrsOf str); type = with types; either str (attrsOf str);
default = ""; default = "";
example = { mail = "\${pkgs.notmuch}/bin/notmuch new && \${pkgs.libnotify}/bin/notify-send 'New mail arrived'"; }; example = {
mail =
"\${pkgs.notmuch}/bin/notmuch new && \${pkgs.libnotify}/bin/notify-send 'New mail arrived'";
};
description = "Shell commands to run after onNotify event."; description = "Shell commands to run after onNotify event.";
}; };

View file

@ -9,43 +9,38 @@ let
safeName = lib.replaceChars [ "@" ":" "\\" "[" "]" ] [ "-" "-" "-" "" "" ]; safeName = lib.replaceChars [ "@" ":" "\\" "[" "]" ] [ "-" "-" "-" "" "" ];
imapnotifyAccounts = imapnotifyAccounts =
filter (a: a.imapnotify.enable) filter (a: a.imapnotify.enable) (attrValues config.accounts.email.accounts);
(attrValues config.accounts.email.accounts);
genAccountUnit = account: genAccountUnit = account:
let let name = safeName account.name;
name = safeName account.name; in {
in
{
name = "imapnotify-${name}"; name = "imapnotify-${name}";
value = { value = {
Unit = { Unit = { Description = "imapnotify for ${name}"; };
Description = "imapnotify for ${name}";
};
Service = { Service = {
ExecStart = "${pkgs.imapnotify}/bin/imapnotify -c ${genAccountConfig account}"; ExecStart =
"${pkgs.imapnotify}/bin/imapnotify -c ${genAccountConfig account}";
} // optionalAttrs account.notmuch.enable { } // optionalAttrs account.notmuch.enable {
Environment = "NOTMUCH_CONFIG=${config.xdg.configHome}/notmuch/notmuchrc"; Environment =
"NOTMUCH_CONFIG=${config.xdg.configHome}/notmuch/notmuchrc";
}; };
Install = { Install = { WantedBy = [ "default.target" ]; };
WantedBy = [ "default.target" ];
};
}; };
}; };
genAccountConfig = account: genAccountConfig = account:
pkgs.writeText "imapnotify-${safeName account.name}-config.js" ( pkgs.writeText "imapnotify-${safeName account.name}-config.js" (let
let port = if account.imap.port != null then
port = account.imap.port
if account.imap.port != null then account.imap.port else if account.imap.tls.enable then
else if account.imap.tls.enable then 993 993
else 143; else
143;
toJSON = builtins.toJSON; toJSON = builtins.toJSON;
in in ''
''
var child_process = require('child_process'); var child_process = require('child_process');
function getStdout(cmd) { function getStdout(cmd) {
@ -61,47 +56,35 @@ let
exports.onNotify = ${toJSON account.imapnotify.onNotify}; exports.onNotify = ${toJSON account.imapnotify.onNotify};
exports.onNotifyPost = ${toJSON account.imapnotify.onNotifyPost}; exports.onNotifyPost = ${toJSON account.imapnotify.onNotifyPost};
exports.boxes = ${toJSON account.imapnotify.boxes}; exports.boxes = ${toJSON account.imapnotify.boxes};
'' '');
);
in in {
{
meta.maintainers = [ maintainers.nickhu ]; meta.maintainers = [ maintainers.nickhu ];
options = { options = {
services.imapnotify = { services.imapnotify = { enable = mkEnableOption "imapnotify"; };
enable = mkEnableOption "imapnotify";
};
accounts.email.accounts = mkOption { accounts.email.accounts = mkOption {
type = with types; attrsOf (submodule ( type = with types; attrsOf (submodule (import ./imapnotify-accounts.nix));
import ./imapnotify-accounts.nix
));
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = assertions = let
let
checkAccounts = pred: msg: checkAccounts = pred: msg:
let let badAccounts = filter pred imapnotifyAccounts;
badAccounts = filter pred imapnotifyAccounts; in {
in
{
assertion = badAccounts == [ ]; assertion = badAccounts == [ ];
message = "imapnotify: Missing ${msg} for accounts: " message = "imapnotify: Missing ${msg} for accounts: "
+ concatMapStringsSep ", " (a: a.name) badAccounts; + concatMapStringsSep ", " (a: a.name) badAccounts;
}; };
in in [
[
(checkAccounts (a: a.maildir == null) "maildir configuration") (checkAccounts (a: a.maildir == null) "maildir configuration")
(checkAccounts (a: a.imap == null) "IMAP configuration") (checkAccounts (a: a.imap == null) "IMAP configuration")
(checkAccounts (a: a.passwordCommand == null) "password command") (checkAccounts (a: a.passwordCommand == null) "password command")
(checkAccounts (a: a.userName == null) "username") (checkAccounts (a: a.userName == null) "username")
]; ];
systemd.user.services = systemd.user.services = listToAttrs (map genAccountUnit imapnotifyAccounts);
listToAttrs (map genAccountUnit imapnotifyAccounts);
}; };
} }

View file

@ -7,9 +7,7 @@ let
cfg = config.services.kdeconnect; cfg = config.services.kdeconnect;
package = pkgs.kdeconnect; package = pkgs.kdeconnect;
in in {
{
meta.maintainers = [ maintainers.adisbladis ]; meta.maintainers = [ maintainers.adisbladis ];
options = { options = {
@ -31,14 +29,13 @@ in
systemd.user.services.kdeconnect = { systemd.user.services.kdeconnect = {
Unit = { Unit = {
Description = "Adds communication between your desktop and your smartphone"; Description =
"Adds communication between your desktop and your smartphone";
After = [ "graphical-session-pre.target" ]; After = [ "graphical-session-pre.target" ];
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = {
Environment = "PATH=${config.home.profileDirectory}/bin"; Environment = "PATH=${config.home.profileDirectory}/bin";
@ -52,16 +49,16 @@ in
systemd.user.services.kdeconnect-indicator = { systemd.user.services.kdeconnect-indicator = {
Unit = { Unit = {
Description = "kdeconnect-indicator"; Description = "kdeconnect-indicator";
After = [ "graphical-session-pre.target" After = [
"graphical-session-pre.target"
"polybar.service" "polybar.service"
"taffybar.service" "taffybar.service"
"stalonetray.service" ]; "stalonetray.service"
];
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = {
Environment = "PATH=${config.home.profileDirectory}/bin"; Environment = "PATH=${config.home.profileDirectory}/bin";

View file

@ -19,13 +19,9 @@ with lib;
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = { ExecStart = "${pkgs.keepassx}/bin/keepassx -min -lock"; };
ExecStart = "${pkgs.keepassx}/bin/keepassx -min -lock";
};
}; };
}; };
} }

View file

@ -6,14 +6,10 @@ let
cfg = config.services.lorri; cfg = config.services.lorri;
in in {
{
meta.maintainers = [ maintainers.gerschtli ]; meta.maintainers = [ maintainers.gerschtli ];
options = { options = { services.lorri.enable = mkEnableOption "lorri build daemon"; };
services.lorri.enable = mkEnableOption "lorri build daemon";
};
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.lorri ]; home.packages = [ pkgs.lorri ];
@ -33,25 +29,22 @@ in
ProtectSystem = "strict"; ProtectSystem = "strict";
ProtectHome = "read-only"; ProtectHome = "read-only";
Restart = "on-failure"; Restart = "on-failure";
Environment = Environment = let
let path = with pkgs; makeSearchPath "bin" [ nix gitMinimal gnutar gzip ]; path = with pkgs;
makeSearchPath "bin" [ nix gitMinimal gnutar gzip ];
in "PATH=${path}"; in "PATH=${path}";
}; };
}; };
sockets.lorri = { sockets.lorri = {
Unit = { Unit = { Description = "Socket for lorri build daemon"; };
Description = "Socket for lorri build daemon";
};
Socket = { Socket = {
ListenStream = "%t/lorri/daemon.socket"; ListenStream = "%t/lorri/daemon.socket";
RuntimeDirectory = "lorri"; RuntimeDirectory = "lorri";
}; };
Install = { Install = { WantedBy = [ "sockets.target" ]; };
WantedBy = [ "sockets.target" ];
};
}; };
}; };
}; };

View file

@ -6,14 +6,10 @@ let
cfg = config.services.mbsync; cfg = config.services.mbsync;
mbsyncOptions = mbsyncOptions = [ "--all" ] ++ optional (cfg.verbose) "--verbose"
[ "--all"
] ++ optional (cfg.verbose) "--verbose"
++ optional (cfg.configFile != null) "--config ${cfg.configFile}"; ++ optional (cfg.configFile != null) "--config ${cfg.configFile}";
in in {
{
meta.maintainers = [ maintainers.pjones ]; meta.maintainers = [ maintainers.pjones ];
options.services.mbsync = { options.services.mbsync = {
@ -81,30 +77,28 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
systemd.user.services.mbsync = { systemd.user.services.mbsync = {
Unit = { Unit = { Description = "mbsync mailbox synchronization"; };
Description = "mbsync mailbox synchronization";
};
Service = { Service = {
Type = "oneshot"; Type = "oneshot";
ExecStart = "${cfg.package}/bin/mbsync ${concatStringsSep " " mbsyncOptions}"; ExecStart =
} // (optionalAttrs (cfg.postExec != null) { ExecStartPost = cfg.postExec; }) "${cfg.package}/bin/mbsync ${concatStringsSep " " mbsyncOptions}";
// (optionalAttrs (cfg.preExec != null) { ExecStartPre = cfg.preExec; }); } // (optionalAttrs (cfg.postExec != null) {
ExecStartPost = cfg.postExec;
}) // (optionalAttrs (cfg.preExec != null) {
ExecStartPre = cfg.preExec;
});
}; };
systemd.user.timers.mbsync = { systemd.user.timers.mbsync = {
Unit = { Unit = { Description = "mbsync mailbox synchronization"; };
Description = "mbsync mailbox synchronization";
};
Timer = { Timer = {
OnCalendar = cfg.frequency; OnCalendar = cfg.frequency;
Unit = "mbsync.service"; Unit = "mbsync.service";
}; };
Install = { Install = { WantedBy = [ "timers.target" ]; };
WantedBy = [ "timers.target" ];
};
}; };
}; };
} }

View file

@ -9,11 +9,11 @@ let
toIni = generators.toINI { toIni = generators.toINI {
mkKeyValue = key: value: mkKeyValue = key: value:
let let
value' = value' = if isBool value then
if isBool value then (if value then "True" else "False") (if value then "True" else "False")
else toString value; else
in toString value;
"${key} = ${value'}"; in "${key} = ${value'}";
}; };
mpdris2Conf = { mpdris2Conf = {
@ -29,9 +29,7 @@ let
}; };
}; };
in in {
{
meta.maintainers = [ maintainers.pjones ]; meta.maintainers = [ maintainers.pjones ];
options.services.mpdris2 = { options.services.mpdris2 = {
@ -76,19 +74,15 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = [ assertions = [{
{
assertion = config.services.mpd.enable; assertion = config.services.mpd.enable;
message = "The mpdris2 module requires 'services.mpd.enable = true'."; message = "The mpdris2 module requires 'services.mpd.enable = true'.";
} }];
];
xdg.configFile."mpDris2/mpDris2.conf".text = toIni mpdris2Conf; xdg.configFile."mpDris2/mpDris2.conf".text = toIni mpdris2Conf;
systemd.user.services.mpdris2 = { systemd.user.services.mpdris2 = {
Install = { Install = { WantedBy = [ "default.target" ]; };
WantedBy = [ "default.target" ];
};
Unit = { Unit = {
Description = "MPRIS 2 support for MPD"; Description = "MPRIS 2 support for MPD";

View file

@ -150,23 +150,21 @@ in {
}; };
config = let config = let
mapRemotes = gen: with attrsets; mapAttrs' mapRemotes = gen:
with attrsets;
mapAttrs'
(name: remoteCfg: nameValuePair "muchsync-${name}" (gen name remoteCfg)) (name: remoteCfg: nameValuePair "muchsync-${name}" (gen name remoteCfg))
cfg.remotes; cfg.remotes;
in mkIf (cfg.remotes != { }) { in mkIf (cfg.remotes != { }) {
assertions = [ assertions = [{
{
assertion = config.programs.notmuch.enable; assertion = config.programs.notmuch.enable;
message = '' message = ''
The muchsync module requires 'programs.notmuch.enable = true'. The muchsync module requires 'programs.notmuch.enable = true'.
''; '';
} }];
];
systemd.user.services = mapRemotes (name: remoteCfg: { systemd.user.services = mapRemotes (name: remoteCfg: {
Unit = { Unit = { Description = "muchsync sync service (${name})"; };
Description = "muchsync sync service (${name})";
};
Service = { Service = {
CPUSchedulingPolicy = "idle"; CPUSchedulingPolicy = "idle";
IOSchedulingClass = "idle"; IOSchedulingClass = "idle";
@ -175,8 +173,7 @@ in {
''"NOTMUCH_CONFIG=${config.home.sessionVariables.NOTMUCH_CONFIG}"'' ''"NOTMUCH_CONFIG=${config.home.sessionVariables.NOTMUCH_CONFIG}"''
''"NMBGIT=${config.home.sessionVariables.NMBGIT}"'' ''"NMBGIT=${config.home.sessionVariables.NMBGIT}"''
]; ];
ExecStart = concatStringsSep " " ( ExecStart = concatStringsSep " " ([ "${pkgs.muchsync}/bin/muchsync" ]
[ "${pkgs.muchsync}/bin/muchsync" ]
++ [ "-s ${escapeShellArg remoteCfg.sshCommand}" ] ++ [ "-s ${escapeShellArg remoteCfg.sshCommand}" ]
++ optional (!remoteCfg.upload) "--noup" ++ optional (!remoteCfg.upload) "--noup"
@ -189,23 +186,18 @@ in {
++ optional (remoteCfg.remote.muchsyncPath != "") ++ optional (remoteCfg.remote.muchsyncPath != "")
"-r ${escapeShellArg remoteCfg.remote.muchsyncPath}" "-r ${escapeShellArg remoteCfg.remote.muchsyncPath}"
++ optional remoteCfg.remote.checkForModifiedFiles "-F" ++ optional remoteCfg.remote.checkForModifiedFiles "-F"
++ optional (!remoteCfg.remote.importNew) "--nonew" ++ optional (!remoteCfg.remote.importNew) "--nonew");
);
}; };
}); });
systemd.user.timers = mapRemotes (name: remoteCfg: { systemd.user.timers = mapRemotes (name: remoteCfg: {
Unit = { Unit = { Description = "muchsync periodic sync (${name})"; };
Description = "muchsync periodic sync (${name})";
};
Timer = { Timer = {
Unit = "muchsync-${name}.service"; Unit = "muchsync-${name}.service";
OnCalendar = remoteCfg.frequency; OnCalendar = remoteCfg.frequency;
Persistent = true; Persistent = true;
}; };
Install = { Install = { WantedBy = [ "timers.target" ]; };
WantedBy = [ "timers.target" ];
};
}); });
}; };
} }

View file

@ -6,9 +6,7 @@ let
cfg = config.services.network-manager-applet; cfg = config.services.network-manager-applet;
in in {
{
meta.maintainers = [ maintainers.rycee ]; meta.maintainers = [ maintainers.rycee ];
options = { options = {
@ -25,17 +23,13 @@ in
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = {
ExecStart = toString ( ExecStart = toString
[ ([ "${pkgs.networkmanagerapplet}/bin/nm-applet" "--sm-disable" ]
"${pkgs.networkmanagerapplet}/bin/nm-applet" ++ optional config.xsession.preferStatusNotifierItems
"--sm-disable" "--indicator");
] ++ optional config.xsession.preferStatusNotifierItems "--indicator"
);
}; };
}; };
}; };

View file

@ -4,9 +4,7 @@ with lib;
{ {
options = { options = {
services.nextcloud-client = { services.nextcloud-client = { enable = mkEnableOption "Nextcloud Client"; };
enable = mkEnableOption "Nextcloud Client";
};
}; };
config = mkIf config.services.nextcloud-client.enable { config = mkIf config.services.nextcloud-client.enable {
@ -22,9 +20,7 @@ with lib;
ExecStart = "${pkgs.nextcloud-client}/bin/nextcloud"; ExecStart = "${pkgs.nextcloud-client}/bin/nextcloud";
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
}; };
}; };
} }

View file

@ -4,9 +4,7 @@ with lib;
{ {
options = { options = {
services.owncloud-client = { services.owncloud-client = { enable = mkEnableOption "Owncloud Client"; };
enable = mkEnableOption "Owncloud Client";
};
}; };
config = mkIf config.services.owncloud-client.enable { config = mkIf config.services.owncloud-client.enable {
@ -22,9 +20,7 @@ with lib;
ExecStart = "${pkgs.owncloud-client}/bin/owncloud"; ExecStart = "${pkgs.owncloud-client}/bin/owncloud";
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
}; };
}; };
} }

View file

@ -7,15 +7,11 @@ let
cfg = config.services.parcellite; cfg = config.services.parcellite;
package = pkgs.parcellite; package = pkgs.parcellite;
in in {
{
meta.maintainers = [ maintainers.gleber ]; meta.maintainers = [ maintainers.gleber ];
options = { options = {
services.parcellite = { services.parcellite = { enable = mkEnableOption "Parcellite"; };
enable = mkEnableOption "Parcellite";
};
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
@ -28,9 +24,7 @@ in
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = {
ExecStart = "${package}/bin/parcellite"; ExecStart = "${package}/bin/parcellite";

View file

@ -7,9 +7,7 @@ let
serviceCfg = config.services.password-store-sync; serviceCfg = config.services.password-store-sync;
programCfg = config.programs.password-store; programCfg = config.programs.password-store;
in in {
{
meta.maintainers = with maintainers; [ pacien ]; meta.maintainers = with maintainers; [ pacien ];
options.services.password-store-sync = { options.services.password-store-sync = {
@ -35,28 +33,22 @@ in
}; };
config = mkIf serviceCfg.enable { config = mkIf serviceCfg.enable {
assertions = [ assertions = [{
{
assertion = programCfg.enable; assertion = programCfg.enable;
message = "The 'services.password-store-sync' module requires" message = "The 'services.password-store-sync' module requires"
+ " 'programs.password-store.enable = true'."; + " 'programs.password-store.enable = true'.";
} }];
];
systemd.user.services.password-store-sync = { systemd.user.services.password-store-sync = {
Unit = { Unit = { Description = "Password store sync"; };
Description = "Password store sync";
};
Service = { Service = {
CPUSchedulingPolicy = "idle"; CPUSchedulingPolicy = "idle";
IOSchedulingClass = "idle"; IOSchedulingClass = "idle";
Environment = Environment = let
let
makeEnvironmentPairs = makeEnvironmentPairs =
mapAttrsToList (key: value: "${key}=${builtins.toJSON value}"); mapAttrsToList (key: value: "${key}=${builtins.toJSON value}");
in in makeEnvironmentPairs programCfg.settings;
makeEnvironmentPairs programCfg.settings;
ExecStart = toString (pkgs.writeShellScript "password-store-sync" '' ExecStart = toString (pkgs.writeShellScript "password-store-sync" ''
${pkgs.pass}/bin/pass git pull --rebase && \ ${pkgs.pass}/bin/pass git pull --rebase && \
${pkgs.pass}/bin/pass git push ${pkgs.pass}/bin/pass git push
@ -65,9 +57,7 @@ in
}; };
systemd.user.timers.password-store-sync = { systemd.user.timers.password-store-sync = {
Unit = { Unit = { Description = "Password store periodic sync"; };
Description = "Password store periodic sync";
};
Timer = { Timer = {
Unit = "password-store-sync.service"; Unit = "password-store-sync.service";
@ -75,9 +65,7 @@ in
Persistent = true; Persistent = true;
}; };
Install = { Install = { WantedBy = [ "timers.target" ]; };
WantedBy = [ "timers.target" ];
};
}; };
}; };
} }

View file

@ -6,9 +6,7 @@ with lib;
meta.maintainers = [ maintainers.pltanton ]; meta.maintainers = [ maintainers.pltanton ];
options = { options = {
services.pasystray = { services.pasystray = { enable = mkEnableOption "PulseAudio system tray"; };
enable = mkEnableOption "PulseAudio system tray";
};
}; };
config = mkIf config.services.pasystray.enable { config = mkIf config.services.pasystray.enable {
@ -19,16 +17,12 @@ with lib;
PartOf = [ "graphical-session.target" ]; PartOf = [ "graphical-session.target" ];
}; };
Install = { Install = { WantedBy = [ "graphical-session.target" ]; };
WantedBy = [ "graphical-session.target" ];
};
Service = { Service = {
Environment = Environment =
let let toolPaths = makeBinPath [ pkgs.paprefs pkgs.pavucontrol ];
toolPaths = makeBinPath [ pkgs.paprefs pkgs.pavucontrol ]; in [ "PATH=${toolPaths}" ];
in
[ "PATH=${toolPaths}" ];
ExecStart = "${pkgs.pasystray}/bin/pasystray"; ExecStart = "${pkgs.pasystray}/bin/pasystray";
}; };
}; };

Some files were not shown because too many files have changed in this diff Show more