mirror of
https://github.com/nix-community/home-manager.git
synced 2024-12-14 11:57:55 +00:00
Apply nixfmt
on many files
This commit is contained in:
parent
9799d3de2d
commit
45abf3d38a
177 changed files with 2850 additions and 3565 deletions
11
default.nix
11
default.nix
|
@ -1,13 +1,10 @@
|
|||
{ pkgs ? import <nixpkgs> {} }:
|
||||
{ pkgs ? import <nixpkgs> { } }:
|
||||
|
||||
rec {
|
||||
home-manager = pkgs.callPackage ./home-manager {
|
||||
path = toString ./.;
|
||||
};
|
||||
home-manager = pkgs.callPackage ./home-manager { path = toString ./.; };
|
||||
|
||||
install = pkgs.callPackage ./home-manager/install.nix {
|
||||
inherit home-manager;
|
||||
};
|
||||
install =
|
||||
pkgs.callPackage ./home-manager/install.nix { inherit home-manager; };
|
||||
|
||||
nixos = import ./nixos;
|
||||
}
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
{
|
||||
# Note, this should be "the standard library" + HM extensions.
|
||||
lib
|
||||
, pkgs
|
||||
}:
|
||||
# Note, this should be "the standard library" + HM extensions.
|
||||
lib, pkgs }:
|
||||
|
||||
let
|
||||
|
||||
|
@ -19,23 +17,19 @@ let
|
|||
# Make sure the used package is scrubbed to avoid actually
|
||||
# instantiating derivations.
|
||||
scrubbedPkgsModule = {
|
||||
imports = [
|
||||
{
|
||||
_module.args = {
|
||||
pkgs = lib.mkForce (nmd.scrubDerivations "pkgs" pkgs);
|
||||
pkgs_i686 = lib.mkForce { };
|
||||
};
|
||||
}
|
||||
];
|
||||
imports = [{
|
||||
_module.args = {
|
||||
pkgs = lib.mkForce (nmd.scrubDerivations "pkgs" pkgs);
|
||||
pkgs_i686 = lib.mkForce { };
|
||||
};
|
||||
}];
|
||||
};
|
||||
|
||||
hmModulesDocs = nmd.buildModulesDocs {
|
||||
modules =
|
||||
import ../modules/modules.nix {
|
||||
inherit lib pkgs;
|
||||
check = false;
|
||||
}
|
||||
++ [ scrubbedPkgsModule ];
|
||||
modules = import ../modules/modules.nix {
|
||||
inherit lib pkgs;
|
||||
check = false;
|
||||
} ++ [ scrubbedPkgsModule ];
|
||||
moduleRootPaths = [ ./.. ];
|
||||
mkModuleUrl = path:
|
||||
"https://github.com/rycee/home-manager/blob/master/${path}#blob-path";
|
||||
|
@ -58,9 +52,7 @@ let
|
|||
'';
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
inherit nmdSrc;
|
||||
|
||||
options = {
|
||||
|
@ -71,7 +63,5 @@ in
|
|||
|
||||
manPages = docs.manPages;
|
||||
|
||||
manual = {
|
||||
inherit (docs) html htmlOpenTool;
|
||||
};
|
||||
manual = { inherit (docs) html htmlOpenTool; };
|
||||
}
|
||||
|
|
|
@ -1,70 +1,67 @@
|
|||
{ home-manager, runCommand }:
|
||||
|
||||
runCommand
|
||||
"home-manager-install"
|
||||
{
|
||||
propagatedBuildInputs = [ home-manager ];
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
shellHookOnly = true;
|
||||
shellHook = ''
|
||||
confFile="''${XDG_CONFIG_HOME:-$HOME/.config}/nixpkgs/home.nix"
|
||||
|
||||
if [[ ! -e $confFile ]]; then
|
||||
echo
|
||||
echo "Creating initial Home Manager configuration..."
|
||||
|
||||
mkdir -p "$(dirname "$confFile")"
|
||||
cat > $confFile <<EOF
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
# This value determines the Home Manager release that your
|
||||
# configuration is compatible with. This helps avoid breakage
|
||||
# when a new Home Manager release introduces backwards
|
||||
# incompatible changes.
|
||||
#
|
||||
# You can update Home Manager without changing this value. See
|
||||
# the Home Manager release notes for a list of state version
|
||||
# changes in each release.
|
||||
home.stateVersion = "19.09";
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
runCommand "home-manager-install" {
|
||||
propagatedBuildInputs = [ home-manager ];
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
shellHookOnly = true;
|
||||
shellHook = ''
|
||||
confFile="''${XDG_CONFIG_HOME:-$HOME/.config}/nixpkgs/home.nix"
|
||||
|
||||
if [[ ! -e $confFile ]]; then
|
||||
echo
|
||||
echo "Creating initial Home Manager generation..."
|
||||
echo
|
||||
echo "Creating initial Home Manager configuration..."
|
||||
|
||||
if home-manager switch; then
|
||||
cat <<EOF
|
||||
mkdir -p "$(dirname "$confFile")"
|
||||
cat > $confFile <<EOF
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
All done! The home-manager tool should now be installed and you
|
||||
can edit
|
||||
{
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
$confFile
|
||||
# This value determines the Home Manager release that your
|
||||
# configuration is compatible with. This helps avoid breakage
|
||||
# when a new Home Manager release introduces backwards
|
||||
# incompatible changes.
|
||||
#
|
||||
# You can update Home Manager without changing this value. See
|
||||
# the Home Manager release notes for a list of state version
|
||||
# changes in each release.
|
||||
home.stateVersion = "19.09";
|
||||
}
|
||||
EOF
|
||||
fi
|
||||
|
||||
to configure Home Manager. Run 'man home-configuration.nix' to
|
||||
see all available options.
|
||||
EOF
|
||||
exit 0
|
||||
else
|
||||
cat <<EOF
|
||||
echo
|
||||
echo "Creating initial Home Manager generation..."
|
||||
echo
|
||||
|
||||
Uh oh, the installation failed! Please create an issue at
|
||||
if home-manager switch; then
|
||||
cat <<EOF
|
||||
|
||||
https://github.com/rycee/home-manager/issues
|
||||
All done! The home-manager tool should now be installed and you
|
||||
can edit
|
||||
|
||||
if the error seems to be the fault of Home Manager.
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
'';
|
||||
}
|
||||
''
|
||||
echo This derivation is not buildable, instead run it using nix-shell.
|
||||
exit 1
|
||||
''
|
||||
$confFile
|
||||
|
||||
to configure Home Manager. Run 'man home-configuration.nix' to
|
||||
see all available options.
|
||||
EOF
|
||||
exit 0
|
||||
else
|
||||
cat <<EOF
|
||||
|
||||
Uh oh, the installation failed! Please create an issue at
|
||||
|
||||
https://github.com/rycee/home-manager/issues
|
||||
|
||||
if the error seems to be the fault of Home Manager.
|
||||
EOF
|
||||
exit 1
|
||||
fi
|
||||
'';
|
||||
} ''
|
||||
echo This derivation is not buildable, instead run it using nix-shell.
|
||||
exit 1
|
||||
''
|
||||
|
|
|
@ -13,13 +13,11 @@ with lib;
|
|||
|
||||
rec {
|
||||
|
||||
emptyDag = {};
|
||||
emptyDag = { };
|
||||
|
||||
isDag = dag:
|
||||
let
|
||||
isEntry = e: (e ? data) && (e ? after) && (e ? before);
|
||||
in
|
||||
builtins.isAttrs dag && all (x: x) (mapAttrsToList (n: isEntry) dag);
|
||||
let isEntry = e: (e ? data) && (e ? after) && (e ? before);
|
||||
in builtins.isAttrs dag && all (x: x) (mapAttrsToList (n: isEntry) dag);
|
||||
|
||||
# Takes an attribute set containing entries built by
|
||||
# dagEntryAnywhere, dagEntryAfter, and dagEntryBefore to a
|
||||
|
@ -80,22 +78,19 @@ rec {
|
|||
dagTopoSort = dag:
|
||||
let
|
||||
dagBefore = dag: name:
|
||||
mapAttrsToList (n: v: n) (
|
||||
filterAttrs (n: v: any (a: a == name) v.before) dag
|
||||
);
|
||||
normalizedDag =
|
||||
mapAttrs (n: v: {
|
||||
name = n;
|
||||
data = v.data;
|
||||
after = v.after ++ dagBefore dag n;
|
||||
}) dag;
|
||||
mapAttrsToList (n: v: n)
|
||||
(filterAttrs (n: v: any (a: a == name) v.before) dag);
|
||||
normalizedDag = mapAttrs (n: v: {
|
||||
name = n;
|
||||
data = v.data;
|
||||
after = v.after ++ dagBefore dag n;
|
||||
}) dag;
|
||||
before = a: b: any (c: a.name == c) b.after;
|
||||
sorted = toposort before (mapAttrsToList (n: v: v) normalizedDag);
|
||||
in
|
||||
if sorted ? result then
|
||||
{ result = map (v: { inherit (v) name data; }) sorted.result; }
|
||||
else
|
||||
sorted;
|
||||
in if sorted ? result then {
|
||||
result = map (v: { inherit (v) name data; }) sorted.result;
|
||||
} else
|
||||
sorted;
|
||||
|
||||
# Applies a function to each element of the given DAG.
|
||||
dagMap = f: dag: mapAttrs (n: v: v // { data = f n v.data; }) dag;
|
||||
|
@ -103,22 +98,20 @@ rec {
|
|||
# Create a DAG entry with no particular dependency information.
|
||||
dagEntryAnywhere = data: {
|
||||
inherit data;
|
||||
before = [];
|
||||
after = [];
|
||||
before = [ ];
|
||||
after = [ ];
|
||||
};
|
||||
|
||||
dagEntryBetween = before: after: data: {
|
||||
inherit data before after;
|
||||
};
|
||||
dagEntryBetween = before: after: data: { inherit data before after; };
|
||||
|
||||
dagEntryAfter = after: data: {
|
||||
inherit data after;
|
||||
before = [];
|
||||
before = [ ];
|
||||
};
|
||||
|
||||
dagEntryBefore = before: data: {
|
||||
inherit data before;
|
||||
after = [];
|
||||
after = [ ];
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
rec {
|
||||
# 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
|
||||
# assignment, this function produces a string containing an export
|
||||
|
|
|
@ -3,9 +3,5 @@
|
|||
|
||||
nixpkgsLib:
|
||||
|
||||
let
|
||||
mkHmLib = import ./.;
|
||||
in
|
||||
nixpkgsLib.extend (self: super: {
|
||||
hm = mkHmLib { lib = super; };
|
||||
})
|
||||
let mkHmLib = import ./.;
|
||||
in nixpkgsLib.extend (self: super: { hm = mkHmLib { lib = super; }; })
|
||||
|
|
|
@ -9,19 +9,14 @@ with lib;
|
|||
# All characters that are considered safe. Note "-" is not
|
||||
# included to avoid "-" followed by digit being interpreted as a
|
||||
# version.
|
||||
safeChars =
|
||||
[ "+" "." "_" "?" "=" ]
|
||||
++ lowerChars
|
||||
++ upperChars
|
||||
safeChars = [ "+" "." "_" "?" "=" ] ++ lowerChars ++ upperChars
|
||||
++ stringToCharacters "0123456789";
|
||||
|
||||
empties = l: genList (x: "") (length l);
|
||||
|
||||
unsafeInName = stringToCharacters (
|
||||
replaceStrings safeChars (empties safeChars) path
|
||||
);
|
||||
unsafeInName =
|
||||
stringToCharacters (replaceStrings safeChars (empties safeChars) path);
|
||||
|
||||
safeName = replaceStrings unsafeInName (empties unsafeInName) path;
|
||||
in
|
||||
"hm_" + safeName;
|
||||
in "hm_" + safeName;
|
||||
}
|
||||
|
|
|
@ -6,41 +6,34 @@ let
|
|||
|
||||
isDagEntry = e: isAttrs e && (e ? data) && (e ? after) && (e ? before);
|
||||
|
||||
dagContentType = elemType: types.submodule {
|
||||
options = {
|
||||
data = mkOption { type = elemType; };
|
||||
after = mkOption { type = with types; uniq (listOf str); };
|
||||
before = mkOption { type = with types; uniq (listOf str); };
|
||||
dagContentType = elemType:
|
||||
types.submodule {
|
||||
options = {
|
||||
data = mkOption { type = elemType; };
|
||||
after = mkOption { type = with types; uniq (listOf str); };
|
||||
before = mkOption { type = with types; uniq (listOf str); };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
# A directed acyclic graph of some inner type.
|
||||
dagOf = elemType:
|
||||
let
|
||||
convertAllToDags =
|
||||
let
|
||||
maybeConvert = n: v:
|
||||
if isDagEntry v
|
||||
then v
|
||||
else dag.entryAnywhere v;
|
||||
in
|
||||
map (def: def // { value = mapAttrs maybeConvert def.value; });
|
||||
convertAllToDags = let
|
||||
maybeConvert = n: v: if isDagEntry v then v else dag.entryAnywhere v;
|
||||
in map (def: def // { value = mapAttrs maybeConvert def.value; });
|
||||
|
||||
attrEquivalent = types.attrsOf (dagContentType elemType);
|
||||
in
|
||||
mkOptionType rec {
|
||||
name = "dagOf";
|
||||
description = "DAG of ${elemType.description}s";
|
||||
check = isAttrs;
|
||||
merge = loc: defs: attrEquivalent.merge loc (convertAllToDags defs);
|
||||
getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["<name>"]);
|
||||
getSubModules = elemType.getSubModules;
|
||||
substSubModules = m: dagOf (elemType.substSubModules m);
|
||||
functor = (defaultFunctor name) // { wrapped = elemType; };
|
||||
};
|
||||
in mkOptionType rec {
|
||||
name = "dagOf";
|
||||
description = "DAG of ${elemType.description}s";
|
||||
check = isAttrs;
|
||||
merge = loc: defs: attrEquivalent.merge loc (convertAllToDags defs);
|
||||
getSubOptions = prefix: elemType.getSubOptions (prefix ++ [ "<name>" ]);
|
||||
getSubModules = elemType.getSubModules;
|
||||
substSubModules = m: dagOf (elemType.substSubModules m);
|
||||
functor = (defaultFunctor name) // { wrapped = elemType; };
|
||||
};
|
||||
|
||||
# A directed acyclic graph of some inner type OR a list of that
|
||||
# inner type. This is a temporary hack for use by the
|
||||
|
@ -55,42 +48,37 @@ in
|
|||
listOrDagOf = elemType:
|
||||
let
|
||||
paddedIndexStr = list: i:
|
||||
let
|
||||
padWidth = stringLength (toString (length list));
|
||||
in
|
||||
fixedWidthNumber padWidth i;
|
||||
let padWidth = stringLength (toString (length list));
|
||||
in fixedWidthNumber padWidth i;
|
||||
|
||||
convertAllToDags = defs:
|
||||
let
|
||||
convertAttrValue = n: v:
|
||||
if isDagEntry v then v
|
||||
else dag.entryAnywhere v;
|
||||
if isDagEntry v then v else dag.entryAnywhere v;
|
||||
|
||||
convertListValue = namePrefix: vs:
|
||||
let
|
||||
pad = paddedIndexStr vs;
|
||||
makeEntry = i: v:
|
||||
nameValuePair "${namePrefix}.${pad i}" (dag.entryAnywhere v);
|
||||
in
|
||||
listToAttrs (imap1 makeEntry vs);
|
||||
in listToAttrs (imap1 makeEntry vs);
|
||||
|
||||
convertValue = i: value:
|
||||
if isList value
|
||||
then convertListValue "unnamed-${paddedIndexStr defs i}" value
|
||||
else mapAttrs convertAttrValue value;
|
||||
in
|
||||
imap1 (i: def: def // { value = convertValue i def.value; }) defs;
|
||||
if isList value then
|
||||
convertListValue "unnamed-${paddedIndexStr defs i}" value
|
||||
else
|
||||
mapAttrs convertAttrValue value;
|
||||
in imap1 (i: def: def // { value = convertValue i def.value; }) defs;
|
||||
|
||||
attrEquivalent = types.attrsOf (dagContentType elemType);
|
||||
in
|
||||
mkOptionType rec {
|
||||
name = "dagOf";
|
||||
description = "DAG of ${elemType.description}s";
|
||||
check = x: isAttrs x || isList x;
|
||||
merge = loc: defs: attrEquivalent.merge loc (convertAllToDags defs);
|
||||
getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["<name>"]);
|
||||
getSubModules = elemType.getSubModules;
|
||||
substSubModules = m: dagOf (elemType.substSubModules m);
|
||||
functor = (defaultFunctor name) // { wrapped = elemType; };
|
||||
};
|
||||
in mkOptionType rec {
|
||||
name = "dagOf";
|
||||
description = "DAG of ${elemType.description}s";
|
||||
check = x: isAttrs x || isList x;
|
||||
merge = loc: defs: attrEquivalent.merge loc (convertAllToDags defs);
|
||||
getSubOptions = prefix: elemType.getSubOptions (prefix ++ [ "<name>" ]);
|
||||
getSubModules = elemType.getSubModules;
|
||||
substSubModules = m: dagOf (elemType.substSubModules m);
|
||||
functor = (defaultFunctor name) // { wrapped = elemType; };
|
||||
};
|
||||
}
|
||||
|
|
|
@ -2,13 +2,15 @@
|
|||
|
||||
rec {
|
||||
# Produces a Zsh shell like value
|
||||
toZshValue = v: if builtins.isBool v then
|
||||
if v then "true" else "false"
|
||||
else if builtins.isString v then
|
||||
"\"${v}\""
|
||||
else if builtins.isList v then
|
||||
"(${lib.concatStringsSep " " (map toZshValue v)})"
|
||||
else "\"${toString v}\"";
|
||||
toZshValue = v:
|
||||
if builtins.isBool v then
|
||||
if v then "true" else "false"
|
||||
else if builtins.isString v then
|
||||
''"${v}"''
|
||||
else if builtins.isList v then
|
||||
"(${lib.concatStringsSep " " (map toZshValue v)})"
|
||||
else
|
||||
''"${toString v}"'';
|
||||
|
||||
# Produces a Zsh shell like definition statement
|
||||
define = n: v: "${n}=${toZshValue v}";
|
||||
|
|
|
@ -8,15 +8,15 @@ let
|
|||
|
||||
profileDirectory = config.home.profileDirectory;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
imports = [
|
||||
(mkRenamedOptionModule
|
||||
[ "fonts" "fontconfig" "enableProfileFonts" ]
|
||||
[ "fonts" "fontconfig" "enable" ])
|
||||
(mkRenamedOptionModule [ "fonts" "fontconfig" "enableProfileFonts" ] [
|
||||
"fonts"
|
||||
"fontconfig"
|
||||
"enable"
|
||||
])
|
||||
];
|
||||
|
||||
options = {
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
options = {
|
||||
lib = lib.mkOption {
|
||||
type = lib.types.attrsOf lib.types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
This option allows modules to define helper functions,
|
||||
constants, etc.
|
||||
|
|
|
@ -6,12 +6,8 @@ let
|
|||
|
||||
cfg = config.xsession.numlock;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
options = {
|
||||
xsession.numlock.enable = mkEnableOption "Num Lock";
|
||||
};
|
||||
in {
|
||||
options = { xsession.numlock.enable = mkEnableOption "Num Lock"; };
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.user.services.numlockx = {
|
||||
|
@ -27,9 +23,7 @@ in
|
|||
ExecStart = "${pkgs.numlockx}/bin/numlockx";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,14 +6,12 @@ let
|
|||
|
||||
vars = config.pam.sessionVariables;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
pam.sessionVariables = mkOption {
|
||||
default = {};
|
||||
default = { };
|
||||
type = types.attrs;
|
||||
example = { EDITOR = "vim"; };
|
||||
description = ''
|
||||
|
@ -27,10 +25,8 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
config = mkIf (vars != {}) {
|
||||
home.file.".pam_environment".text =
|
||||
concatStringsSep "\n" (
|
||||
mapAttrsToList (n: v: "${n} OVERRIDE=\"${toString v}\"") vars
|
||||
) + "\n";
|
||||
config = mkIf (vars != { }) {
|
||||
home.file.".pam_environment".text = concatStringsSep "\n"
|
||||
(mapAttrsToList (n: v: ''${n} OVERRIDE="${toString v}"'') vars) + "\n";
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,19 +6,13 @@ let
|
|||
|
||||
cfg = config.qt;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
imports = [
|
||||
(mkChangedOptionModule
|
||||
[ "qt" "useGtkTheme" ]
|
||||
[ "qt" "platformTheme" ]
|
||||
(mkChangedOptionModule [ "qt" "useGtkTheme" ] [ "qt" "platformTheme" ]
|
||||
(config:
|
||||
if getAttrFromPath [ "qt" "useGtkTheme" ] config
|
||||
then "gtk"
|
||||
else null))
|
||||
if getAttrFromPath [ "qt" "useGtkTheme" ] config then "gtk" else null))
|
||||
];
|
||||
|
||||
options = {
|
||||
|
@ -29,10 +23,8 @@ in
|
|||
type = types.nullOr (types.enum [ "gtk" "gnome" ]);
|
||||
default = null;
|
||||
example = "gnome";
|
||||
relatedPackages = [
|
||||
"qgnomeplatform"
|
||||
["libsForQt5" "qtstyleplugins"]
|
||||
];
|
||||
relatedPackages =
|
||||
[ "qgnomeplatform" [ "libsForQt5" "qtstyleplugins" ] ];
|
||||
description = ''
|
||||
Selects the platform theme to use for Qt applications.</para>
|
||||
<para>The options are
|
||||
|
@ -59,16 +51,16 @@ in
|
|||
home.sessionVariables.QT_QPA_PLATFORMTHEME =
|
||||
if cfg.platformTheme == "gnome" then "gnome" else "gtk2";
|
||||
|
||||
home.packages =
|
||||
if cfg.platformTheme == "gnome"
|
||||
then [ pkgs.qgnomeplatform ]
|
||||
else [ pkgs.libsForQt5.qtstyleplugins ];
|
||||
home.packages = if cfg.platformTheme == "gnome" then
|
||||
[ pkgs.qgnomeplatform ]
|
||||
else
|
||||
[ pkgs.libsForQt5.qtstyleplugins ];
|
||||
|
||||
xsession.importedVariables = [ "QT_QPA_PLATFORMTHEME" ];
|
||||
|
||||
# Enable GTK+ style for Qt4 in either case.
|
||||
# It doesn’t support the platform theme packages.
|
||||
home.activation.useGtkThemeInQt4 = hm.dag.entryAfter ["writeBoundary"] ''
|
||||
home.activation.useGtkThemeInQt4 = hm.dag.entryAfter [ "writeBoundary" ] ''
|
||||
$DRY_RUN_CMD ${pkgs.crudini}/bin/crudini $VERBOSE_ARG \
|
||||
--set "${config.xdg.configHome}/Trolltech.conf" Qt style GTK+
|
||||
'';
|
||||
|
|
|
@ -9,9 +9,7 @@ let
|
|||
strListOrSingleton = with types;
|
||||
coercedTo (either (listOf str) str) toList (listOf str);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = with maintainers; [ pacien ];
|
||||
|
||||
options.xdg.mimeApps = {
|
||||
|
@ -80,13 +78,11 @@ in
|
|||
config.xdg.configFile."mimeapps.list".source;
|
||||
|
||||
xdg.configFile."mimeapps.list".text =
|
||||
let
|
||||
joinValues = mapAttrs (n: concatStringsSep ";");
|
||||
in
|
||||
generators.toINI {} {
|
||||
"Added Associations" = joinValues cfg.associations.added;
|
||||
"Removed Associations" = joinValues cfg.associations.removed;
|
||||
"Default Applications" = joinValues cfg.defaultApplications;
|
||||
};
|
||||
let joinValues = mapAttrs (n: concatStringsSep ";");
|
||||
in generators.toINI { } {
|
||||
"Added Associations" = joinValues cfg.associations.added;
|
||||
"Removed Associations" = joinValues cfg.associations.removed;
|
||||
"Default Applications" = joinValues cfg.defaultApplications;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.xdg.mime;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
xdg.mime.enable = mkOption {
|
||||
type = types.bool;
|
||||
|
|
|
@ -6,15 +6,15 @@ let
|
|||
|
||||
cfg = config.xdg.userDirs;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = with maintainers; [ pacien ];
|
||||
|
||||
imports = [
|
||||
(mkRenamedOptionModule
|
||||
[ "xdg" "userDirs" "publishShare" ]
|
||||
[ "xdg" "userDirs" "publicShare" ])
|
||||
(mkRenamedOptionModule [ "xdg" "userDirs" "publishShare" ] [
|
||||
"xdg"
|
||||
"userDirs"
|
||||
"publicShare"
|
||||
])
|
||||
];
|
||||
|
||||
options.xdg.userDirs = {
|
||||
|
@ -89,18 +89,15 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
xdg.configFile."user-dirs.dirs".text = generators.toKeyValue {} (
|
||||
{
|
||||
XDG_DESKTOP_DIR = cfg.desktop;
|
||||
XDG_DOCUMENTS_DIR = cfg.documents;
|
||||
XDG_DOWNLOAD_DIR = cfg.download;
|
||||
XDG_MUSIC_DIR = cfg.music;
|
||||
XDG_PICTURES_DIR = cfg.pictures;
|
||||
XDG_PUBLICSHARE_DIR = cfg.publicShare;
|
||||
XDG_TEMPLATES_DIR = cfg.templates;
|
||||
XDG_VIDEOS_DIR = cfg.videos;
|
||||
}
|
||||
// cfg.extraConfig
|
||||
);
|
||||
xdg.configFile."user-dirs.dirs".text = generators.toKeyValue { } ({
|
||||
XDG_DESKTOP_DIR = cfg.desktop;
|
||||
XDG_DOCUMENTS_DIR = cfg.documents;
|
||||
XDG_DOWNLOAD_DIR = cfg.download;
|
||||
XDG_MUSIC_DIR = cfg.music;
|
||||
XDG_PICTURES_DIR = cfg.pictures;
|
||||
XDG_PUBLICSHARE_DIR = cfg.publicShare;
|
||||
XDG_TEMPLATES_DIR = cfg.templates;
|
||||
XDG_VIDEOS_DIR = cfg.videos;
|
||||
} // cfg.extraConfig);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,16 +6,14 @@ let
|
|||
|
||||
cfg = config.programs.alacritty;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.alacritty = {
|
||||
enable = mkEnableOption "Alacritty";
|
||||
|
||||
settings = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
window.dimensions = {
|
||||
|
@ -45,8 +43,9 @@ in
|
|||
(mkIf cfg.enable {
|
||||
home.packages = [ pkgs.alacritty ];
|
||||
|
||||
xdg.configFile."alacritty/alacritty.yml" = mkIf (cfg.settings != {}) {
|
||||
text = replaceStrings ["\\\\"] ["\\"] (builtins.toJSON cfg.settings);
|
||||
xdg.configFile."alacritty/alacritty.yml" = mkIf (cfg.settings != { }) {
|
||||
text =
|
||||
replaceStrings [ "\\\\" ] [ "\\" ] (builtins.toJSON cfg.settings);
|
||||
};
|
||||
})
|
||||
];
|
||||
|
|
|
@ -18,12 +18,10 @@ with lib;
|
|||
type = types.attrsOf types.str;
|
||||
default = {
|
||||
type = "shellcommand";
|
||||
command = "'${pkgs.notmuch}/bin/notmuch address --format=json --output=recipients date:6M..'";
|
||||
regexp =
|
||||
"'\\[?{"
|
||||
+ ''"name": "(?P<name>.*)", ''
|
||||
+ ''"address": "(?P<email>.+)", ''
|
||||
+ ''"name-addr": ".*"''
|
||||
command =
|
||||
"'${pkgs.notmuch}/bin/notmuch address --format=json --output=recipients date:6M..'";
|
||||
regexp = "'\\[?{" + ''
|
||||
"name": "(?P<name>.*)", "address": "(?P<email>.+)", "name-addr": ".*"''
|
||||
+ "}[,\\]]?'";
|
||||
shellcommand_external_filtering = "False";
|
||||
};
|
||||
|
@ -36,9 +34,9 @@ with lib;
|
|||
}
|
||||
'';
|
||||
description = ''
|
||||
Contact completion configuration as expected per alot.
|
||||
See <link xlink:href="http://alot.readthedocs.io/en/latest/configuration/contacts_completion.html">alot's wiki</link> for
|
||||
explanation about possible values.
|
||||
Contact completion configuration as expected per alot.
|
||||
See <link xlink:href="http://alot.readthedocs.io/en/latest/configuration/contacts_completion.html">alot's wiki</link> for
|
||||
explanation about possible values.
|
||||
'';
|
||||
};
|
||||
|
||||
|
@ -52,10 +50,9 @@ with lib;
|
|||
};
|
||||
|
||||
config = mkIf config.notmuch.enable {
|
||||
alot.sendMailCommand = mkOptionDefault (
|
||||
if config.msmtp.enable
|
||||
then "msmtpq --read-envelope-from --read-recipients"
|
||||
else null
|
||||
);
|
||||
alot.sendMailCommand = mkOptionDefault (if config.msmtp.enable then
|
||||
"msmtpq --read-envelope-from --read-recipients"
|
||||
else
|
||||
null);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ with lib;
|
|||
|
||||
extraConfig = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
example = { select_query = ""; };
|
||||
description = ''
|
||||
Extra settings to add to this astroid account configuration.
|
||||
|
@ -26,8 +26,7 @@ with lib;
|
|||
};
|
||||
|
||||
config = mkIf config.notmuch.enable {
|
||||
astroid.sendMailCommand = mkIf config.msmtp.enable (
|
||||
mkOptionDefault "msmtpq --read-envelope-from --read-recipients"
|
||||
);
|
||||
astroid.sendMailCommand = mkIf config.msmtp.enable
|
||||
(mkOptionDefault "msmtpq --read-envelope-from --read-recipients");
|
||||
};
|
||||
}
|
||||
|
|
|
@ -8,35 +8,32 @@ let
|
|||
cfg = config.programs.astroid;
|
||||
|
||||
astroidAccounts =
|
||||
filterAttrs
|
||||
(n: v: v.astroid.enable)
|
||||
config.accounts.email.accounts;
|
||||
filterAttrs (n: v: v.astroid.enable) config.accounts.email.accounts;
|
||||
|
||||
boolOpt = b: if b then "true" else "false";
|
||||
|
||||
accountAttr = account: with account; {
|
||||
email = address;
|
||||
name = realName;
|
||||
sendmail = astroid.sendMailCommand;
|
||||
additional_sent_tags = "";
|
||||
default = boolOpt primary;
|
||||
save_drafts_to = "${maildir.absPath}/${folders.drafts}";
|
||||
save_sent = "true";
|
||||
save_sent_to = "${maildir.absPath}/${folders.sent}";
|
||||
select_query = "";
|
||||
}
|
||||
// optionalAttrs (signature.showSignature != "none") {
|
||||
signature_attach = boolOpt (signature.showSignature == "attach");
|
||||
signature_default_on = boolOpt (signature.showSignature != "none");
|
||||
signature_file = pkgs.writeText "signature.txt" signature.text;
|
||||
signature_file_markdown = "false";
|
||||
signature_separate = "true"; # prepends '--\n' to the signature
|
||||
}
|
||||
// optionalAttrs (gpg != null) {
|
||||
always_gpg_sign = boolOpt gpg.signByDefault;
|
||||
gpgkey = gpg.key;
|
||||
}
|
||||
// astroid.extraConfig;
|
||||
accountAttr = account:
|
||||
with account;
|
||||
{
|
||||
email = address;
|
||||
name = realName;
|
||||
sendmail = astroid.sendMailCommand;
|
||||
additional_sent_tags = "";
|
||||
default = boolOpt primary;
|
||||
save_drafts_to = "${maildir.absPath}/${folders.drafts}";
|
||||
save_sent = "true";
|
||||
save_sent_to = "${maildir.absPath}/${folders.sent}";
|
||||
select_query = "";
|
||||
} // optionalAttrs (signature.showSignature != "none") {
|
||||
signature_attach = boolOpt (signature.showSignature == "attach");
|
||||
signature_default_on = boolOpt (signature.showSignature != "none");
|
||||
signature_file = pkgs.writeText "signature.txt" signature.text;
|
||||
signature_file_markdown = "false";
|
||||
signature_separate = "true"; # prepends '--\n' to the signature
|
||||
} // optionalAttrs (gpg != null) {
|
||||
always_gpg_sign = boolOpt gpg.signByDefault;
|
||||
gpgkey = gpg.key;
|
||||
} // astroid.extraConfig;
|
||||
|
||||
# See https://github.com/astroidmail/astroid/wiki/Configuration-Reference
|
||||
configFile = mailAccounts:
|
||||
|
@ -51,12 +48,9 @@ let
|
|||
cfg.extraConfig
|
||||
cfg.externalEditor
|
||||
];
|
||||
in
|
||||
builtins.toJSON astroidConfig;
|
||||
in builtins.toJSON astroidConfig;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.astroid = {
|
||||
enable = mkEnableOption "Astroid";
|
||||
|
@ -81,7 +75,8 @@ in
|
|||
"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 = ''
|
||||
You can use <code>%1</code>, <code>%2</code>, and
|
||||
<code>%3</code> to refer respectively to:
|
||||
|
@ -96,7 +91,7 @@ in
|
|||
|
||||
extraConfig = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
example = { poll.interval = 0; };
|
||||
description = ''
|
||||
JSON config that will override the default Astroid configuration.
|
||||
|
@ -106,18 +101,15 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.astroid ];
|
||||
home.packages = [ pkgs.astroid ];
|
||||
|
||||
xdg.configFile."astroid/config".source =
|
||||
pkgs.runCommand "out.json"
|
||||
{
|
||||
json = configFile astroidAccounts;
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
}
|
||||
''
|
||||
echo -n "$json" | ${pkgs.jq}/bin/jq . > $out
|
||||
'';
|
||||
xdg.configFile."astroid/config".source = pkgs.runCommand "out.json" {
|
||||
json = configFile astroidAccounts;
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
} ''
|
||||
echo -n "$json" | ${pkgs.jq}/bin/jq . > $out
|
||||
'';
|
||||
|
||||
xdg.configFile."astroid/poll.sh" = {
|
||||
executable = true;
|
||||
|
|
|
@ -6,20 +6,21 @@ let
|
|||
|
||||
cfg = config.programs.autorandr;
|
||||
|
||||
matrixOf = n: m: elemType: mkOptionType rec {
|
||||
name = "matrixOf";
|
||||
description = "${toString n}×${toString m} matrix of ${elemType.description}s";
|
||||
check = xss:
|
||||
let
|
||||
listOfSize = l: xs: isList xs && length xs == l;
|
||||
in
|
||||
listOfSize n xss && all (xs: listOfSize m xs && all elemType.check xs) xss;
|
||||
merge = mergeOneOption;
|
||||
getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["*" "*"]);
|
||||
getSubModules = elemType.getSubModules;
|
||||
substSubModules = mod: matrixOf n m (elemType.substSubModules mod);
|
||||
functor = (defaultFunctor name) // { wrapped = elemType; };
|
||||
};
|
||||
matrixOf = n: m: elemType:
|
||||
mkOptionType rec {
|
||||
name = "matrixOf";
|
||||
description =
|
||||
"${toString n}×${toString m} matrix of ${elemType.description}s";
|
||||
check = xss:
|
||||
let listOfSize = l: xs: isList xs && length xs == l;
|
||||
in listOfSize n xss
|
||||
&& all (xs: listOfSize m xs && all elemType.check xs) xss;
|
||||
merge = mergeOneOption;
|
||||
getSubOptions = prefix: elemType.getSubOptions (prefix ++ [ "*" "*" ]);
|
||||
getSubModules = elemType.getSubModules;
|
||||
substSubModules = mod: matrixOf n m (elemType.substSubModules mod);
|
||||
functor = (defaultFunctor name) // { wrapped = elemType; };
|
||||
};
|
||||
|
||||
profileModule = types.submodule {
|
||||
options = {
|
||||
|
@ -29,19 +30,19 @@ let
|
|||
Output name to EDID mapping.
|
||||
Use <code>autorandr --fingerprint</code> to get current setup values.
|
||||
'';
|
||||
default = {};
|
||||
default = { };
|
||||
};
|
||||
|
||||
config = mkOption {
|
||||
type = types.attrsOf configModule;
|
||||
description = "Per output profile configuration.";
|
||||
default = {};
|
||||
default = { };
|
||||
};
|
||||
|
||||
hooks = mkOption {
|
||||
type = profileHooksModule;
|
||||
description = "Profile hook scripts.";
|
||||
default = {};
|
||||
default = { };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -89,7 +90,7 @@ let
|
|||
};
|
||||
|
||||
rotate = mkOption {
|
||||
type = types.nullOr (types.enum ["normal" "left" "right" "inverted"]);
|
||||
type = types.nullOr (types.enum [ "normal" "left" "right" "inverted" ]);
|
||||
description = "Output rotate configuration.";
|
||||
default = null;
|
||||
example = "left";
|
||||
|
@ -126,7 +127,7 @@ let
|
|||
type = types.nullOr (types.submodule {
|
||||
options = {
|
||||
method = mkOption {
|
||||
type = types.enum ["factor" "pixel" ];
|
||||
type = types.enum [ "factor" "pixel" ];
|
||||
description = "Output scaling method.";
|
||||
default = "factor";
|
||||
example = "pixel";
|
||||
|
@ -178,19 +179,21 @@ let
|
|||
postswitch = mkOption {
|
||||
type = types.attrsOf hookType;
|
||||
description = "Postswitch hook executed after mode switch.";
|
||||
default = {};
|
||||
default = { };
|
||||
};
|
||||
|
||||
preswitch = mkOption {
|
||||
type = types.attrsOf hookType;
|
||||
description = "Preswitch hook executed before mode switch.";
|
||||
default = {};
|
||||
default = { };
|
||||
};
|
||||
|
||||
predetect = mkOption {
|
||||
type = types.attrsOf hookType;
|
||||
description = "Predetect hook executed before autorandr attempts to run xrandr.";
|
||||
default = {};
|
||||
description = ''
|
||||
Predetect hook executed before autorandr attempts to run xrandr.
|
||||
'';
|
||||
default = { };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -211,50 +214,56 @@ let
|
|||
|
||||
predetect = mkOption {
|
||||
type = hookType;
|
||||
description = "Predetect hook executed before autorandr attempts to run xrandr.";
|
||||
description = ''
|
||||
Predetect hook executed before autorandr attempts to run xrandr.
|
||||
'';
|
||||
default = "";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
hookToFile = folder: name: hook:
|
||||
nameValuePair
|
||||
"autorandr/${folder}/${name}"
|
||||
{ source = "${pkgs.writeShellScriptBin "hook" hook}/bin/hook"; };
|
||||
profileToFiles = name: profile: with profile; mkMerge ([
|
||||
{
|
||||
"autorandr/${name}/setup".text = concatStringsSep "\n" (mapAttrsToList fingerprintToString fingerprint);
|
||||
"autorandr/${name}/config".text = concatStringsSep "\n" (mapAttrsToList configToString profile.config);
|
||||
}
|
||||
(mkIf (hooks.postswitch != "") (listToAttrs [ (hookToFile name "postswitch" hooks.postswitch) ]))
|
||||
(mkIf (hooks.preswitch != "") (listToAttrs [ (hookToFile name "preswitch" hooks.preswitch) ]))
|
||||
(mkIf (hooks.predetect != "") (listToAttrs [ (hookToFile name "predetect" hooks.predetect) ]))
|
||||
]);
|
||||
nameValuePair "autorandr/${folder}/${name}" {
|
||||
source = "${pkgs.writeShellScriptBin "hook" hook}/bin/hook";
|
||||
};
|
||||
profileToFiles = name: profile:
|
||||
with profile;
|
||||
mkMerge ([
|
||||
{
|
||||
"autorandr/${name}/setup".text = concatStringsSep "\n"
|
||||
(mapAttrsToList fingerprintToString fingerprint);
|
||||
"autorandr/${name}/config".text =
|
||||
concatStringsSep "\n" (mapAttrsToList configToString profile.config);
|
||||
}
|
||||
(mkIf (hooks.postswitch != "")
|
||||
(listToAttrs [ (hookToFile name "postswitch" hooks.postswitch) ]))
|
||||
(mkIf (hooks.preswitch != "")
|
||||
(listToAttrs [ (hookToFile name "preswitch" hooks.preswitch) ]))
|
||||
(mkIf (hooks.predetect != "")
|
||||
(listToAttrs [ (hookToFile name "predetect" hooks.predetect) ]))
|
||||
]);
|
||||
fingerprintToString = name: edid: "${name} ${edid}";
|
||||
configToString = name: config: if config.enable then ''
|
||||
output ${name}
|
||||
${optionalString (config.position != "") "pos ${config.position}"}
|
||||
${optionalString config.primary "primary"}
|
||||
${optionalString (config.dpi != null) "dpi ${toString config.dpi}"}
|
||||
${optionalString (config.gamma != "") "gamma ${config.gamma}"}
|
||||
${optionalString (config.mode != "") "mode ${config.mode}"}
|
||||
${optionalString (config.rate != "") "rate ${config.rate}"}
|
||||
${optionalString (config.rotate != null) "rotate ${config.rotate}"}
|
||||
${optionalString (config.scale != null) (
|
||||
(if config.scale.method == "factor" then "scale" else "scale-from")
|
||||
+ " ${toString config.scale.x}x${toString config.scale.y}"
|
||||
)}
|
||||
${optionalString (config.transform != null) (
|
||||
"transform " + concatMapStringsSep "," toString (flatten config.transform)
|
||||
)}
|
||||
'' else ''
|
||||
output ${name}
|
||||
off
|
||||
'';
|
||||
configToString = name: config:
|
||||
if config.enable then ''
|
||||
output ${name}
|
||||
${optionalString (config.position != "") "pos ${config.position}"}
|
||||
${optionalString config.primary "primary"}
|
||||
${optionalString (config.dpi != null) "dpi ${toString config.dpi}"}
|
||||
${optionalString (config.gamma != "") "gamma ${config.gamma}"}
|
||||
${optionalString (config.mode != "") "mode ${config.mode}"}
|
||||
${optionalString (config.rate != "") "rate ${config.rate}"}
|
||||
${optionalString (config.rotate != null) "rotate ${config.rotate}"}
|
||||
${optionalString (config.scale != null)
|
||||
((if config.scale.method == "factor" then "scale" else "scale-from")
|
||||
+ " ${toString config.scale.x}x${toString config.scale.y}")}
|
||||
${optionalString (config.transform != null) ("transform "
|
||||
+ concatMapStringsSep "," toString (flatten config.transform))}
|
||||
'' else ''
|
||||
output ${name}
|
||||
off
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.autorandr = {
|
||||
enable = mkEnableOption "Autorandr";
|
||||
|
@ -262,39 +271,39 @@ in
|
|||
hooks = mkOption {
|
||||
type = globalHooksModule;
|
||||
description = "Global hook scripts";
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
postswitch = {
|
||||
"notify-i3" = "''${pkgs.i3}/bin/i3-msg restart";
|
||||
"change-background" = readFile ./change-background.sh;
|
||||
"change-dpi" = '''
|
||||
case "$AUTORANDR_CURRENT_PROFILE" in
|
||||
default)
|
||||
DPI=120
|
||||
;;
|
||||
home)
|
||||
DPI=192
|
||||
;;
|
||||
work)
|
||||
DPI=144
|
||||
;;
|
||||
*)
|
||||
echo "Unknown profle: $AUTORANDR_CURRENT_PROFILE"
|
||||
exit 1
|
||||
esac
|
||||
{
|
||||
postswitch = {
|
||||
"notify-i3" = "''${pkgs.i3}/bin/i3-msg restart";
|
||||
"change-background" = readFile ./change-background.sh;
|
||||
"change-dpi" = '''
|
||||
case "$AUTORANDR_CURRENT_PROFILE" in
|
||||
default)
|
||||
DPI=120
|
||||
;;
|
||||
home)
|
||||
DPI=192
|
||||
;;
|
||||
work)
|
||||
DPI=144
|
||||
;;
|
||||
*)
|
||||
echo "Unknown profle: $AUTORANDR_CURRENT_PROFILE"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
echo "Xft.dpi: $DPI" | ''${pkgs.xorg.xrdb}/bin/xrdb -merge
|
||||
'''
|
||||
};
|
||||
}
|
||||
echo "Xft.dpi: $DPI" | ''${pkgs.xorg.xrdb}/bin/xrdb -merge
|
||||
'''
|
||||
};
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
profiles = mkOption {
|
||||
type = types.attrsOf profileModule;
|
||||
description = "Autorandr profiles specification.";
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
"work" = {
|
||||
|
@ -323,24 +332,21 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions = flatten (mapAttrsToList (
|
||||
profile: { config, ... }: mapAttrsToList (
|
||||
output: opts: {
|
||||
assertion = opts.scale == null || opts.transform == null;
|
||||
message = ''
|
||||
Cannot use the profile output options 'scale' and 'transform' simultaneously.
|
||||
Check configuration for: programs.autorandr.profiles.${profile}.config.${output}
|
||||
'';
|
||||
})
|
||||
config
|
||||
)
|
||||
cfg.profiles);
|
||||
assertions = flatten (mapAttrsToList (profile:
|
||||
{ config, ... }:
|
||||
mapAttrsToList (output: opts: {
|
||||
assertion = opts.scale == null || opts.transform == null;
|
||||
message = ''
|
||||
Cannot use the profile output options 'scale' and 'transform' simultaneously.
|
||||
Check configuration for: programs.autorandr.profiles.${profile}.config.${output}
|
||||
'';
|
||||
}) config) cfg.profiles);
|
||||
|
||||
home.packages = [ pkgs.autorandr ];
|
||||
xdg.configFile = mkMerge ([
|
||||
(mapAttrs' (hookToFile "postswitch.d") cfg.hooks.postswitch)
|
||||
(mapAttrs' (hookToFile "preswitch.d") cfg.hooks.preswitch)
|
||||
(mapAttrs' (hookToFile "predetect.d") cfg.hooks.predetect)
|
||||
(mapAttrs' (hookToFile "preswitch.d") cfg.hooks.preswitch)
|
||||
(mapAttrs' (hookToFile "predetect.d") cfg.hooks.predetect)
|
||||
(mkMerge (mapAttrsToList profileToFiles cfg.profiles))
|
||||
]);
|
||||
};
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.bat;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.marsam ];
|
||||
|
||||
options.programs.bat = {
|
||||
|
@ -16,7 +14,7 @@ in
|
|||
|
||||
config = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
default = { };
|
||||
example = {
|
||||
theme = "TwoDark";
|
||||
pager = "less -FR";
|
||||
|
@ -31,10 +29,9 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.bat ];
|
||||
|
||||
xdg.configFile."bat/config" = mkIf (cfg.config != {}) {
|
||||
text = concatStringsSep "\n" (
|
||||
mapAttrsToList (n: v: ''--${n}="${v}"'') cfg.config
|
||||
);
|
||||
xdg.configFile."bat/config" = mkIf (cfg.config != { }) {
|
||||
text = concatStringsSep "\n"
|
||||
(mapAttrsToList (n: v: ''--${n}="${v}"'') cfg.config);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,19 +6,17 @@ let
|
|||
|
||||
cfg = config.programs.beets;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
programs.beets = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default =
|
||||
if versionAtLeast config.home.stateVersion "19.03"
|
||||
then false
|
||||
else cfg.settings != {};
|
||||
default = if versionAtLeast config.home.stateVersion "19.03" then
|
||||
false
|
||||
else
|
||||
cfg.settings != { };
|
||||
defaultText = "false";
|
||||
description = ''
|
||||
Whether to enable the beets music library manager. This
|
||||
|
@ -32,7 +30,8 @@ in
|
|||
type = types.package;
|
||||
default = pkgs.beets;
|
||||
defaultText = literalExample "pkgs.beets";
|
||||
example = literalExample "(pkgs.beets.override { enableCheck = true; })";
|
||||
example =
|
||||
literalExample "(pkgs.beets.override { enableCheck = true; })";
|
||||
description = ''
|
||||
The <literal>beets</literal> package to use.
|
||||
Can be used to specify extensions.
|
||||
|
@ -41,7 +40,7 @@ in
|
|||
|
||||
settings = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
Configuration written to
|
||||
<filename>~/.config/beets/config.yaml</filename>
|
||||
|
@ -54,6 +53,6 @@ in
|
|||
home.packages = [ cfg.package ];
|
||||
|
||||
xdg.configFile."beets/config.yaml".text =
|
||||
builtins.toJSON config.programs.beets.settings;
|
||||
builtins.toJSON config.programs.beets.settings;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,29 +7,23 @@ let
|
|||
cfg = config.programs.broot;
|
||||
|
||||
configFile = config:
|
||||
pkgs.runCommand "conf.toml"
|
||||
{
|
||||
buildInputs = [ pkgs.remarshal ];
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
}
|
||||
''
|
||||
remarshal -if json -of toml \
|
||||
< ${pkgs.writeText "verbs.json" (builtins.toJSON config)} \
|
||||
> $out
|
||||
'';
|
||||
pkgs.runCommand "conf.toml" {
|
||||
buildInputs = [ pkgs.remarshal ];
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
} ''
|
||||
remarshal -if json -of toml \
|
||||
< ${pkgs.writeText "verbs.json" (builtins.toJSON config)} \
|
||||
> $out
|
||||
'';
|
||||
|
||||
brootConf = {
|
||||
verbs =
|
||||
mapAttrsToList
|
||||
(name: value: value // { invocation = name; })
|
||||
cfg.verbs;
|
||||
mapAttrsToList (name: value: value // { invocation = name; }) cfg.verbs;
|
||||
skin = cfg.skin;
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.aheaume ];
|
||||
|
||||
options.programs.broot = {
|
||||
|
@ -63,7 +57,10 @@ in
|
|||
type = with types; attrsOf (attrsOf (either bool str));
|
||||
default = {
|
||||
"p" = { execution = ":parent"; };
|
||||
"edit" = { shortcut = "e"; execution = "$EDITOR {file}" ; };
|
||||
"edit" = {
|
||||
shortcut = "e";
|
||||
execution = "$EDITOR {file}";
|
||||
};
|
||||
"create {subpath}" = { execution = "$EDITOR {directory}/{subpath}"; };
|
||||
"view" = { execution = "less {file}"; };
|
||||
};
|
||||
|
@ -114,7 +111,7 @@ in
|
|||
|
||||
skin = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
status_normal_fg = "grayscale(18)";
|
||||
|
@ -177,38 +174,36 @@ in
|
|||
# Dummy file to prevent broot from trying to reinstall itself
|
||||
xdg.configFile."broot/launcher/installed".text = "";
|
||||
|
||||
programs.bash.initExtra =
|
||||
mkIf cfg.enableBashIntegration (
|
||||
# Using mkAfter to make it more likely to appear after other
|
||||
# manipulations of the prompt.
|
||||
mkAfter ''
|
||||
# This script was automatically generated by the broot function
|
||||
# More information can be found in https://github.com/Canop/broot
|
||||
# This function starts broot and executes the command
|
||||
# it produces, if any.
|
||||
# It's needed because some shell commands, like `cd`,
|
||||
# have no useful effect if executed in a subshell.
|
||||
function br {
|
||||
f=$(mktemp)
|
||||
(
|
||||
set +e
|
||||
broot --outcmd "$f" "$@"
|
||||
code=$?
|
||||
if [ "$code" != 0 ]; then
|
||||
rm -f "$f"
|
||||
exit "$code"
|
||||
fi
|
||||
)
|
||||
code=$?
|
||||
if [ "$code" != 0 ]; then
|
||||
return "$code"
|
||||
fi
|
||||
d=$(cat "$f")
|
||||
rm -f "$f"
|
||||
eval "$d"
|
||||
}
|
||||
''
|
||||
);
|
||||
programs.bash.initExtra = mkIf cfg.enableBashIntegration (
|
||||
# Using mkAfter to make it more likely to appear after other
|
||||
# manipulations of the prompt.
|
||||
mkAfter ''
|
||||
# This script was automatically generated by the broot function
|
||||
# More information can be found in https://github.com/Canop/broot
|
||||
# This function starts broot and executes the command
|
||||
# it produces, if any.
|
||||
# It's needed because some shell commands, like `cd`,
|
||||
# have no useful effect if executed in a subshell.
|
||||
function br {
|
||||
f=$(mktemp)
|
||||
(
|
||||
set +e
|
||||
broot --outcmd "$f" "$@"
|
||||
code=$?
|
||||
if [ "$code" != 0 ]; then
|
||||
rm -f "$f"
|
||||
exit "$code"
|
||||
fi
|
||||
)
|
||||
code=$?
|
||||
if [ "$code" != 0 ]; then
|
||||
return "$code"
|
||||
fi
|
||||
d=$(cat "$f")
|
||||
rm -f "$f"
|
||||
eval "$d"
|
||||
}
|
||||
'');
|
||||
|
||||
programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
|
||||
# This script was automatically generated by the broot function
|
||||
|
|
|
@ -2,13 +2,7 @@
|
|||
|
||||
with lib;
|
||||
|
||||
let
|
||||
browsers = [
|
||||
"chrome"
|
||||
"chromium"
|
||||
"firefox"
|
||||
"vivaldi"
|
||||
];
|
||||
let browsers = [ "chrome" "chromium" "firefox" "vivaldi" ];
|
||||
in {
|
||||
options = {
|
||||
programs.browserpass = {
|
||||
|
@ -24,58 +18,59 @@ in {
|
|||
};
|
||||
|
||||
config = mkIf config.programs.browserpass.enable {
|
||||
home.file =
|
||||
foldl' (a: b: a // b) {}
|
||||
(concatMap (x: with pkgs.stdenv;
|
||||
if x == "chrome" then
|
||||
let dir = if isDarwin
|
||||
then "Library/Application Support/Google/Chrome/NativeMessagingHosts"
|
||||
else ".config/google-chrome/NativeMessagingHosts";
|
||||
in [
|
||||
{
|
||||
"${dir}/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json";
|
||||
"${dir}/../policies/managed/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json";
|
||||
}
|
||||
]
|
||||
else if x == "chromium" then
|
||||
let dir = if isDarwin
|
||||
then "Library/Application Support/Chromium/NativeMessagingHosts"
|
||||
else ".config/chromium/NativeMessagingHosts";
|
||||
in [
|
||||
{
|
||||
"${dir}/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json";
|
||||
}
|
||||
{
|
||||
"${dir}/../policies/managed/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json";
|
||||
}
|
||||
]
|
||||
else if x == "firefox" then
|
||||
let dir = if isDarwin
|
||||
then "Library/Application Support/Mozilla/NativeMessagingHosts"
|
||||
else ".mozilla/native-messaging-hosts";
|
||||
in [
|
||||
{
|
||||
"${dir}/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/hosts/firefox/com.github.browserpass.native.json";
|
||||
}
|
||||
]
|
||||
else if x == "vivaldi" then
|
||||
let dir = if isDarwin
|
||||
then "Library/Application Support/Vivaldi/NativeMessagingHosts"
|
||||
else ".config/vivaldi/NativeMessagingHosts";
|
||||
in [
|
||||
{
|
||||
"${dir}/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json";
|
||||
"${dir}/../policies/managed/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json";
|
||||
}
|
||||
]
|
||||
else throw "unknown browser ${x}") config.programs.browserpass.browsers
|
||||
);
|
||||
home.file = foldl' (a: b: a // b) { } (concatMap (x:
|
||||
with pkgs.stdenv;
|
||||
if x == "chrome" then
|
||||
let
|
||||
dir = if isDarwin then
|
||||
"Library/Application Support/Google/Chrome/NativeMessagingHosts"
|
||||
else
|
||||
".config/google-chrome/NativeMessagingHosts";
|
||||
in [{
|
||||
"${dir}/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json";
|
||||
"${dir}/../policies/managed/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json";
|
||||
}]
|
||||
else if x == "chromium" then
|
||||
let
|
||||
dir = if isDarwin then
|
||||
"Library/Application Support/Chromium/NativeMessagingHosts"
|
||||
else
|
||||
".config/chromium/NativeMessagingHosts";
|
||||
in [
|
||||
{
|
||||
"${dir}/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json";
|
||||
}
|
||||
{
|
||||
"${dir}/../policies/managed/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json";
|
||||
}
|
||||
]
|
||||
else if x == "firefox" then
|
||||
let
|
||||
dir = if isDarwin then
|
||||
"Library/Application Support/Mozilla/NativeMessagingHosts"
|
||||
else
|
||||
".mozilla/native-messaging-hosts";
|
||||
in [{
|
||||
"${dir}/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/hosts/firefox/com.github.browserpass.native.json";
|
||||
}]
|
||||
else if x == "vivaldi" then
|
||||
let
|
||||
dir = if isDarwin then
|
||||
"Library/Application Support/Vivaldi/NativeMessagingHosts"
|
||||
else
|
||||
".config/vivaldi/NativeMessagingHosts";
|
||||
in [{
|
||||
"${dir}/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/hosts/chromium/com.github.browserpass.native.json";
|
||||
"${dir}/../policies/managed/com.github.browserpass.native.json".source =
|
||||
"${pkgs.browserpass}/lib/browserpass/policies/chromium/com.github.browserpass.native.json";
|
||||
}]
|
||||
else
|
||||
throw "unknown browser ${x}") config.programs.browserpass.browsers);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -5,46 +5,44 @@ with lib;
|
|||
let
|
||||
|
||||
browserModule = defaultPkg: name: visible:
|
||||
let
|
||||
browser = (builtins.parseDrvName defaultPkg.name).name;
|
||||
in
|
||||
{
|
||||
enable = mkOption {
|
||||
inherit visible;
|
||||
default = false;
|
||||
example = true;
|
||||
description = "Whether to enable ${name}.";
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
package = mkOption {
|
||||
inherit visible;
|
||||
type = types.package;
|
||||
default = defaultPkg;
|
||||
defaultText = literalExample "pkgs.${browser}";
|
||||
description = "The ${name} package to use.";
|
||||
};
|
||||
|
||||
extensions = mkOption {
|
||||
inherit visible;
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = literalExample ''
|
||||
[
|
||||
"chlffgpmiacpedhhbkiomidkjlcfhogd" # pushbullet
|
||||
"mbniclmhobmnbdlbpiphghaielnnpgdp" # lightshot
|
||||
"gcbommkclmclpchllfjekcdonpmejbdp" # https everywhere
|
||||
"cjpalhdlnbpafiamejdnhcphjbkeiagm" # ublock origin
|
||||
]
|
||||
'';
|
||||
description = ''
|
||||
List of ${name} extensions to install.
|
||||
To find the extension ID, check its URL on the
|
||||
<link xlink:href="https://chrome.google.com/webstore/category/extensions">Chrome Web Store</link>.
|
||||
'';
|
||||
};
|
||||
let browser = (builtins.parseDrvName defaultPkg.name).name;
|
||||
in {
|
||||
enable = mkOption {
|
||||
inherit visible;
|
||||
default = false;
|
||||
example = true;
|
||||
description = "Whether to enable ${name}.";
|
||||
type = lib.types.bool;
|
||||
};
|
||||
|
||||
package = mkOption {
|
||||
inherit visible;
|
||||
type = types.package;
|
||||
default = defaultPkg;
|
||||
defaultText = literalExample "pkgs.${browser}";
|
||||
description = "The ${name} package to use.";
|
||||
};
|
||||
|
||||
extensions = mkOption {
|
||||
inherit visible;
|
||||
type = types.listOf types.str;
|
||||
default = [ ];
|
||||
example = literalExample ''
|
||||
[
|
||||
"chlffgpmiacpedhhbkiomidkjlcfhogd" # pushbullet
|
||||
"mbniclmhobmnbdlbpiphghaielnnpgdp" # lightshot
|
||||
"gcbommkclmclpchllfjekcdonpmejbdp" # https everywhere
|
||||
"cjpalhdlnbpafiamejdnhcphjbkeiagm" # ublock origin
|
||||
]
|
||||
'';
|
||||
description = ''
|
||||
List of ${name} extensions to install.
|
||||
To find the extension ID, check its URL on the
|
||||
<link xlink:href="https://chrome.google.com/webstore/category/extensions">Chrome Web Store</link>.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
browserConfig = cfg:
|
||||
let
|
||||
|
||||
|
@ -57,31 +55,32 @@ let
|
|||
google-chrome-dev = "Google/Chrome Dev";
|
||||
};
|
||||
|
||||
configDir = if pkgs.stdenv.isDarwin
|
||||
then "Library/Application Support/${getAttr browser darwinDirs}"
|
||||
else "${config.xdg.configHome}/${browser}";
|
||||
configDir = if pkgs.stdenv.isDarwin then
|
||||
"Library/Application Support/${getAttr browser darwinDirs}"
|
||||
else
|
||||
"${config.xdg.configHome}/${browser}";
|
||||
|
||||
extensionJson = ext: {
|
||||
name = "${configDir}/External Extensions/${ext}.json";
|
||||
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
|
||||
mkIf cfg.enable {
|
||||
home.packages = [ cfg.package ];
|
||||
home.file = listToAttrs (map extensionJson cfg.extensions);
|
||||
};
|
||||
in mkIf cfg.enable {
|
||||
home.packages = [ cfg.package ];
|
||||
home.file = listToAttrs (map extensionJson cfg.extensions);
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options.programs = {
|
||||
chromium = browserModule pkgs.chromium "Chromium" true;
|
||||
google-chrome = browserModule pkgs.google-chrome "Google Chrome" false;
|
||||
google-chrome-beta = browserModule pkgs.google-chrome-beta "Google Chrome Beta" false;
|
||||
google-chrome-dev = browserModule pkgs.google-chrome-dev "Google Chrome Dev" false;
|
||||
google-chrome-beta =
|
||||
browserModule pkgs.google-chrome-beta "Google Chrome Beta" false;
|
||||
google-chrome-dev =
|
||||
browserModule pkgs.google-chrome-dev "Google Chrome Dev" false;
|
||||
};
|
||||
|
||||
config = mkMerge [
|
||||
|
|
|
@ -13,8 +13,11 @@ let
|
|||
isExecutable = true;
|
||||
inherit (pkgs) perl;
|
||||
inherit (cfg) dbPath;
|
||||
perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ")
|
||||
[ pkgs.perlPackages.DBI pkgs.perlPackages.DBDSQLite pkgs.perlPackages.StringShellQuote ]);
|
||||
perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ") [
|
||||
pkgs.perlPackages.DBI
|
||||
pkgs.perlPackages.DBDSQLite
|
||||
pkgs.perlPackages.StringShellQuote
|
||||
]);
|
||||
};
|
||||
|
||||
shInit = commandNotFoundHandlerName: ''
|
||||
|
@ -31,14 +34,13 @@ let
|
|||
}
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options.programs.command-not-found = {
|
||||
enable = mkEnableOption "command-not-found hook for interactive shell";
|
||||
|
||||
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 = ''
|
||||
Absolute path to <filename>programs.sqlite</filename>. By
|
||||
default this file will be provided by your channel
|
||||
|
|
|
@ -6,21 +6,17 @@ let
|
|||
|
||||
cfg = config.programs.direnv;
|
||||
configFile = config:
|
||||
pkgs.runCommand "config.toml"
|
||||
{
|
||||
buildInputs = [ pkgs.remarshal ];
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
}
|
||||
''
|
||||
remarshal -if json -of toml \
|
||||
< ${pkgs.writeText "config.json" (builtins.toJSON config)} \
|
||||
> $out
|
||||
'';
|
||||
pkgs.runCommand "config.toml" {
|
||||
buildInputs = [ pkgs.remarshal ];
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
} ''
|
||||
remarshal -if json -of toml \
|
||||
< ${pkgs.writeText "config.json" (builtins.toJSON config)} \
|
||||
> $out
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options.programs.direnv = {
|
||||
|
@ -28,7 +24,7 @@ in
|
|||
|
||||
config = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
Configuration written to
|
||||
<filename>~/.config/direnv/config.toml</filename>.
|
||||
|
@ -79,22 +75,18 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.direnv ];
|
||||
|
||||
xdg.configFile."direnv/config.toml" = mkIf (cfg.config != {}) {
|
||||
source = configFile cfg.config;
|
||||
};
|
||||
xdg.configFile."direnv/config.toml" =
|
||||
mkIf (cfg.config != { }) { source = configFile cfg.config; };
|
||||
|
||||
xdg.configFile."direnv/direnvrc" = mkIf (cfg.stdlib != "") {
|
||||
text = cfg.stdlib;
|
||||
};
|
||||
xdg.configFile."direnv/direnvrc" =
|
||||
mkIf (cfg.stdlib != "") { text = cfg.stdlib; };
|
||||
|
||||
programs.bash.initExtra =
|
||||
mkIf cfg.enableBashIntegration (
|
||||
# Using mkAfter to make it more likely to appear after other
|
||||
# manipulations of the prompt.
|
||||
mkAfter ''
|
||||
eval "$(${pkgs.direnv}/bin/direnv hook bash)"
|
||||
''
|
||||
);
|
||||
programs.bash.initExtra = mkIf cfg.enableBashIntegration (
|
||||
# Using mkAfter to make it more likely to appear after other
|
||||
# manipulations of the prompt.
|
||||
mkAfter ''
|
||||
eval "$(${pkgs.direnv}/bin/direnv hook bash)"
|
||||
'');
|
||||
|
||||
programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
|
||||
eval "$(${pkgs.direnv}/bin/direnv hook zsh)"
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.eclipse;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
|
@ -27,13 +25,13 @@ in
|
|||
|
||||
jvmArgs = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = "JVM arguments to use for the Eclipse process.";
|
||||
};
|
||||
|
||||
plugins = mkOption {
|
||||
type = types.listOf types.package;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = "Plugins that should be added to Eclipse.";
|
||||
};
|
||||
};
|
||||
|
@ -43,10 +41,8 @@ in
|
|||
home.packages = [
|
||||
(pkgs.eclipses.eclipseWithPlugins {
|
||||
eclipse = pkgs.eclipses.eclipse-platform;
|
||||
jvmArgs =
|
||||
cfg.jvmArgs
|
||||
++ optional cfg.enableLombok
|
||||
"-javaagent:${pkgs.lombok}/share/java/lombok.jar";
|
||||
jvmArgs = cfg.jvmArgs ++ optional cfg.enableLombok
|
||||
"-javaagent:${pkgs.lombok}/share/java/lombok.jar";
|
||||
plugins = cfg.plugins;
|
||||
})
|
||||
];
|
||||
|
|
|
@ -9,31 +9,35 @@ let
|
|||
disableBinding = func: key: func;
|
||||
enableBinding = func: key: "${func} ${toString key}";
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options.programs.feh = {
|
||||
enable = mkEnableOption "feh - a fast and light image viewer";
|
||||
|
||||
buttons = mkOption {
|
||||
default = {};
|
||||
default = { };
|
||||
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 = ''
|
||||
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.
|
||||
See <link xlink:href="https://man.finalrewind.org/1/feh/#x425554544f4e53"/> for
|
||||
default bindings and available commands.
|
||||
'';
|
||||
};
|
||||
|
||||
keybindings = mkOption {
|
||||
default = {};
|
||||
default = { };
|
||||
type = types.attrsOf (types.nullOr types.str);
|
||||
example = { zoom_in = "plus"; zoom_out = "minus"; };
|
||||
example = {
|
||||
zoom_in = "plus";
|
||||
zoom_out = "minus";
|
||||
};
|
||||
description = ''
|
||||
Override feh's default keybindings. If you want to disable a keybinding
|
||||
set its value to null.
|
||||
set its value to null.
|
||||
See <link xlink:href="https://man.finalrewind.org/1/feh/#x4b455953"/> for
|
||||
default bindings and available commands.
|
||||
'';
|
||||
|
@ -41,23 +45,26 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = ((filterAttrs (n: v: v == "") cfg.keybindings) == {});
|
||||
message = "To disable a keybinding, use `null` instead of an empty string.";
|
||||
}
|
||||
];
|
||||
assertions = [{
|
||||
assertion = ((filterAttrs (n: v: v == "") cfg.keybindings) == { });
|
||||
message =
|
||||
"To disable a keybinding, use `null` instead of an empty string.";
|
||||
}];
|
||||
|
||||
home.packages = [ pkgs.feh ];
|
||||
|
||||
xdg.configFile."feh/buttons".text = ''
|
||||
${concatStringsSep "\n" (mapAttrsToList disableBinding (filterAttrs (n: v: v == null) cfg.buttons))}
|
||||
${concatStringsSep "\n" (mapAttrsToList enableBinding (filterAttrs (n: v: v != null) cfg.buttons))}
|
||||
${concatStringsSep "\n" (mapAttrsToList disableBinding
|
||||
(filterAttrs (n: v: v == null) cfg.buttons))}
|
||||
${concatStringsSep "\n" (mapAttrsToList enableBinding
|
||||
(filterAttrs (n: v: v != null) cfg.buttons))}
|
||||
'';
|
||||
|
||||
xdg.configFile."feh/keys".text = ''
|
||||
${concatStringsSep "\n" (mapAttrsToList disableBinding (filterAttrs (n: v: v == null) cfg.keybindings))}
|
||||
${concatStringsSep "\n" (mapAttrsToList enableBinding (filterAttrs (n: v: v != null) cfg.keybindings))}
|
||||
${concatStringsSep "\n" (mapAttrsToList disableBinding
|
||||
(filterAttrs (n: v: v == null) cfg.keybindings))}
|
||||
${concatStringsSep "\n" (mapAttrsToList enableBinding
|
||||
(filterAttrs (n: v: v != null) cfg.keybindings))}
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.fzf;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options.programs.fzf = {
|
||||
enable = mkEnableOption "fzf - a command-line fuzzy finder";
|
||||
|
||||
|
@ -24,7 +22,7 @@ in
|
|||
|
||||
defaultOptions = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "--height 40%" "--border" ];
|
||||
description = ''
|
||||
Extra command line options given to fzf by default.
|
||||
|
@ -43,7 +41,7 @@ in
|
|||
|
||||
fileWidgetOptions = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "--preview 'head {}'" ];
|
||||
description = ''
|
||||
Command line options for the CTRL-T keybinding.
|
||||
|
@ -53,7 +51,7 @@ in
|
|||
changeDirWidgetCommand = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "fd --type d" ;
|
||||
example = "fd --type d";
|
||||
description = ''
|
||||
The command that gets executed as the source for fzf for the
|
||||
ALT-C keybinding.
|
||||
|
@ -62,7 +60,7 @@ in
|
|||
|
||||
changeDirWidgetOptions = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "--preview 'tree -C {} | head -200'" ];
|
||||
description = ''
|
||||
Command line options for the ALT-C keybinding.
|
||||
|
@ -80,7 +78,7 @@ in
|
|||
|
||||
historyWidgetOptions = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "--sort" "--exact" ];
|
||||
description = ''
|
||||
Command line options for the CTRL-R keybinding.
|
||||
|
@ -107,19 +105,17 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.fzf ];
|
||||
|
||||
home.sessionVariables =
|
||||
mapAttrs (n: v: toString v) (
|
||||
filterAttrs (n: v: v != [] && v != null) {
|
||||
FZF_ALT_C_COMMAND = cfg.changeDirWidgetCommand;
|
||||
FZF_ALT_C_OPTS = cfg.changeDirWidgetOptions;
|
||||
FZF_CTRL_R_COMMAND = cfg.historyWidgetCommand;
|
||||
FZF_CTRL_R_OPTS = cfg.historyWidgetOptions;
|
||||
FZF_CTRL_T_COMMAND = cfg.fileWidgetCommand;
|
||||
FZF_CTRL_T_OPTS = cfg.fileWidgetOptions;
|
||||
FZF_DEFAULT_COMMAND = cfg.defaultCommand;
|
||||
FZF_DEFAULT_OPTS = cfg.defaultOptions;
|
||||
}
|
||||
);
|
||||
home.sessionVariables = mapAttrs (n: v: toString v)
|
||||
(filterAttrs (n: v: v != [ ] && v != null) {
|
||||
FZF_ALT_C_COMMAND = cfg.changeDirWidgetCommand;
|
||||
FZF_ALT_C_OPTS = cfg.changeDirWidgetOptions;
|
||||
FZF_CTRL_R_COMMAND = cfg.historyWidgetCommand;
|
||||
FZF_CTRL_R_OPTS = cfg.historyWidgetOptions;
|
||||
FZF_CTRL_T_COMMAND = cfg.fileWidgetCommand;
|
||||
FZF_CTRL_T_OPTS = cfg.fileWidgetOptions;
|
||||
FZF_DEFAULT_COMMAND = cfg.defaultCommand;
|
||||
FZF_DEFAULT_OPTS = cfg.defaultOptions;
|
||||
});
|
||||
|
||||
programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
|
||||
if [[ :$SHELLOPTS: =~ :(vi|emacs): ]]; then
|
||||
|
|
|
@ -17,8 +17,8 @@ with lib;
|
|||
|
||||
mailboxes = mkOption {
|
||||
type = types.nonEmptyListOf types.str;
|
||||
default = [];
|
||||
example = ["INBOX" "INBOX.spam"];
|
||||
default = [ ];
|
||||
example = [ "INBOX" "INBOX.spam" ];
|
||||
description = ''
|
||||
A non-empty list of mailboxes. To download all mail you can
|
||||
use the <literal>ALL</literal> mailbox.
|
||||
|
|
|
@ -4,27 +4,26 @@ with lib;
|
|||
|
||||
let
|
||||
|
||||
accounts = filter (a: a.getmail.enable)
|
||||
(attrValues config.accounts.email.accounts);
|
||||
accounts =
|
||||
filter (a: a.getmail.enable) (attrValues config.accounts.email.accounts);
|
||||
|
||||
renderAccountConfig = account: with account;
|
||||
renderAccountConfig = account:
|
||||
with account;
|
||||
let
|
||||
passCmd = concatMapStringsSep ", " (x: "'${x}'") passwordCommand;
|
||||
renderedMailboxes = concatMapStringsSep ", " (x: "'${x}'") getmail.mailboxes;
|
||||
retrieverType = if imap.tls.enable
|
||||
then "SimpleIMAPSSLRetriever"
|
||||
else "SimpleIMAPRetriever";
|
||||
destination = if getmail.destinationCommand != null
|
||||
then
|
||||
{
|
||||
destinationType = "MDA_external";
|
||||
destinationPath = getmail.destinationCommand;
|
||||
}
|
||||
else
|
||||
{
|
||||
destinationType = "Maildir";
|
||||
destinationPath = "${maildir.absPath}/";
|
||||
};
|
||||
renderedMailboxes =
|
||||
concatMapStringsSep ", " (x: "'${x}'") getmail.mailboxes;
|
||||
retrieverType = if imap.tls.enable then
|
||||
"SimpleIMAPSSLRetriever"
|
||||
else
|
||||
"SimpleIMAPRetriever";
|
||||
destination = if getmail.destinationCommand != null then {
|
||||
destinationType = "MDA_external";
|
||||
destinationPath = getmail.destinationCommand;
|
||||
} else {
|
||||
destinationType = "Maildir";
|
||||
destinationPath = "${maildir.absPath}/";
|
||||
};
|
||||
renderGetmailBoolean = v: if v then "true" else "false";
|
||||
in ''
|
||||
# Generated by Home-Manager.
|
||||
|
@ -46,15 +45,13 @@ let
|
|||
'';
|
||||
getmailEnabled = length (filter (a: a.getmail.enable) accounts) > 0;
|
||||
# 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 {
|
||||
home.file =
|
||||
foldl' (a: b: a // b) {}
|
||||
home.file = foldl' (a: b: a // b) { }
|
||||
(map (a: { "${renderConfigFilepath a}".text = renderAccountConfig a; })
|
||||
accounts);
|
||||
accounts);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -14,36 +14,31 @@ let
|
|||
section = head sections;
|
||||
subsections = tail sections;
|
||||
subsection = concatStringsSep "." subsections;
|
||||
in
|
||||
if containsQuote || subsections == []
|
||||
then name
|
||||
else "${section} \"${subsection}\"";
|
||||
in if containsQuote || subsections == [ ] then
|
||||
name
|
||||
else
|
||||
''${section} "${subsection}"'';
|
||||
|
||||
# generation for multiple ini values
|
||||
mkKeyValue = k: v:
|
||||
let
|
||||
mkKeyValue = generators.mkKeyValueDefault {} "=" k;
|
||||
in
|
||||
concatStringsSep "\n" (map mkKeyValue (toList v));
|
||||
let mkKeyValue = generators.mkKeyValueDefault { } "=" k;
|
||||
in concatStringsSep "\n" (map mkKeyValue (toList v));
|
||||
|
||||
# converts { a.b.c = 5; } to { "a.b".c = 5; } for toINI
|
||||
gitFlattenAttrs =
|
||||
let
|
||||
recurse = path: value:
|
||||
if isAttrs value then
|
||||
mapAttrsToList (name: value: recurse ([name] ++ path) value) value
|
||||
else if length path > 1 then
|
||||
{ ${concatStringsSep "." (reverseList (tail path))}.${head path} = value; }
|
||||
else
|
||||
{ ${head path} = value; };
|
||||
in
|
||||
attrs: foldl recursiveUpdate {} (flatten (recurse [] attrs));
|
||||
gitFlattenAttrs = let
|
||||
recurse = path: value:
|
||||
if isAttrs value then
|
||||
mapAttrsToList (name: value: recurse ([ name ] ++ path) value) value
|
||||
else if length path > 1 then {
|
||||
${concatStringsSep "." (reverseList (tail path))}.${head path} = value;
|
||||
} else {
|
||||
${head path} = value;
|
||||
};
|
||||
in attrs: foldl recursiveUpdate { } (flatten (recurse [ ] attrs));
|
||||
|
||||
gitToIni = attrs:
|
||||
let
|
||||
toIni = generators.toINI { inherit mkKeyValue mkSectionName; };
|
||||
in
|
||||
toIni (gitFlattenAttrs attrs);
|
||||
let toIni = generators.toINI { inherit mkKeyValue mkSectionName; };
|
||||
in toIni (gitFlattenAttrs attrs);
|
||||
|
||||
gitIniType = with types;
|
||||
let
|
||||
|
@ -51,8 +46,7 @@ let
|
|||
multipleType = either primitiveType (listOf primitiveType);
|
||||
sectionType = attrsOf multipleType;
|
||||
supersectionType = attrsOf (either multipleType sectionType);
|
||||
in
|
||||
attrsOf supersectionType;
|
||||
in attrsOf supersectionType;
|
||||
|
||||
signModule = types.submodule {
|
||||
options = {
|
||||
|
@ -98,21 +92,18 @@ let
|
|||
|
||||
contents = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
Configuration to include. If empty then a path must be given.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config.path = mkIf (config.contents != {}) (
|
||||
mkDefault (pkgs.writeText "contents" (gitToIni config.contents))
|
||||
);
|
||||
config.path = mkIf (config.contents != { })
|
||||
(mkDefault (pkgs.writeText "contents" (gitToIni config.contents)));
|
||||
});
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
|
@ -143,7 +134,7 @@ in
|
|||
|
||||
aliases = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
default = { };
|
||||
example = { co = "checkout"; };
|
||||
description = "Git aliases to define.";
|
||||
};
|
||||
|
@ -156,7 +147,7 @@ in
|
|||
|
||||
extraConfig = mkOption {
|
||||
type = types.either types.lines gitIniType;
|
||||
default = {};
|
||||
default = { };
|
||||
example = {
|
||||
core = { whitespace = "trailing-space,space-before-tab"; };
|
||||
url."ssh://git@host".insteadOf = "otherhost";
|
||||
|
@ -174,21 +165,21 @@ in
|
|||
|
||||
ignores = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "*~" "*.swp" ];
|
||||
description = "List of paths that should be globally ignored.";
|
||||
};
|
||||
|
||||
attributes = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "*.pdf diff=pdf" ];
|
||||
description = "List of defining attributes set globally.";
|
||||
};
|
||||
|
||||
includes = mkOption {
|
||||
type = types.listOf includeModule;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = literalExample ''
|
||||
[
|
||||
{ path = "~/path/to/config.inc"; }
|
||||
|
@ -217,109 +208,96 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable (
|
||||
mkMerge [
|
||||
{
|
||||
home.packages = [ cfg.package ];
|
||||
config = mkIf cfg.enable (mkMerge [
|
||||
{
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
programs.git.iniContent.user = {
|
||||
name = mkIf (cfg.userName != null) cfg.userName;
|
||||
email = mkIf (cfg.userEmail != null) cfg.userEmail;
|
||||
programs.git.iniContent.user = {
|
||||
name = mkIf (cfg.userName != null) cfg.userName;
|
||||
email = mkIf (cfg.userEmail != null) cfg.userEmail;
|
||||
};
|
||||
|
||||
xdg.configFile = {
|
||||
"git/config".text = gitToIni cfg.iniContent;
|
||||
|
||||
"git/ignore" = mkIf (cfg.ignores != [ ]) {
|
||||
text = concatStringsSep "\n" cfg.ignores + "\n";
|
||||
};
|
||||
|
||||
xdg.configFile = {
|
||||
"git/config".text = gitToIni cfg.iniContent;
|
||||
"git/attributes" = mkIf (cfg.attributes != [ ]) {
|
||||
text = concatStringsSep "\n" cfg.attributes + "\n";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
"git/ignore" = mkIf (cfg.ignores != []) {
|
||||
text = concatStringsSep "\n" cfg.ignores + "\n";
|
||||
{
|
||||
programs.git.iniContent = let
|
||||
hasSmtp = name: account: account.smtp != null;
|
||||
|
||||
genIdentity = name: account:
|
||||
with account;
|
||||
nameValuePair "sendemail.${name}" ({
|
||||
smtpEncryption = if smtp.tls.enable then "tls" else "";
|
||||
smtpServer = smtp.host;
|
||||
smtpUser = userName;
|
||||
from = address;
|
||||
} // optionalAttrs (smtp.port != null) {
|
||||
smtpServerPort = smtp.port;
|
||||
});
|
||||
in mapAttrs' genIdentity
|
||||
(filterAttrs hasSmtp config.accounts.email.accounts);
|
||||
}
|
||||
|
||||
(mkIf (cfg.signing != null) {
|
||||
programs.git.iniContent = {
|
||||
user.signingKey = cfg.signing.key;
|
||||
commit.gpgSign = cfg.signing.signByDefault;
|
||||
gpg.program = cfg.signing.gpgPath;
|
||||
};
|
||||
})
|
||||
|
||||
(mkIf (cfg.aliases != { }) { programs.git.iniContent.alias = cfg.aliases; })
|
||||
|
||||
(mkIf (lib.isAttrs cfg.extraConfig) {
|
||||
programs.git.iniContent = cfg.extraConfig;
|
||||
})
|
||||
|
||||
(mkIf (lib.isString cfg.extraConfig) {
|
||||
warnings = [''
|
||||
Using programs.git.extraConfig as a string option is
|
||||
deprecated and will be removed in the future. Please
|
||||
change to using it as an attribute set instead.
|
||||
''];
|
||||
|
||||
xdg.configFile."git/config".text = cfg.extraConfig;
|
||||
})
|
||||
|
||||
(mkIf (cfg.includes != [ ]) {
|
||||
xdg.configFile."git/config".text = let
|
||||
include = i:
|
||||
with i;
|
||||
if condition != null then {
|
||||
includeIf.${condition}.path = "${path}";
|
||||
} else {
|
||||
include.path = "${path}";
|
||||
};
|
||||
in mkAfter
|
||||
(concatStringsSep "\n" (map gitToIni (map include cfg.includes)));
|
||||
})
|
||||
|
||||
"git/attributes" = mkIf (cfg.attributes != []) {
|
||||
text = concatStringsSep "\n" cfg.attributes + "\n";
|
||||
};
|
||||
(mkIf cfg.lfs.enable {
|
||||
home.packages = [ pkgs.git-lfs ];
|
||||
|
||||
programs.git.iniContent.filter.lfs =
|
||||
let skipArg = optional cfg.lfs.skipSmudge "--skip";
|
||||
in {
|
||||
clean = "git-lfs clean -- %f";
|
||||
process =
|
||||
concatStringsSep " " ([ "git-lfs" "filter-process" ] ++ skipArg);
|
||||
required = true;
|
||||
smudge = concatStringsSep " "
|
||||
([ "git-lfs" "smudge" ] ++ skipArg ++ [ "--" "%f" ]);
|
||||
};
|
||||
}
|
||||
|
||||
{
|
||||
programs.git.iniContent =
|
||||
let
|
||||
hasSmtp = name: account: account.smtp != null;
|
||||
|
||||
genIdentity = name: account: with account;
|
||||
nameValuePair "sendemail.${name}" ({
|
||||
smtpEncryption = if smtp.tls.enable then "tls" else "";
|
||||
smtpServer = smtp.host;
|
||||
smtpUser = userName;
|
||||
from = address;
|
||||
}
|
||||
// optionalAttrs (smtp.port != null) {
|
||||
smtpServerPort = smtp.port;
|
||||
});
|
||||
in
|
||||
mapAttrs' genIdentity
|
||||
(filterAttrs hasSmtp config.accounts.email.accounts);
|
||||
}
|
||||
|
||||
(mkIf (cfg.signing != null) {
|
||||
programs.git.iniContent = {
|
||||
user.signingKey = cfg.signing.key;
|
||||
commit.gpgSign = cfg.signing.signByDefault;
|
||||
gpg.program = cfg.signing.gpgPath;
|
||||
};
|
||||
})
|
||||
|
||||
(mkIf (cfg.aliases != {}) {
|
||||
programs.git.iniContent.alias = cfg.aliases;
|
||||
})
|
||||
|
||||
(mkIf (lib.isAttrs cfg.extraConfig) {
|
||||
programs.git.iniContent = cfg.extraConfig;
|
||||
})
|
||||
|
||||
(mkIf (lib.isString cfg.extraConfig) {
|
||||
warnings = [
|
||||
''
|
||||
Using programs.git.extraConfig as a string option is
|
||||
deprecated and will be removed in the future. Please
|
||||
change to using it as an attribute set instead.
|
||||
''
|
||||
];
|
||||
|
||||
xdg.configFile."git/config".text = cfg.extraConfig;
|
||||
})
|
||||
|
||||
(mkIf (cfg.includes != []) {
|
||||
xdg.configFile."git/config".text =
|
||||
let
|
||||
include = i: with i;
|
||||
if condition != null
|
||||
then { includeIf.${condition}.path = "${path}"; }
|
||||
else { include.path = "${path}"; };
|
||||
in
|
||||
mkAfter
|
||||
(concatStringsSep "\n"
|
||||
(map gitToIni
|
||||
(map include cfg.includes)));
|
||||
})
|
||||
|
||||
(mkIf cfg.lfs.enable {
|
||||
home.packages = [ pkgs.git-lfs ];
|
||||
|
||||
programs.git.iniContent.filter.lfs =
|
||||
let
|
||||
skipArg = optional cfg.lfs.skipSmudge "--skip";
|
||||
in
|
||||
{
|
||||
clean = "git-lfs clean -- %f";
|
||||
process = concatStringsSep " " (
|
||||
[ "git-lfs" "filter-process" ] ++ skipArg
|
||||
);
|
||||
required = true;
|
||||
smudge = concatStringsSep " " (
|
||||
[ "git-lfs" "smudge" ] ++ skipArg ++ [ "--" "%f" ]
|
||||
);
|
||||
};
|
||||
})
|
||||
]
|
||||
);
|
||||
})
|
||||
]);
|
||||
}
|
||||
|
|
|
@ -11,125 +11,118 @@ let
|
|||
. ${pkgs.gnome3.vte}/etc/profile.d/vte.sh
|
||||
'';
|
||||
|
||||
backForeSubModule = types.submodule (
|
||||
{ ... }: {
|
||||
options = {
|
||||
foreground = mkOption {
|
||||
type = types.str;
|
||||
description = "The foreground color.";
|
||||
};
|
||||
|
||||
background = mkOption {
|
||||
type = types.str;
|
||||
description = "The background color.";
|
||||
};
|
||||
backForeSubModule = types.submodule ({ ... }: {
|
||||
options = {
|
||||
foreground = mkOption {
|
||||
type = types.str;
|
||||
description = "The foreground color.";
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
profileColorsSubModule = types.submodule (
|
||||
{ ... }: {
|
||||
options = {
|
||||
foregroundColor = mkOption {
|
||||
type = types.str;
|
||||
description = "The foreground color.";
|
||||
};
|
||||
|
||||
backgroundColor = mkOption {
|
||||
type = types.str;
|
||||
description = "The background color.";
|
||||
};
|
||||
|
||||
boldColor = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr types.str;
|
||||
description = "The bold color, null to use same as foreground.";
|
||||
};
|
||||
|
||||
palette = mkOption {
|
||||
type = types.listOf types.str;
|
||||
description = "The terminal palette.";
|
||||
};
|
||||
|
||||
cursor = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr backForeSubModule;
|
||||
description = "The color for the terminal cursor.";
|
||||
};
|
||||
|
||||
highlight = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr backForeSubModule;
|
||||
description = "The colors for the terminal’s highlighted area.";
|
||||
};
|
||||
background = mkOption {
|
||||
type = types.str;
|
||||
description = "The background color.";
|
||||
};
|
||||
}
|
||||
);
|
||||
};
|
||||
});
|
||||
|
||||
profileSubModule = types.submodule (
|
||||
{ name, config, ... }: {
|
||||
options = {
|
||||
default = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = "Whether this should be the default profile.";
|
||||
};
|
||||
|
||||
visibleName = mkOption {
|
||||
type = types.str;
|
||||
description = "The profile name.";
|
||||
};
|
||||
|
||||
colors = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr profileColorsSubModule;
|
||||
description = "The terminal colors, null to use system default.";
|
||||
};
|
||||
|
||||
cursorShape = mkOption {
|
||||
default = "block";
|
||||
type = types.enum [ "block" "ibeam" "underline" ];
|
||||
description = "The cursor shape.";
|
||||
};
|
||||
|
||||
font = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr types.str;
|
||||
description = "The font name, null to use system default.";
|
||||
};
|
||||
|
||||
allowBold = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr types.bool;
|
||||
description = ''
|
||||
If <literal>true</literal>, allow applications in the
|
||||
terminal to make text boldface.
|
||||
'';
|
||||
};
|
||||
|
||||
scrollOnOutput = mkOption {
|
||||
default = true;
|
||||
type = types.bool;
|
||||
description = "Whether to scroll when output is written.";
|
||||
};
|
||||
|
||||
showScrollbar = mkOption {
|
||||
default = true;
|
||||
type = types.bool;
|
||||
description = "Whether the scroll bar should be visible.";
|
||||
};
|
||||
|
||||
scrollbackLines = mkOption {
|
||||
default = 10000;
|
||||
type = types.nullOr types.int;
|
||||
description =
|
||||
''
|
||||
The number of scrollback lines to keep, null for infinite.
|
||||
'';
|
||||
};
|
||||
profileColorsSubModule = types.submodule ({ ... }: {
|
||||
options = {
|
||||
foregroundColor = mkOption {
|
||||
type = types.str;
|
||||
description = "The foreground color.";
|
||||
};
|
||||
}
|
||||
);
|
||||
|
||||
backgroundColor = mkOption {
|
||||
type = types.str;
|
||||
description = "The background color.";
|
||||
};
|
||||
|
||||
boldColor = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr types.str;
|
||||
description = "The bold color, null to use same as foreground.";
|
||||
};
|
||||
|
||||
palette = mkOption {
|
||||
type = types.listOf types.str;
|
||||
description = "The terminal palette.";
|
||||
};
|
||||
|
||||
cursor = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr backForeSubModule;
|
||||
description = "The color for the terminal cursor.";
|
||||
};
|
||||
|
||||
highlight = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr backForeSubModule;
|
||||
description = "The colors for the terminal’s highlighted area.";
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
profileSubModule = types.submodule ({ name, config, ... }: {
|
||||
options = {
|
||||
default = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = "Whether this should be the default profile.";
|
||||
};
|
||||
|
||||
visibleName = mkOption {
|
||||
type = types.str;
|
||||
description = "The profile name.";
|
||||
};
|
||||
|
||||
colors = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr profileColorsSubModule;
|
||||
description = "The terminal colors, null to use system default.";
|
||||
};
|
||||
|
||||
cursorShape = mkOption {
|
||||
default = "block";
|
||||
type = types.enum [ "block" "ibeam" "underline" ];
|
||||
description = "The cursor shape.";
|
||||
};
|
||||
|
||||
font = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr types.str;
|
||||
description = "The font name, null to use system default.";
|
||||
};
|
||||
|
||||
allowBold = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr types.bool;
|
||||
description = ''
|
||||
If <literal>true</literal>, allow applications in the
|
||||
terminal to make text boldface.
|
||||
'';
|
||||
};
|
||||
|
||||
scrollOnOutput = mkOption {
|
||||
default = true;
|
||||
type = types.bool;
|
||||
description = "Whether to scroll when output is written.";
|
||||
};
|
||||
|
||||
showScrollbar = mkOption {
|
||||
default = true;
|
||||
type = types.bool;
|
||||
description = "Whether the scroll bar should be visible.";
|
||||
};
|
||||
|
||||
scrollbackLines = mkOption {
|
||||
default = 10000;
|
||||
type = types.nullOr types.int;
|
||||
description = ''
|
||||
The number of scrollback lines to keep, null for infinite.
|
||||
'';
|
||||
};
|
||||
};
|
||||
});
|
||||
|
||||
buildProfileSet = pcfg:
|
||||
{
|
||||
|
@ -137,56 +130,41 @@ let
|
|||
scrollbar-policy = if pcfg.showScrollbar then "always" else "never";
|
||||
scrollback-lines = pcfg.scrollbackLines;
|
||||
cursor-shape = pcfg.cursorShape;
|
||||
}
|
||||
// (
|
||||
if (pcfg.font == null)
|
||||
then { use-system-font = true; }
|
||||
else { use-system-font = false; font = pcfg.font; }
|
||||
) // (
|
||||
if (pcfg.colors == null)
|
||||
then { use-theme-colors = true; }
|
||||
else (
|
||||
{
|
||||
use-theme-colors = false;
|
||||
foreground-color = pcfg.colors.foregroundColor;
|
||||
background-color = pcfg.colors.backgroundColor;
|
||||
palette = pcfg.colors.palette;
|
||||
}
|
||||
// optionalAttrs (pcfg.allowBold != null) {
|
||||
allow-bold = pcfg.allowBold;
|
||||
}
|
||||
// (
|
||||
if (pcfg.colors.boldColor == null)
|
||||
then { bold-color-same-as-fg = true; }
|
||||
else {
|
||||
bold-color-same-as-fg = false;
|
||||
bold-color = pcfg.colors.boldColor;
|
||||
}
|
||||
)
|
||||
// (
|
||||
if (pcfg.colors.cursor != null)
|
||||
then {
|
||||
cursor-colors-set = true;
|
||||
cursor-foreground-color = pcfg.colors.cursor.foreground;
|
||||
cursor-background-color = pcfg.colors.cursor.background;
|
||||
}
|
||||
else { cursor-colors-set = false; }
|
||||
)
|
||||
// (
|
||||
if (pcfg.colors.highlight != null)
|
||||
then {
|
||||
highlight-colors-set = true;
|
||||
highlight-foreground-color = pcfg.colors.highlight.foreground;
|
||||
highlight-background-color = pcfg.colors.highlight.background;
|
||||
}
|
||||
else { highlight-colors-set = false; }
|
||||
)
|
||||
)
|
||||
);
|
||||
} // (if (pcfg.font == null) then {
|
||||
use-system-font = true;
|
||||
} else {
|
||||
use-system-font = false;
|
||||
font = pcfg.font;
|
||||
}) // (if (pcfg.colors == null) then {
|
||||
use-theme-colors = true;
|
||||
} else
|
||||
({
|
||||
use-theme-colors = false;
|
||||
foreground-color = pcfg.colors.foregroundColor;
|
||||
background-color = pcfg.colors.backgroundColor;
|
||||
palette = pcfg.colors.palette;
|
||||
} // optionalAttrs (pcfg.allowBold != null) {
|
||||
allow-bold = pcfg.allowBold;
|
||||
} // (if (pcfg.colors.boldColor == null) then {
|
||||
bold-color-same-as-fg = true;
|
||||
} else {
|
||||
bold-color-same-as-fg = false;
|
||||
bold-color = pcfg.colors.boldColor;
|
||||
}) // (if (pcfg.colors.cursor != null) then {
|
||||
cursor-colors-set = true;
|
||||
cursor-foreground-color = pcfg.colors.cursor.foreground;
|
||||
cursor-background-color = pcfg.colors.cursor.background;
|
||||
} else {
|
||||
cursor-colors-set = false;
|
||||
}) // (if (pcfg.colors.highlight != null) then {
|
||||
highlight-colors-set = true;
|
||||
highlight-foreground-color = pcfg.colors.highlight.foreground;
|
||||
highlight-background-color = pcfg.colors.highlight.background;
|
||||
} else {
|
||||
highlight-colors-set = false;
|
||||
})));
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
|
@ -206,7 +184,7 @@ in
|
|||
};
|
||||
|
||||
profile = mkOption {
|
||||
default = {};
|
||||
default = { };
|
||||
type = types.attrsOf profileSubModule;
|
||||
description = "A set of Gnome Terminal profiles.";
|
||||
};
|
||||
|
@ -216,25 +194,21 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.gnome3.gnome_terminal ];
|
||||
|
||||
dconf.settings =
|
||||
let
|
||||
dconfPath = "org/gnome/terminal/legacy";
|
||||
in
|
||||
{
|
||||
"${dconfPath}" = {
|
||||
default-show-menubar = cfg.showMenubar;
|
||||
theme-variant = cfg.themeVariant;
|
||||
schema-version = 3;
|
||||
};
|
||||
dconf.settings = let dconfPath = "org/gnome/terminal/legacy";
|
||||
in {
|
||||
"${dconfPath}" = {
|
||||
default-show-menubar = cfg.showMenubar;
|
||||
theme-variant = cfg.themeVariant;
|
||||
schema-version = 3;
|
||||
};
|
||||
|
||||
"${dconfPath}/profiles:" = {
|
||||
default = head (attrNames (filterAttrs (n: v: v.default) cfg.profile));
|
||||
list = attrNames cfg.profile;
|
||||
};
|
||||
}
|
||||
// mapAttrs' (n: v:
|
||||
nameValuePair ("${dconfPath}/profiles:/:${n}") (buildProfileSet v)
|
||||
) cfg.profile;
|
||||
"${dconfPath}/profiles:" = {
|
||||
default = head (attrNames (filterAttrs (n: v: v.default) cfg.profile));
|
||||
list = attrNames cfg.profile;
|
||||
};
|
||||
} // mapAttrs'
|
||||
(n: v: nameValuePair ("${dconfPath}/profiles:/:${n}") (buildProfileSet v))
|
||||
cfg.profile;
|
||||
|
||||
programs.bash.initExtra = mkBefore vteInitStr;
|
||||
programs.zsh.initExtra = vteInitStr;
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.go;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rvolosatovs ];
|
||||
|
||||
options = {
|
||||
|
@ -24,7 +22,7 @@ in
|
|||
|
||||
packages = mkOption {
|
||||
type = with types; attrsOf path;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
"golang.org/x/text" = builtins.fetchGit "https://go.googlesource.com/text";
|
||||
|
@ -47,18 +45,15 @@ in
|
|||
|
||||
extraGoPaths = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "extraGoPath1" "extraGoPath2" ];
|
||||
description =
|
||||
let
|
||||
goPathOpt = "programs.go.goPath";
|
||||
in
|
||||
''
|
||||
Extra <envar>GOPATH</envar>s relative to <envar>HOME</envar> appended
|
||||
after
|
||||
<varname><link linkend="opt-${goPathOpt}">${goPathOpt}</link></varname>,
|
||||
if that option is set.
|
||||
'';
|
||||
description = let goPathOpt = "programs.go.goPath";
|
||||
in ''
|
||||
Extra <envar>GOPATH</envar>s relative to <envar>HOME</envar> appended
|
||||
after
|
||||
<varname><link linkend="opt-${goPathOpt}">${goPathOpt}</link></varname>,
|
||||
if that option is set.
|
||||
'';
|
||||
};
|
||||
|
||||
goBin = mkOption {
|
||||
|
@ -74,24 +69,21 @@ in
|
|||
{
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
home.file =
|
||||
let
|
||||
goPath = if cfg.goPath != null then cfg.goPath else "go";
|
||||
mkSrc = n: v: { "${goPath}/src/${n}".source = v; };
|
||||
in
|
||||
foldl' (a: b: a // b) {} (mapAttrsToList mkSrc cfg.packages);
|
||||
home.file = let
|
||||
goPath = if cfg.goPath != null then cfg.goPath else "go";
|
||||
mkSrc = n: v: { "${goPath}/src/${n}".source = v; };
|
||||
in foldl' (a: b: a // b) { } (mapAttrsToList mkSrc cfg.packages);
|
||||
}
|
||||
|
||||
(mkIf (cfg.goPath != null) {
|
||||
home.sessionVariables.GOPATH =
|
||||
concatStringsSep ":"
|
||||
(map builtins.toPath
|
||||
home.sessionVariables.GOPATH = concatStringsSep ":" (map builtins.toPath
|
||||
(map (path: "${config.home.homeDirectory}/${path}")
|
||||
([cfg.goPath] ++ cfg.extraGoPaths)));
|
||||
([ cfg.goPath ] ++ cfg.extraGoPaths)));
|
||||
})
|
||||
|
||||
(mkIf (cfg.goBin != null) {
|
||||
home.sessionVariables.GOBIN = builtins.toPath "${config.home.homeDirectory}/${cfg.goBin}";
|
||||
home.sessionVariables.GOBIN =
|
||||
builtins.toPath "${config.home.homeDirectory}/${cfg.goBin}";
|
||||
})
|
||||
]);
|
||||
}
|
||||
|
|
|
@ -8,9 +8,7 @@ let
|
|||
|
||||
dag = config.lib.dag;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
|
@ -33,10 +31,7 @@ in
|
|||
};
|
||||
|
||||
config = mkIf (cfg.enable && !config.submoduleSupport.enable) {
|
||||
home.packages = [
|
||||
(pkgs.callPackage ../../home-manager {
|
||||
inherit (cfg) path;
|
||||
})
|
||||
];
|
||||
home.packages =
|
||||
[ (pkgs.callPackage ../../home-manager { inherit (cfg) path; }) ];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
with lib;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.programs.htop;
|
||||
|
||||
list = xs: concatMapStrings (x: "${toString x} ") xs;
|
||||
|
@ -81,16 +82,15 @@ let
|
|||
RightCPUs2 = 1;
|
||||
Blank = 2;
|
||||
CPU = 1;
|
||||
"CPU(1)"= 1;
|
||||
"CPU(1)" = 1;
|
||||
"CPU(2)" = 1;
|
||||
"CPU(3)" = 1;
|
||||
"CPU(4)" = 1;
|
||||
};
|
||||
|
||||
singleMeterType = types.coercedTo
|
||||
(types.enum (attrNames meters))
|
||||
(m: { kind = m; mode = meters.${m}; })
|
||||
(types.submodule {
|
||||
singleMeterType = let
|
||||
meterEnum = types.enum (attrNames meters);
|
||||
meterSubmodule = types.submodule {
|
||||
options = {
|
||||
kind = mkOption {
|
||||
type = types.enum (attrNames meters);
|
||||
|
@ -101,10 +101,15 @@ let
|
|||
mode = mkOption {
|
||||
type = types.enum [ 1 2 3 4 ];
|
||||
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 {
|
||||
options = {
|
||||
|
@ -115,7 +120,10 @@ let
|
|||
"Memory"
|
||||
"LeftCPUs2"
|
||||
"RightCPUs2"
|
||||
{ kind = "CPU"; mode = 3; }
|
||||
{
|
||||
kind = "CPU";
|
||||
mode = 3;
|
||||
}
|
||||
];
|
||||
type = types.listOf singleMeterType;
|
||||
};
|
||||
|
@ -123,7 +131,10 @@ let
|
|||
description = "Meters shown in the right header.";
|
||||
default = [ "Tasks" "LoadAverage" "Uptime" ];
|
||||
example = [
|
||||
{ kind = "Clock"; mode = 4; }
|
||||
{
|
||||
kind = "Clock";
|
||||
mode = 4;
|
||||
}
|
||||
"Uptime"
|
||||
"Tasks"
|
||||
];
|
||||
|
@ -131,15 +142,37 @@ let
|
|||
};
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
|
||||
in {
|
||||
options.programs.htop = {
|
||||
enable = mkEnableOption "htop";
|
||||
|
||||
fields = mkOption {
|
||||
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" ];
|
||||
example = [ "PID" "USER" "PRIORITY" "PERCENT_CPU" "M_RESIDENT" "PERCENT_MEM" "TIME" "COMM" ];
|
||||
default = [
|
||||
"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.";
|
||||
};
|
||||
|
||||
|
@ -225,7 +258,8 @@ in
|
|||
detailedCpuTime = mkOption {
|
||||
type = types.bool;
|
||||
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 {
|
||||
|
@ -272,14 +306,23 @@ in
|
|||
"CPU"
|
||||
"LeftCPUs2"
|
||||
"RightCPUs2"
|
||||
{ kind = "CPU"; mode = 3; }
|
||||
{
|
||||
kind = "CPU";
|
||||
mode = 3;
|
||||
}
|
||||
];
|
||||
right = [
|
||||
{ kind = "Clock"; mode = 4; }
|
||||
{
|
||||
kind = "Clock";
|
||||
mode = 4;
|
||||
}
|
||||
"Uptime"
|
||||
"Tasks"
|
||||
"LoadAverage"
|
||||
{ kind = "Battery"; mode = 1; }
|
||||
{
|
||||
kind = "Battery";
|
||||
mode = 1;
|
||||
}
|
||||
];
|
||||
};
|
||||
type = meterType;
|
||||
|
|
|
@ -34,9 +34,7 @@ let
|
|||
# from this package in the activation script.
|
||||
infoPkg = pkgs.texinfoInteractive;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.info = {
|
||||
enable = mkEnableOption "GNU Info";
|
||||
|
@ -55,19 +53,20 @@ in
|
|||
home.sessionVariables.INFOPATH =
|
||||
"${cfg.homeInfoDirLocation}\${INFOPATH:+:}\${INFOPATH}";
|
||||
|
||||
home.activation.createHomeInfoDir = hm.dag.entryAfter ["installPackages"] ''
|
||||
oPATH=$PATH
|
||||
export PATH="${lib.makeBinPath [ pkgs.gzip ]}''${PATH:+:}$PATH"
|
||||
$DRY_RUN_CMD mkdir -p "${cfg.homeInfoDirLocation}"
|
||||
$DRY_RUN_CMD rm -f "${cfg.homeInfoDirLocation}/dir"
|
||||
if [[ -d "${homeInfoPath}" ]]; then
|
||||
find -L "${homeInfoPath}" \( -name '*.info' -o -name '*.info.gz' \) \
|
||||
-exec $DRY_RUN_CMD ${infoPkg}/bin/install-info '{}' \
|
||||
"${cfg.homeInfoDirLocation}/dir" \;
|
||||
fi
|
||||
export PATH="$oPATH"
|
||||
unset oPATH
|
||||
'';
|
||||
home.activation.createHomeInfoDir =
|
||||
hm.dag.entryAfter [ "installPackages" ] ''
|
||||
oPATH=$PATH
|
||||
export PATH="${lib.makeBinPath [ pkgs.gzip ]}''${PATH:+:}$PATH"
|
||||
$DRY_RUN_CMD mkdir -p "${cfg.homeInfoDirLocation}"
|
||||
$DRY_RUN_CMD rm -f "${cfg.homeInfoDirLocation}/dir"
|
||||
if [[ -d "${homeInfoPath}" ]]; then
|
||||
find -L "${homeInfoPath}" \( -name '*.info' -o -name '*.info.gz' \) \
|
||||
-exec $DRY_RUN_CMD ${infoPkg}/bin/install-info '{}' \
|
||||
"${cfg.homeInfoDirLocation}/dir" \;
|
||||
fi
|
||||
export PATH="$oPATH"
|
||||
unset oPATH
|
||||
'';
|
||||
|
||||
home.packages = [ infoPkg ];
|
||||
|
||||
|
|
|
@ -15,19 +15,17 @@ let
|
|||
|
||||
colorsType = types.submodule {
|
||||
options = {
|
||||
null = colorType;
|
||||
false = colorType;
|
||||
true = colorType;
|
||||
null = colorType;
|
||||
false = colorType;
|
||||
true = colorType;
|
||||
numbers = colorType;
|
||||
strings = colorType;
|
||||
arrays = colorType;
|
||||
arrays = colorType;
|
||||
objects = colorType;
|
||||
};
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.jq = {
|
||||
enable = mkEnableOption "the jq command-line JSON processor";
|
||||
|
@ -52,12 +50,12 @@ in
|
|||
'';
|
||||
|
||||
default = {
|
||||
null = "1;30";
|
||||
false = "0;39";
|
||||
true = "0;39";
|
||||
null = "1;30";
|
||||
false = "0;39";
|
||||
true = "0;39";
|
||||
numbers = "0;39";
|
||||
strings = "0;32";
|
||||
arrays = "1;39";
|
||||
arrays = "1;39";
|
||||
objects = "1;39";
|
||||
};
|
||||
|
||||
|
@ -69,8 +67,10 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.jq ];
|
||||
|
||||
home.sessionVariables = let c = cfg.colors; in {
|
||||
JQ_COLORS = "${c.null}:${c.false}:${c.true}:${c.numbers}:${c.strings}:${c.arrays}:${c.objects}";
|
||||
home.sessionVariables = let c = cfg.colors;
|
||||
in {
|
||||
JQ_COLORS =
|
||||
"${c.null}:${c.false}:${c.true}:${c.numbers}:${c.strings}:${c.arrays}:${c.objects}";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -10,16 +10,44 @@ let
|
|||
options = {
|
||||
name = mkOption {
|
||||
type = types.enum [
|
||||
"NormalBegin" "NormalIdle" "NormalEnd" "NormalKey"
|
||||
"InsertBegin" "InsertIdle" "InsertEnd" "InsertKey"
|
||||
"InsertChar" "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"
|
||||
"NormalBegin"
|
||||
"NormalIdle"
|
||||
"NormalEnd"
|
||||
"NormalKey"
|
||||
"InsertBegin"
|
||||
"InsertIdle"
|
||||
"InsertEnd"
|
||||
"InsertKey"
|
||||
"InsertChar"
|
||||
"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"
|
||||
];
|
||||
example = "SetOption";
|
||||
|
@ -159,7 +187,8 @@ let
|
|||
};
|
||||
|
||||
autoInfo = mkOption {
|
||||
type = types.nullOr (types.listOf (types.enum [ "command" "onkey" "normal" ]));
|
||||
type = types.nullOr
|
||||
(types.listOf (types.enum [ "command" "onkey" "normal" ]));
|
||||
default = null;
|
||||
example = [ "command" "normal" ];
|
||||
description = ''
|
||||
|
@ -169,7 +198,7 @@ let
|
|||
};
|
||||
|
||||
autoComplete = mkOption {
|
||||
type = types.nullOr(types.listOf (types.enum [ "insert" "prompt" ]));
|
||||
type = types.nullOr (types.listOf (types.enum [ "insert" "prompt" ]));
|
||||
default = null;
|
||||
description = ''
|
||||
Modes in which to display possible completions.
|
||||
|
@ -450,7 +479,7 @@ let
|
|||
|
||||
keyMappings = mkOption {
|
||||
type = types.listOf keyMapping;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = ''
|
||||
User-defined key mappings. For documentation, see
|
||||
<link xlink:href="https://github.com/mawww/kakoune/blob/master/doc/pages/mapping.asciidoc"/>.
|
||||
|
@ -459,7 +488,7 @@ let
|
|||
|
||||
hooks = mkOption {
|
||||
type = types.listOf hook;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = ''
|
||||
Global hooks. For documentation, see
|
||||
<link xlink:href="https://github.com/mawww/kakoune/blob/master/doc/pages/hooks.asciidoc"/>.
|
||||
|
@ -468,92 +497,103 @@ let
|
|||
};
|
||||
};
|
||||
|
||||
configFile =
|
||||
let
|
||||
wrapOptions = with cfg.config.wrapLines; concatStrings [
|
||||
configFile = let
|
||||
wrapOptions = with cfg.config.wrapLines;
|
||||
concatStrings [
|
||||
"${optionalString word " -word"}"
|
||||
"${optionalString indent " -indent"}"
|
||||
"${optionalString (marker != null) " -marker ${marker}"}"
|
||||
"${optionalString (maxWidth != null) " -width ${toString maxWidth}"}"
|
||||
];
|
||||
|
||||
numberLinesOptions = with cfg.config.numberLines; concatStrings [
|
||||
numberLinesOptions = with cfg.config.numberLines;
|
||||
concatStrings [
|
||||
"${optionalString relative " -relative "}"
|
||||
"${optionalString highlightCursor " -hlcursor"}"
|
||||
"${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_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_enable_mouse=${if enableMouse then "true" else "false"}"
|
||||
"ncurses_change_colors=${if changeColors then "true" else "false"}"
|
||||
"${optionalString (wheelDownButton != null)
|
||||
"ncurses_wheel_down_button=${wheelDownButton}"}"
|
||||
"ncurses_wheel_down_button=${wheelDownButton}"}"
|
||||
"${optionalString (wheelUpButton != null)
|
||||
"ncurses_wheel_up_button=${wheelUpButton}"}"
|
||||
"ncurses_wheel_up_button=${wheelUpButton}"}"
|
||||
"${optionalString (shiftFunctionKeys != null)
|
||||
"ncurses_shift_function_key=${toString shiftFunctionKeys}"}"
|
||||
"ncurses_builtin_key_parser=${if useBuiltinKeyParser then "true" else "false"}"
|
||||
"ncurses_shift_function_key=${toString shiftFunctionKeys}"}"
|
||||
"ncurses_builtin_key_parser=${
|
||||
if useBuiltinKeyParser then "true" else "false"
|
||||
}"
|
||||
];
|
||||
|
||||
keyMappingString = km: concatStringsSep " " [
|
||||
keyMappingString = km:
|
||||
concatStringsSep " " [
|
||||
"map global"
|
||||
"${km.mode} ${km.key} '${km.effect}'"
|
||||
"${optionalString (km.docstring != null) "-docstring '${km.docstring}'"}"
|
||||
"${optionalString (km.docstring != null)
|
||||
"-docstring '${km.docstring}'"}"
|
||||
];
|
||||
|
||||
hookString = h: concatStringsSep " " [
|
||||
"hook" "${optionalString (h.group != null) "-group ${group}"}"
|
||||
"${optionalString (h.once) "-once"}" "global"
|
||||
"${h.name}" "${optionalString (h.option != null) h.option}"
|
||||
hookString = h:
|
||||
concatStringsSep " " [
|
||||
"hook"
|
||||
"${optionalString (h.group != null) "-group ${group}"}"
|
||||
"${optionalString (h.once) "-once"}"
|
||||
"global"
|
||||
"${h.name}"
|
||||
"${optionalString (h.option != null) h.option}"
|
||||
"%{ ${h.commands} }"
|
||||
];
|
||||
|
||||
cfgStr = with cfg.config; concatStringsSep "\n" (
|
||||
[ "# Generated by home-manager" ]
|
||||
cfgStr = with cfg.config;
|
||||
concatStringsSep "\n" ([ "# Generated by home-manager" ]
|
||||
++ optional (colorScheme != null) "colorscheme ${colorScheme}"
|
||||
++ optional (tabStop != null) "set-option global tabstop ${toString tabStop}"
|
||||
++ optional (indentWidth != null) "set-option global indentwidth ${toString indentWidth}"
|
||||
++ optional (tabStop != null)
|
||||
"set-option global tabstop ${toString tabStop}"
|
||||
++ optional (indentWidth != null)
|
||||
"set-option global indentwidth ${toString indentWidth}"
|
||||
++ optional (!incrementalSearch) "set-option global incsearch false"
|
||||
++ optional (alignWithTabs) "set-option global aligntab true"
|
||||
++ optional (autoInfo != null) "set-option global autoinfo ${concatStringsSep "|" autoInfo}"
|
||||
++ optional (autoComplete != null) "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 (autoInfo != null)
|
||||
"set-option global autoinfo ${concatStringsSep "|" autoInfo}"
|
||||
++ optional (autoComplete != null)
|
||||
"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)
|
||||
"add-highlighter global/ number-lines${numberLinesOptions}"
|
||||
"add-highlighter global/ number-lines${numberLinesOptions}"
|
||||
++ optional showMatching "add-highlighter global/ show-matching"
|
||||
++ 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" ]
|
||||
++ optional (ui != null) "set-option global ui_options ${uiOptions}"
|
||||
|
||||
++ [ "# Key mappings" ]
|
||||
++ map keyMappingString keyMappings
|
||||
++ [ "# Key mappings" ] ++ map keyMappingString keyMappings
|
||||
|
||||
++ [ "# Hooks" ]
|
||||
++ map hookString hooks
|
||||
);
|
||||
in
|
||||
pkgs.writeText "kakrc" (
|
||||
optionalString (cfg.config != null) cfgStr
|
||||
+ "\n"
|
||||
+ cfg.extraConfig
|
||||
);
|
||||
++ [ "# Hooks" ] ++ map hookString hooks);
|
||||
in pkgs.writeText "kakrc"
|
||||
(optionalString (cfg.config != null) cfgStr + "\n" + cfg.extraConfig);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.kakoune = {
|
||||
enable = mkEnableOption "the kakoune text editor";
|
||||
|
||||
config = mkOption {
|
||||
type = types.nullOr configModule;
|
||||
default = {};
|
||||
default = { };
|
||||
description = "kakoune configuration options.";
|
||||
};
|
||||
|
||||
|
|
|
@ -6,15 +6,16 @@ let
|
|||
|
||||
cfg = config.programs.keychain;
|
||||
|
||||
flags = cfg.extraFlags
|
||||
++ optional (cfg.agents != []) "--agents ${concatStringsSep "," cfg.agents}"
|
||||
flags = cfg.extraFlags ++ optional (cfg.agents != [ ])
|
||||
"--agents ${concatStringsSep "," cfg.agents}"
|
||||
++ 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 ];
|
||||
|
||||
options.programs.keychain = {
|
||||
|
@ -39,14 +40,15 @@ in
|
|||
|
||||
agents = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = ''
|
||||
Agents to add.
|
||||
'';
|
||||
};
|
||||
|
||||
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;
|
||||
description = ''
|
||||
Inherit type to attempt from agent variables from the environment.
|
||||
|
|
|
@ -11,12 +11,10 @@ let
|
|||
ll = "ls -l";
|
||||
la = "ls -a";
|
||||
lt = "ls --tree";
|
||||
lla ="ls -la";
|
||||
lla = "ls -la";
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.marsam ];
|
||||
|
||||
options.programs.lsd = {
|
||||
|
|
|
@ -9,16 +9,13 @@ let
|
|||
formatLine = o: n: v:
|
||||
let
|
||||
formatValue = v:
|
||||
if isBool v then (if v then "True" else "False")
|
||||
else toString v;
|
||||
in
|
||||
if isAttrs v
|
||||
then concatStringsSep "\n" (mapAttrsToList (formatLine "${o}${n}.") v)
|
||||
else (if v == "" then "" else "${o}${n}: ${formatValue v}");
|
||||
if isBool v then (if v then "True" else "False") else toString v;
|
||||
in if isAttrs v then
|
||||
concatStringsSep "\n" (mapAttrsToList (formatLine "${o}${n}.") v)
|
||||
else
|
||||
(if v == "" then "" else "${o}${n}: ${formatValue v}");
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rprospero ];
|
||||
|
||||
options.programs.matplotlib = {
|
||||
|
@ -31,7 +28,7 @@ in
|
|||
Add terms to the <filename>matplotlibrc</filename> file to
|
||||
control the default matplotlib behavior.
|
||||
'';
|
||||
example = literalExample ''
|
||||
example = literalExample ''
|
||||
{
|
||||
backend = "Qt5Agg";
|
||||
axes = {
|
||||
|
@ -55,10 +52,8 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
xdg.configFile."matplotlib/matplotlibrc".text =
|
||||
concatStringsSep "\n" ([]
|
||||
++ mapAttrsToList (formatLine "") cfg.config
|
||||
++ optional (cfg.extraConfig != "") cfg.extraConfig
|
||||
) + "\n";
|
||||
xdg.configFile."matplotlib/matplotlibrc".text = concatStringsSep "\n" ([ ]
|
||||
++ mapAttrsToList (formatLine "") cfg.config
|
||||
++ optional (cfg.extraConfig != "") cfg.extraConfig) + "\n";
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
extraConfigType = with lib.types; attrsOf (either (either str int) bool);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options.mbsync = {
|
||||
enable = mkEnableOption "synchronization using mbsync";
|
||||
|
||||
|
@ -62,7 +60,7 @@ in
|
|||
|
||||
extraConfig.channel = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
MaxMessages = 10000;
|
||||
|
@ -76,7 +74,7 @@ in
|
|||
|
||||
extraConfig.local = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
Local store extra configuration.
|
||||
'';
|
||||
|
@ -84,7 +82,7 @@ in
|
|||
|
||||
extraConfig.remote = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
Remote store extra configuration.
|
||||
'';
|
||||
|
@ -92,7 +90,7 @@ in
|
|||
|
||||
extraConfig.account = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
PipelineDepth = 10;
|
||||
|
|
|
@ -10,14 +10,15 @@ let
|
|||
mbsyncAccounts =
|
||||
filter (a: a.mbsync.enable) (attrValues config.accounts.email.accounts);
|
||||
|
||||
genTlsConfig = tls: {
|
||||
SSLType =
|
||||
if !tls.enable then "None"
|
||||
else if tls.useStartTls then "STARTTLS"
|
||||
else "IMAPS";
|
||||
}
|
||||
//
|
||||
optionalAttrs (tls.enable && tls.certificatesFile != null) {
|
||||
genTlsConfig = tls:
|
||||
{
|
||||
SSLType = if !tls.enable then
|
||||
"None"
|
||||
else if tls.useStartTls then
|
||||
"STARTTLS"
|
||||
else
|
||||
"IMAPS";
|
||||
} // optionalAttrs (tls.enable && tls.certificatesFile != null) {
|
||||
CertificateFile = toString tls.certificatesFile;
|
||||
};
|
||||
|
||||
|
@ -30,79 +31,61 @@ let
|
|||
|
||||
genSection = header: entries:
|
||||
let
|
||||
escapeValue = escape [ "\"" ];
|
||||
escapeValue = escape [ ''"'' ];
|
||||
hasSpace = v: builtins.match ".* .*" v != null;
|
||||
genValue = n: v:
|
||||
if isList v
|
||||
then concatMapStringsSep " " (genValue n) v
|
||||
else if isBool v then (if v then "yes" else "no")
|
||||
else if isInt v then toString v
|
||||
else if isString v && hasSpace v then "\"${escapeValue v}\""
|
||||
else if isString v then v
|
||||
if isList v then
|
||||
concatMapStringsSep " " (genValue n) v
|
||||
else if isBool v then
|
||||
(if v then "yes" else "no")
|
||||
else if isInt v then
|
||||
toString v
|
||||
else if isString v && hasSpace v then
|
||||
''"${escapeValue v}"''
|
||||
else if isString v then
|
||||
v
|
||||
else
|
||||
let prettyV = lib.generators.toPretty {} v;
|
||||
in throw "mbsync: unexpected value for option ${n}: '${prettyV}'";
|
||||
in
|
||||
''
|
||||
${header}
|
||||
${concatStringsSep "\n"
|
||||
(mapAttrsToList (n: v: "${n} ${genValue n v}") entries)}
|
||||
'';
|
||||
let prettyV = lib.generators.toPretty { } v;
|
||||
in throw "mbsync: unexpected value for option ${n}: '${prettyV}'";
|
||||
in ''
|
||||
${header}
|
||||
${concatStringsSep "\n"
|
||||
(mapAttrsToList (n: v: "${n} ${genValue n v}") entries)}
|
||||
'';
|
||||
|
||||
genAccountConfig = account: with account;
|
||||
genSection "IMAPAccount ${name}" (
|
||||
{
|
||||
Host = imap.host;
|
||||
User = userName;
|
||||
PassCmd = toString passwordCommand;
|
||||
}
|
||||
// genTlsConfig imap.tls
|
||||
// optionalAttrs (imap.port != null) { Port = toString imap.port; }
|
||||
// mbsync.extraConfig.account
|
||||
)
|
||||
+ "\n"
|
||||
+ genSection "IMAPStore ${name}-remote" (
|
||||
{
|
||||
Account = name;
|
||||
}
|
||||
// mbsync.extraConfig.remote
|
||||
)
|
||||
+ "\n"
|
||||
+ genSection "MaildirStore ${name}-local" (
|
||||
{
|
||||
Path = "${maildir.absPath}/";
|
||||
Inbox = "${maildir.absPath}/${folders.inbox}";
|
||||
SubFolders = "Verbatim";
|
||||
}
|
||||
// optionalAttrs (mbsync.flatten != null) { Flatten = mbsync.flatten; }
|
||||
// mbsync.extraConfig.local
|
||||
)
|
||||
+ "\n"
|
||||
+ genSection "Channel ${name}" (
|
||||
{
|
||||
Master = ":${name}-remote:";
|
||||
Slave = ":${name}-local:";
|
||||
Patterns = mbsync.patterns;
|
||||
Create = masterSlaveMapping.${mbsync.create};
|
||||
Remove = masterSlaveMapping.${mbsync.remove};
|
||||
Expunge = masterSlaveMapping.${mbsync.expunge};
|
||||
SyncState = "*";
|
||||
}
|
||||
// mbsync.extraConfig.channel
|
||||
)
|
||||
+ "\n";
|
||||
genAccountConfig = account:
|
||||
with account;
|
||||
genSection "IMAPAccount ${name}" ({
|
||||
Host = imap.host;
|
||||
User = userName;
|
||||
PassCmd = toString passwordCommand;
|
||||
} // genTlsConfig imap.tls
|
||||
// optionalAttrs (imap.port != null) { Port = toString imap.port; }
|
||||
// mbsync.extraConfig.account) + "\n"
|
||||
+ genSection "IMAPStore ${name}-remote"
|
||||
({ Account = name; } // mbsync.extraConfig.remote) + "\n"
|
||||
+ genSection "MaildirStore ${name}-local" ({
|
||||
Path = "${maildir.absPath}/";
|
||||
Inbox = "${maildir.absPath}/${folders.inbox}";
|
||||
SubFolders = "Verbatim";
|
||||
} // optionalAttrs (mbsync.flatten != null) { Flatten = mbsync.flatten; }
|
||||
// mbsync.extraConfig.local) + "\n" + genSection "Channel ${name}" ({
|
||||
Master = ":${name}-remote:";
|
||||
Slave = ":${name}-local:";
|
||||
Patterns = mbsync.patterns;
|
||||
Create = masterSlaveMapping.${mbsync.create};
|
||||
Remove = masterSlaveMapping.${mbsync.remove};
|
||||
Expunge = masterSlaveMapping.${mbsync.expunge};
|
||||
SyncState = "*";
|
||||
} // mbsync.extraConfig.channel) + "\n";
|
||||
|
||||
genGroupConfig = name: channels:
|
||||
let
|
||||
genGroupChannel = n: boxes: "Channel ${n}:${concatStringsSep "," boxes}";
|
||||
in
|
||||
concatStringsSep "\n" (
|
||||
[ "Group ${name}" ] ++ mapAttrsToList genGroupChannel channels
|
||||
);
|
||||
in concatStringsSep "\n"
|
||||
([ "Group ${name}" ] ++ mapAttrsToList genGroupChannel channels);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.mbsync = {
|
||||
enable = mkEnableOption "mbsync IMAP4 and Maildir mailbox synchronizer";
|
||||
|
@ -117,7 +100,7 @@ in
|
|||
|
||||
groups = mkOption {
|
||||
type = types.attrsOf (types.attrsOf (types.listOf types.str));
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
inboxes = {
|
||||
|
@ -142,41 +125,34 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions =
|
||||
let
|
||||
checkAccounts = pred: msg:
|
||||
let
|
||||
badAccounts = filter pred mbsyncAccounts;
|
||||
in {
|
||||
assertion = badAccounts == [];
|
||||
message = "mbsync: ${msg} for accounts: "
|
||||
+ concatMapStringsSep ", " (a: a.name) badAccounts;
|
||||
};
|
||||
in
|
||||
[
|
||||
(checkAccounts (a: a.maildir == null) "Missing maildir configuration")
|
||||
(checkAccounts (a: a.imap == null) "Missing IMAP configuration")
|
||||
(checkAccounts (a: a.passwordCommand == null) "Missing passwordCommand")
|
||||
(checkAccounts (a: a.userName == null) "Missing username")
|
||||
];
|
||||
assertions = let
|
||||
checkAccounts = pred: msg:
|
||||
let badAccounts = filter pred mbsyncAccounts;
|
||||
in {
|
||||
assertion = badAccounts == [ ];
|
||||
message = "mbsync: ${msg} for accounts: "
|
||||
+ concatMapStringsSep ", " (a: a.name) badAccounts;
|
||||
};
|
||||
in [
|
||||
(checkAccounts (a: a.maildir == null) "Missing maildir configuration")
|
||||
(checkAccounts (a: a.imap == null) "Missing IMAP configuration")
|
||||
(checkAccounts (a: a.passwordCommand == null) "Missing passwordCommand")
|
||||
(checkAccounts (a: a.userName == null) "Missing username")
|
||||
];
|
||||
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
programs.notmuch.new.ignore = [ ".uidvalidity" ".mbsyncstate" ];
|
||||
|
||||
home.file.".mbsyncrc".text =
|
||||
let
|
||||
accountsConfig = map genAccountConfig mbsyncAccounts;
|
||||
groupsConfig = mapAttrsToList genGroupConfig cfg.groups;
|
||||
in
|
||||
concatStringsSep "\n" (
|
||||
[ "# Generated by Home Manager.\n" ]
|
||||
++ optional (cfg.extraConfig != "") cfg.extraConfig
|
||||
++ accountsConfig
|
||||
++ groupsConfig
|
||||
) + "\n";
|
||||
home.file.".mbsyncrc".text = let
|
||||
accountsConfig = map genAccountConfig mbsyncAccounts;
|
||||
groupsConfig = mapAttrsToList genGroupConfig cfg.groups;
|
||||
in concatStringsSep "\n" ([''
|
||||
# Generated by Home Manager.
|
||||
''] ++ optional (cfg.extraConfig != "") cfg.extraConfig ++ accountsConfig
|
||||
++ groupsConfig) + "\n";
|
||||
|
||||
home.activation = mkIf (mbsyncAccounts != []) {
|
||||
home.activation = mkIf (mbsyncAccounts != [ ]) {
|
||||
createMaildir =
|
||||
hm.dag.entryBetween [ "linkGeneration" ] [ "writeBoundary" ] ''
|
||||
$DRY_RUN_CMD mkdir -m700 -p $VERBOSE_ARG ${
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.mercurial;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
|
||||
options = {
|
||||
programs.mercurial = {
|
||||
|
@ -33,13 +31,13 @@ in
|
|||
|
||||
aliases = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
description = "Mercurial aliases to define.";
|
||||
};
|
||||
|
||||
extraConfig = mkOption {
|
||||
type = types.either types.attrs types.lines;
|
||||
default = {};
|
||||
default = { };
|
||||
description = "Additional configuration to add.";
|
||||
};
|
||||
|
||||
|
@ -50,53 +48,53 @@ in
|
|||
|
||||
ignores = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "*~" "*.swp" ];
|
||||
description = "List of globs for files to be globally ignored.";
|
||||
};
|
||||
|
||||
ignoresRegexp = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "^.*~$" "^.*\\.swp$" ];
|
||||
description =
|
||||
"List of regular expressions for files to be globally ignored.";
|
||||
"List of regular expressions for files to be globally ignored.";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable (
|
||||
mkMerge [
|
||||
{
|
||||
home.packages = [ cfg.package ];
|
||||
config = mkIf cfg.enable (mkMerge [
|
||||
{
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
programs.mercurial.iniContent.ui = {
|
||||
username = cfg.userName + " <" + cfg.userEmail + ">";
|
||||
};
|
||||
programs.mercurial.iniContent.ui = {
|
||||
username = cfg.userName + " <" + cfg.userEmail + ">";
|
||||
};
|
||||
|
||||
xdg.configFile."hg/hgrc".text = generators.toINI {} cfg.iniContent;
|
||||
}
|
||||
xdg.configFile."hg/hgrc".text = generators.toINI { } cfg.iniContent;
|
||||
}
|
||||
|
||||
(mkIf (cfg.ignores != [] || cfg.ignoresRegexp != []) {
|
||||
programs.mercurial.iniContent.ui.ignore =
|
||||
"${config.xdg.configHome}/hg/hgignore_global";
|
||||
(mkIf (cfg.ignores != [ ] || cfg.ignoresRegexp != [ ]) {
|
||||
programs.mercurial.iniContent.ui.ignore =
|
||||
"${config.xdg.configHome}/hg/hgignore_global";
|
||||
|
||||
xdg.configFile."hg/hgignore_global".text =
|
||||
"syntax: glob\n" + concatStringsSep "\n" cfg.ignores + "\n" +
|
||||
"syntax: regexp\n" + concatStringsSep "\n" cfg.ignoresRegexp + "\n";
|
||||
})
|
||||
xdg.configFile."hg/hgignore_global".text = ''
|
||||
syntax: glob
|
||||
'' + concatStringsSep "\n" cfg.ignores + "\n" + ''
|
||||
syntax: regexp
|
||||
'' + concatStringsSep "\n" cfg.ignoresRegexp + "\n";
|
||||
})
|
||||
|
||||
(mkIf (cfg.aliases != {}) {
|
||||
programs.mercurial.iniContent.alias = cfg.aliases;
|
||||
})
|
||||
(mkIf (cfg.aliases != { }) {
|
||||
programs.mercurial.iniContent.alias = cfg.aliases;
|
||||
})
|
||||
|
||||
(mkIf (lib.isAttrs cfg.extraConfig) {
|
||||
programs.mercurial.iniContent = cfg.extraConfig;
|
||||
})
|
||||
(mkIf (lib.isAttrs cfg.extraConfig) {
|
||||
programs.mercurial.iniContent = cfg.extraConfig;
|
||||
})
|
||||
|
||||
(mkIf (lib.isString cfg.extraConfig) {
|
||||
xdg.configFile."hg/hgrc".text = cfg.extraConfig;
|
||||
})
|
||||
]
|
||||
);
|
||||
(mkIf (lib.isString cfg.extraConfig) {
|
||||
xdg.configFile."hg/hgrc".text = cfg.extraConfig;
|
||||
})
|
||||
]);
|
||||
}
|
||||
|
|
|
@ -23,31 +23,21 @@ let
|
|||
}.${typeOf option};
|
||||
|
||||
renderOptions = options:
|
||||
concatStringsSep "\n"
|
||||
(mapAttrsToList
|
||||
(name: value:
|
||||
let
|
||||
rendered = renderOption value;
|
||||
length = toString (stringLength rendered);
|
||||
in
|
||||
"${name}=%${length}%${rendered}")
|
||||
options);
|
||||
concatStringsSep "\n" (mapAttrsToList (name: value:
|
||||
let
|
||||
rendered = renderOption value;
|
||||
length = toString (stringLength rendered);
|
||||
in "${name}=%${length}%${rendered}") options);
|
||||
|
||||
renderProfiles = profiles:
|
||||
concatStringsSep "\n"
|
||||
(mapAttrsToList
|
||||
(name: value: ''
|
||||
[${name}]
|
||||
${renderOptions value}
|
||||
'')
|
||||
profiles);
|
||||
concatStringsSep "\n" (mapAttrsToList (name: value: ''
|
||||
[${name}]
|
||||
${renderOptions value}
|
||||
'') profiles);
|
||||
|
||||
renderBindings = bindings:
|
||||
concatStringsSep "\n"
|
||||
(mapAttrsToList
|
||||
(name: value:
|
||||
"${name} ${value}")
|
||||
bindings);
|
||||
(mapAttrsToList (name: value: "${name} ${value}") bindings);
|
||||
|
||||
in {
|
||||
options = {
|
||||
|
@ -56,7 +46,7 @@ in {
|
|||
|
||||
scripts = mkOption {
|
||||
type = with types; listOf (either package str);
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = literalExample "[ pkgs.mpvScripts.mpris ]";
|
||||
description = ''
|
||||
List of scripts to use with mpv.
|
||||
|
@ -74,7 +64,7 @@ in {
|
|||
for the full list of options.
|
||||
'';
|
||||
type = mpvOptions;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
profile = "gpu-hq";
|
||||
|
@ -92,7 +82,7 @@ in {
|
|||
<option>programs.mpv.config</option> for more information.
|
||||
'';
|
||||
type = mpvProfiles;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
fast = {
|
||||
|
@ -117,7 +107,7 @@ in {
|
|||
for the full list of options.
|
||||
'';
|
||||
type = mpvBindings;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
WHEEL_UP = "seek 10";
|
||||
|
@ -131,19 +121,20 @@ in {
|
|||
|
||||
config = mkIf cfg.enable (mkMerge [
|
||||
{
|
||||
home.packages = [(
|
||||
if cfg.scripts == []
|
||||
then pkgs.mpv
|
||||
else pkgs.mpv-with-scripts.override { scripts = cfg.scripts; }
|
||||
)];
|
||||
home.packages = [
|
||||
(if cfg.scripts == [ ] then
|
||||
pkgs.mpv
|
||||
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 = ''
|
||||
${optionalString (cfg.config != {}) (renderOptions cfg.config)}
|
||||
${optionalString (cfg.profiles != {}) (renderProfiles cfg.profiles)}
|
||||
${optionalString (cfg.config != { }) (renderOptions cfg.config)}
|
||||
${optionalString (cfg.profiles != { }) (renderProfiles cfg.profiles)}
|
||||
'';
|
||||
})
|
||||
(mkIf (cfg.bindings != {}) {
|
||||
(mkIf (cfg.bindings != { }) {
|
||||
xdg.configFile."mpv/input.conf".text = renderBindings cfg.bindings;
|
||||
})
|
||||
]);
|
||||
|
|
|
@ -23,7 +23,8 @@ with lib;
|
|||
};
|
||||
|
||||
tls.fingerprint = mkOption {
|
||||
type = types.nullOr (types.strMatching "([[:alnum:]]{2}\:)+[[:alnum:]]{2}");
|
||||
type =
|
||||
types.nullOr (types.strMatching "([[:alnum:]]{2}:)+[[:alnum:]]{2}");
|
||||
default = null;
|
||||
example = "my:SH:a2:56:ha:sh";
|
||||
description = ''
|
||||
|
|
|
@ -6,38 +6,32 @@ let
|
|||
|
||||
cfg = config.programs.msmtp;
|
||||
|
||||
msmtpAccounts = filter (a: a.msmtp.enable)
|
||||
(attrValues config.accounts.email.accounts);
|
||||
msmtpAccounts =
|
||||
filter (a: a.msmtp.enable) (attrValues config.accounts.email.accounts);
|
||||
|
||||
onOff = p: if p then "on" else "off";
|
||||
|
||||
accountStr = account: with account;
|
||||
concatStringsSep "\n" (
|
||||
[ "account ${name}" ]
|
||||
++ mapAttrsToList (n: v: n + " " + v) (
|
||||
{
|
||||
host = smtp.host;
|
||||
from = address;
|
||||
auth = "on";
|
||||
user = userName;
|
||||
tls = onOff smtp.tls.enable;
|
||||
tls_starttls = onOff smtp.tls.useStartTls;
|
||||
tls_trust_file = smtp.tls.certificatesFile;
|
||||
}
|
||||
// optionalAttrs (msmtp.tls.fingerprint != null) {
|
||||
tls_fingerprint = msmtp.tls.fingerprint;
|
||||
}
|
||||
// optionalAttrs (smtp.port != null) {
|
||||
port = toString smtp.port;
|
||||
}
|
||||
accountStr = account:
|
||||
with account;
|
||||
concatStringsSep "\n" ([ "account ${name}" ]
|
||||
++ mapAttrsToList (n: v: n + " " + v) ({
|
||||
host = smtp.host;
|
||||
from = address;
|
||||
auth = "on";
|
||||
user = userName;
|
||||
tls = onOff smtp.tls.enable;
|
||||
tls_starttls = onOff smtp.tls.useStartTls;
|
||||
tls_trust_file = smtp.tls.certificatesFile;
|
||||
} // optionalAttrs (msmtp.tls.fingerprint != null) {
|
||||
tls_fingerprint = msmtp.tls.fingerprint;
|
||||
} // optionalAttrs (smtp.port != null) { port = toString smtp.port; }
|
||||
// optionalAttrs (passwordCommand != null) {
|
||||
# msmtp requires the password to finish with a newline.
|
||||
passwordeval = ''${pkgs.bash}/bin/bash -c "${toString passwordCommand}; echo"'';
|
||||
}
|
||||
// msmtp.extraConfig
|
||||
)
|
||||
++ optional primary "\naccount default : ${name}"
|
||||
);
|
||||
passwordeval =
|
||||
''${pkgs.bash}/bin/bash -c "${toString passwordCommand}; echo"'';
|
||||
} // msmtp.extraConfig) ++ optional primary ''
|
||||
|
||||
account default : ${name}'');
|
||||
|
||||
configFile = mailAccounts: ''
|
||||
# Generated by Home Manager.
|
||||
|
@ -47,9 +41,7 @@ let
|
|||
${concatStringsSep "\n\n" (map accountStr mailAccounts)}
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
|
||||
options = {
|
||||
programs.msmtp = {
|
||||
|
@ -71,7 +63,7 @@ in
|
|||
|
||||
xdg.configFile."msmtp/config".text = configFile msmtpAccounts;
|
||||
|
||||
home.sessionVariables = {
|
||||
home.sessionVariables = {
|
||||
MSMTP_QUEUE = "${config.xdg.dataHome}/msmtp/queue";
|
||||
MSMTP_LOG = "${config.xdg.dataHome}/msmtp/queue.log";
|
||||
};
|
||||
|
|
|
@ -26,10 +26,9 @@ with lib;
|
|||
};
|
||||
|
||||
config = mkIf config.neomutt.enable {
|
||||
neomutt.sendMailCommand = mkOptionDefault (
|
||||
if config.msmtp.enable
|
||||
then "msmtpq --read-envelope-from --read-recipients"
|
||||
else null
|
||||
);
|
||||
neomutt.sendMailCommand = mkOptionDefault (if config.msmtp.enable then
|
||||
"msmtpq --read-envelope-from --read-recipients"
|
||||
else
|
||||
null);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,8 +6,8 @@ let
|
|||
|
||||
cfg = config.programs.neomutt;
|
||||
|
||||
neomuttAccounts = filter (a: a.neomutt.enable)
|
||||
(attrValues config.accounts.email.accounts);
|
||||
neomuttAccounts =
|
||||
filter (a: a.neomutt.enable) (attrValues config.accounts.email.accounts);
|
||||
|
||||
sidebarModule = types.submodule {
|
||||
options = {
|
||||
|
@ -76,13 +76,12 @@ let
|
|||
|
||||
yesno = x: if x then "yes" else "no";
|
||||
setOption = n: v: if v == null then "unset ${n}" else "set ${n}=${v}";
|
||||
escape = replaceStrings ["%"] ["%25"];
|
||||
escape = replaceStrings [ "%" ] [ "%25" ];
|
||||
|
||||
accountFilename = account:
|
||||
config.xdg.configHome + "/neomutt/" + account.name;
|
||||
accountFilename = account: config.xdg.configHome + "/neomutt/" + account.name;
|
||||
|
||||
genCommonFolderHooks = account: with account;
|
||||
{
|
||||
genCommonFolderHooks = account:
|
||||
with account; {
|
||||
from = "'${address}'";
|
||||
realname = "'${realName}'";
|
||||
spoolfile = "'+${folders.inbox}'";
|
||||
|
@ -91,13 +90,13 @@ let
|
|||
trash = "'+${folders.trash}'";
|
||||
};
|
||||
|
||||
mtaSection = account: with account;
|
||||
let
|
||||
passCmd = concatStringsSep " " passwordCommand;
|
||||
in
|
||||
if neomutt.sendMailCommand != null then {
|
||||
sendmail = "'${neomutt.sendMailCommand}'";
|
||||
} else let
|
||||
mtaSection = account:
|
||||
with account;
|
||||
let passCmd = concatStringsSep " " passwordCommand;
|
||||
in if neomutt.sendMailCommand != null then {
|
||||
sendmail = "'${neomutt.sendMailCommand}'";
|
||||
} else
|
||||
let
|
||||
smtpProto = if smtp.tls.enable then "smtps" else "smtp";
|
||||
smtpBaseUrl = "${smtpProto}://${escape userName}@${smtp.host}";
|
||||
in {
|
||||
|
@ -105,35 +104,32 @@ let
|
|||
smtp_pass = "'`${passCmd}`'";
|
||||
};
|
||||
|
||||
genMaildirAccountConfig = account: with account;
|
||||
genMaildirAccountConfig = account:
|
||||
with account;
|
||||
let
|
||||
folderHook =
|
||||
mapAttrsToList setOption (
|
||||
genCommonFolderHooks account
|
||||
// { folder = "'${account.maildir.absPath}'"; }
|
||||
)
|
||||
++ optional (neomutt.extraConfig != "") neomutt.extraConfig;
|
||||
in
|
||||
''
|
||||
${concatStringsSep "\n" folderHook}
|
||||
'';
|
||||
folderHook = mapAttrsToList setOption (genCommonFolderHooks account // {
|
||||
folder = "'${account.maildir.absPath}'";
|
||||
}) ++ optional (neomutt.extraConfig != "") neomutt.extraConfig;
|
||||
in ''
|
||||
${concatStringsSep "\n" folderHook}
|
||||
'';
|
||||
|
||||
registerAccount = account: with account;
|
||||
''
|
||||
registerAccount = account:
|
||||
with account; ''
|
||||
# register account ${name}
|
||||
mailboxes "${account.maildir.absPath}/${folders.inbox}"
|
||||
folder-hook ${account.maildir.absPath}/ " \
|
||||
source ${accountFilename account} "
|
||||
'';
|
||||
|
||||
mraSection = account: with account;
|
||||
if account.maildir != null
|
||||
then genMaildirAccountConfig account
|
||||
else throw "Only maildir is supported at the moment";
|
||||
|
||||
optionsStr = attrs:
|
||||
concatStringsSep "\n" (mapAttrsToList setOption attrs);
|
||||
mraSection = account:
|
||||
with account;
|
||||
if account.maildir != null then
|
||||
genMaildirAccountConfig account
|
||||
else
|
||||
throw "Only maildir is supported at the moment";
|
||||
|
||||
optionsStr = attrs: concatStringsSep "\n" (mapAttrsToList setOption attrs);
|
||||
|
||||
sidebarSection = ''
|
||||
# Sidebar
|
||||
|
@ -143,81 +139,74 @@ let
|
|||
set sidebar_format = '${cfg.sidebar.format}'
|
||||
'';
|
||||
|
||||
bindSection =
|
||||
concatMapStringsSep
|
||||
"\n"
|
||||
(bind: "bind ${bind.map} ${bind.key} \"${bind.action}\"")
|
||||
cfg.binds;
|
||||
bindSection = concatMapStringsSep "\n"
|
||||
(bind: ''bind ${bind.map} ${bind.key} "${bind.action}"'') cfg.binds;
|
||||
|
||||
macroSection =
|
||||
concatMapStringsSep
|
||||
"\n"
|
||||
(bind: "macro ${bind.map} ${bind.key} \"${bind.action}\"")
|
||||
cfg.macros;
|
||||
macroSection = concatMapStringsSep "\n"
|
||||
(bind: ''macro ${bind.map} ${bind.key} "${bind.action}"'') cfg.macros;
|
||||
|
||||
mailCheckSection = ''
|
||||
set mail_check_stats
|
||||
set mail_check_stats_interval = ${toString cfg.checkStatsInterval}
|
||||
'';
|
||||
|
||||
notmuchSection = account: with account; ''
|
||||
# notmuch section
|
||||
set nm_default_uri = "notmuch://${config.accounts.email.maildirBasePath}"
|
||||
virtual-mailboxes "My INBOX" "notmuch://?query=tag:inbox"
|
||||
'';
|
||||
notmuchSection = account:
|
||||
with account; ''
|
||||
# notmuch section
|
||||
set nm_default_uri = "notmuch://${config.accounts.email.maildirBasePath}"
|
||||
virtual-mailboxes "My INBOX" "notmuch://?query=tag:inbox"
|
||||
'';
|
||||
|
||||
accountStr = account: with account; ''
|
||||
# Generated by Home Manager.
|
||||
set ssl_force_tls = yes
|
||||
set certificate_file=${config.accounts.email.certificatesFile}
|
||||
accountStr = account:
|
||||
with account;
|
||||
''
|
||||
# Generated by Home Manager.
|
||||
set ssl_force_tls = yes
|
||||
set certificate_file=${config.accounts.email.certificatesFile}
|
||||
|
||||
# GPG section
|
||||
set crypt_use_gpgme = yes
|
||||
set crypt_autosign = ${yesno (gpg.signByDefault or false)}
|
||||
set pgp_use_gpg_agent = yes
|
||||
set mbox_type = ${if maildir != null then "Maildir" else "mbox"}
|
||||
set sort = "${cfg.sort}"
|
||||
# GPG section
|
||||
set crypt_use_gpgme = yes
|
||||
set crypt_autosign = ${yesno (gpg.signByDefault or false)}
|
||||
set pgp_use_gpg_agent = yes
|
||||
set mbox_type = ${if maildir != null then "Maildir" else "mbox"}
|
||||
set sort = "${cfg.sort}"
|
||||
|
||||
# MTA section
|
||||
${optionsStr (mtaSection account)}
|
||||
# MTA section
|
||||
${optionsStr (mtaSection account)}
|
||||
|
||||
${optionalString (cfg.checkStatsInterval != null) mailCheckSection}
|
||||
${optionalString (cfg.checkStatsInterval != null) mailCheckSection}
|
||||
|
||||
${optionalString cfg.sidebar.enable sidebarSection}
|
||||
${optionalString cfg.sidebar.enable sidebarSection}
|
||||
|
||||
# MRA section
|
||||
${mraSection account}
|
||||
# MRA section
|
||||
${mraSection account}
|
||||
|
||||
# Extra configuration
|
||||
${account.neomutt.extraConfig}
|
||||
''
|
||||
+ optionalString (account.signature.showSignature != "none") ''
|
||||
set signature = ${pkgs.writeText "signature.txt" account.signature.text}
|
||||
''
|
||||
+ optionalString account.notmuch.enable (notmuchSection account);
|
||||
# Extra configuration
|
||||
${account.neomutt.extraConfig}
|
||||
'' + optionalString (account.signature.showSignature != "none") ''
|
||||
set signature = ${pkgs.writeText "signature.txt" account.signature.text}
|
||||
'' + optionalString account.notmuch.enable (notmuchSection account);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.neomutt = {
|
||||
enable = mkEnableOption "the NeoMutt mail client";
|
||||
|
||||
sidebar = mkOption {
|
||||
type = sidebarModule;
|
||||
default = {};
|
||||
default = { };
|
||||
description = "Options related to the sidebar.";
|
||||
};
|
||||
|
||||
binds = mkOption {
|
||||
type = types.listOf bindModule;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = "List of keybindings.";
|
||||
};
|
||||
|
||||
macros = mkOption {
|
||||
type = types.listOf bindModule;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = "List of macros.";
|
||||
};
|
||||
|
||||
|
@ -259,7 +248,7 @@ in
|
|||
|
||||
settings = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
default = { };
|
||||
description = "Extra configuration appended to the end.";
|
||||
};
|
||||
|
||||
|
@ -277,43 +266,37 @@ in
|
|||
rcFile = account: {
|
||||
"${accountFilename account}".text = accountStr account;
|
||||
};
|
||||
in
|
||||
foldl' (a: b: a // b) {} (map rcFile neomuttAccounts);
|
||||
in foldl' (a: b: a // b) { } (map rcFile neomuttAccounts);
|
||||
|
||||
xdg.configFile."neomutt/neomuttrc" = mkIf (neomuttAccounts != []) {
|
||||
text =
|
||||
let
|
||||
primary = filter (a: a.primary) neomuttAccounts;
|
||||
in
|
||||
''
|
||||
# Generated by Home Manager.
|
||||
set header_cache = "${config.xdg.cacheHome}/neomutt/headers/"
|
||||
set message_cachedir = "${config.xdg.cacheHome}/neomutt/messages/"
|
||||
set editor = "${cfg.editor}"
|
||||
set implicit_autoview = yes
|
||||
xdg.configFile."neomutt/neomuttrc" = mkIf (neomuttAccounts != [ ]) {
|
||||
text = let primary = filter (a: a.primary) neomuttAccounts;
|
||||
in ''
|
||||
# Generated by Home Manager.
|
||||
set header_cache = "${config.xdg.cacheHome}/neomutt/headers/"
|
||||
set message_cachedir = "${config.xdg.cacheHome}/neomutt/messages/"
|
||||
set editor = "${cfg.editor}"
|
||||
set implicit_autoview = yes
|
||||
|
||||
alternative_order text/enriched text/plain text
|
||||
alternative_order text/enriched text/plain text
|
||||
|
||||
set delete = yes
|
||||
set delete = yes
|
||||
|
||||
# Binds
|
||||
${bindSection}
|
||||
# Binds
|
||||
${bindSection}
|
||||
|
||||
# Macros
|
||||
${macroSection}
|
||||
# Macros
|
||||
${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
|
||||
${optionsStr cfg.settings}
|
||||
# Extra configuration
|
||||
${optionsStr cfg.settings}
|
||||
|
||||
${cfg.extraConfig}
|
||||
''
|
||||
+
|
||||
concatMapStringsSep "\n" registerAccount neomuttAccounts
|
||||
+
|
||||
# source primary account
|
||||
"source ${accountFilename (builtins.head primary)}";
|
||||
${cfg.extraConfig}
|
||||
'' + concatMapStringsSep "\n" registerAccount neomuttAccounts +
|
||||
# source primary account
|
||||
"source ${accountFilename (builtins.head primary)}";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -4,11 +4,9 @@ with lib;
|
|||
|
||||
let
|
||||
cfg = config.programs.newsboat;
|
||||
wrapQuote = x: "\"${x}\"";
|
||||
wrapQuote = x: ''"${x}"'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.newsboat = {
|
||||
enable = mkEnableOption "the Newsboat feed reader";
|
||||
|
@ -24,8 +22,8 @@ in
|
|||
|
||||
tags = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = ["foo" "bar"];
|
||||
default = [ ];
|
||||
example = [ "foo" "bar" ];
|
||||
description = "Feed tags.";
|
||||
};
|
||||
|
||||
|
@ -37,8 +35,11 @@ in
|
|||
};
|
||||
};
|
||||
});
|
||||
default = [];
|
||||
example = [{url = "http://example.com"; tags = ["foo" "bar"];}];
|
||||
default = [ ];
|
||||
example = [{
|
||||
url = "http://example.com";
|
||||
tags = [ "foo" "bar" ];
|
||||
}];
|
||||
description = "List of news feeds.";
|
||||
};
|
||||
|
||||
|
@ -57,7 +58,9 @@ in
|
|||
autoReload = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "Whether to enable automatic reloading while newsboat is running.";
|
||||
description = ''
|
||||
Whether to enable automatic reloading while newsboat is running.
|
||||
'';
|
||||
};
|
||||
|
||||
reloadTime = mkOption {
|
||||
|
@ -74,43 +77,40 @@ in
|
|||
|
||||
queries = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
example = {
|
||||
"foo" = "rssurl =~ \"example.com\"";
|
||||
};
|
||||
default = { };
|
||||
example = { "foo" = ''rssurl =~ "example.com"''; };
|
||||
description = "A list of queries to use.";
|
||||
};
|
||||
|
||||
extraConfig = mkOption {
|
||||
type = types.lines;
|
||||
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 {
|
||||
home.packages = [ pkgs.newsboat ];
|
||||
home.file.".newsboat/urls".text =
|
||||
let
|
||||
mkUrlEntry = u: concatStringsSep " " (
|
||||
[u.url]
|
||||
++ map wrapQuote u.tags
|
||||
++ optional (u.title != null) (wrapQuote "~${u.title}")
|
||||
);
|
||||
urls = map mkUrlEntry cfg.urls;
|
||||
home.file.".newsboat/urls".text = let
|
||||
mkUrlEntry = u:
|
||||
concatStringsSep " " ([ u.url ] ++ map wrapQuote u.tags
|
||||
++ optional (u.title != null) (wrapQuote "~${u.title}"));
|
||||
urls = map mkUrlEntry cfg.urls;
|
||||
|
||||
mkQueryEntry = n: v: "\"query:${n}:${escape ["\""] v}\"";
|
||||
queries = mapAttrsToList mkQueryEntry cfg.queries;
|
||||
in
|
||||
concatStringsSep "\n" (urls ++ queries) + "\n";
|
||||
mkQueryEntry = n: v: ''"query:${n}:${escape [ ''"'' ] v}"'';
|
||||
queries = mapAttrsToList mkQueryEntry cfg.queries;
|
||||
in concatStringsSep "\n" (urls ++ queries) + "\n";
|
||||
|
||||
home.file.".newsboat/config".text = ''
|
||||
max-items ${toString cfg.maxItems}
|
||||
browser ${cfg.browser}
|
||||
reload-threads ${toString cfg.reloadThreads}
|
||||
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
|
||||
|
||||
${cfg.extraConfig}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
{ config, lib, pkgs, ...}:
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.noti;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.marsam ];
|
||||
|
||||
options.programs.noti = {
|
||||
|
@ -16,7 +14,7 @@ in
|
|||
|
||||
settings = mkOption {
|
||||
type = types.attrsOf (types.attrsOf types.str);
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
Configuration written to
|
||||
<filename>~/.config/noti/noti.yaml</filename>.
|
||||
|
@ -45,9 +43,8 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.noti ];
|
||||
|
||||
xdg.configFile."noti/noti.yaml" = mkIf (cfg.settings != {}) {
|
||||
text = generators.toYAML {} cfg.settings;
|
||||
};
|
||||
xdg.configFile."noti/noti.yaml" =
|
||||
mkIf (cfg.settings != { }) { text = generators.toYAML { } cfg.settings; };
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
{ lib, ... }:
|
||||
|
||||
{
|
||||
options.notmuch = {
|
||||
enable = lib.mkEnableOption "notmuch indexing";
|
||||
};
|
||||
options.notmuch = { enable = lib.mkEnableOption "notmuch indexing"; };
|
||||
}
|
||||
|
|
|
@ -9,53 +9,42 @@ let
|
|||
mkIniKeyValue = key: value:
|
||||
let
|
||||
tweakVal = v:
|
||||
if isString v then v
|
||||
else if isList v then concatMapStringsSep ";" tweakVal v
|
||||
else if isBool v then (if v then "true" else "false")
|
||||
else toString v;
|
||||
in
|
||||
"${key}=${tweakVal value}";
|
||||
if isString v then
|
||||
v
|
||||
else if isList v then
|
||||
concatMapStringsSep ";" tweakVal v
|
||||
else if isBool v then
|
||||
(if v then "true" else "false")
|
||||
else
|
||||
toString v;
|
||||
in "${key}=${tweakVal value}";
|
||||
|
||||
notmuchIni =
|
||||
recursiveUpdate
|
||||
{
|
||||
database = {
|
||||
path = config.accounts.email.maildirBasePath;
|
||||
};
|
||||
notmuchIni = recursiveUpdate {
|
||||
database = { path = config.accounts.email.maildirBasePath; };
|
||||
|
||||
maildir = {
|
||||
synchronize_flags = cfg.maildir.synchronizeFlags;
|
||||
};
|
||||
maildir = { synchronize_flags = cfg.maildir.synchronizeFlags; };
|
||||
|
||||
new = {
|
||||
ignore = cfg.new.ignore;
|
||||
tags = cfg.new.tags;
|
||||
};
|
||||
new = {
|
||||
ignore = cfg.new.ignore;
|
||||
tags = cfg.new.tags;
|
||||
};
|
||||
|
||||
user =
|
||||
let
|
||||
accounts =
|
||||
filter (a: a.notmuch.enable)
|
||||
(attrValues config.accounts.email.accounts);
|
||||
primary = filter (a: a.primary) accounts;
|
||||
secondaries = filter (a: !a.primary) accounts;
|
||||
in {
|
||||
name = catAttrs "realName" primary;
|
||||
primary_email = catAttrs "address" primary;
|
||||
other_email = catAttrs "aliases" primary
|
||||
++ catAttrs "address" secondaries
|
||||
++ catAttrs "aliases" secondaries;
|
||||
};
|
||||
user = let
|
||||
accounts = filter (a: a.notmuch.enable)
|
||||
(attrValues config.accounts.email.accounts);
|
||||
primary = filter (a: a.primary) accounts;
|
||||
secondaries = filter (a: !a.primary) accounts;
|
||||
in {
|
||||
name = catAttrs "realName" primary;
|
||||
primary_email = catAttrs "address" primary;
|
||||
other_email = catAttrs "aliases" primary ++ catAttrs "address" secondaries
|
||||
++ catAttrs "aliases" secondaries;
|
||||
};
|
||||
|
||||
search = {
|
||||
exclude_tags = cfg.search.excludeTags;
|
||||
};
|
||||
}
|
||||
cfg.extraConfig;
|
||||
search = { exclude_tags = cfg.search.excludeTags; };
|
||||
} cfg.extraConfig;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.notmuch = {
|
||||
enable = mkEnableOption "Notmuch mail indexer";
|
||||
|
@ -65,7 +54,7 @@ in
|
|||
options = {
|
||||
ignore = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = ''
|
||||
A list to specify files and directories that will not be
|
||||
searched for messages by <command>notmuch new</command>.
|
||||
|
@ -83,7 +72,7 @@ in
|
|||
};
|
||||
};
|
||||
};
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
Options related to email processing performed by
|
||||
<command>notmuch new</command>.
|
||||
|
@ -92,7 +81,7 @@ in
|
|||
|
||||
extraConfig = mkOption {
|
||||
type = types.attrsOf (types.attrsOf types.str);
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
Options that should be appended to the notmuch configuration file.
|
||||
'';
|
||||
|
@ -159,11 +148,11 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = notmuchIni.user.name != [];
|
||||
assertion = notmuchIni.user.name != [ ];
|
||||
message = "notmuch: Must have a user name set.";
|
||||
}
|
||||
{
|
||||
assertion = notmuchIni.user.primary_email != [];
|
||||
assertion = notmuchIni.user.primary_email != [ ];
|
||||
message = "notmuch: Must have a user primary email address set.";
|
||||
}
|
||||
];
|
||||
|
@ -176,33 +165,27 @@ in
|
|||
};
|
||||
|
||||
xdg.configFile."notmuch/notmuchrc".text =
|
||||
let
|
||||
toIni = generators.toINI { mkKeyValue = mkIniKeyValue; };
|
||||
in
|
||||
"# Generated by Home Manager.\n\n"
|
||||
+ toIni notmuchIni;
|
||||
let toIni = generators.toINI { mkKeyValue = mkIniKeyValue; };
|
||||
in ''
|
||||
# Generated by Home Manager.
|
||||
|
||||
home.file =
|
||||
let
|
||||
hook = name: cmds:
|
||||
{
|
||||
"${notmuchIni.database.path}/.notmuch/hooks/${name}".source =
|
||||
pkgs.writeShellScript name ''
|
||||
export PATH="${pkgs.notmuch}/bin''${PATH:+:}$PATH"
|
||||
export NOTMUCH_CONFIG="${config.xdg.configHome}/notmuch/notmuchrc"
|
||||
export NMBGIT="${config.xdg.dataHome}/notmuch/nmbug"
|
||||
'' + toIni notmuchIni;
|
||||
|
||||
${cmds}
|
||||
'';
|
||||
};
|
||||
in
|
||||
optionalAttrs (cfg.hooks.preNew != "")
|
||||
(hook "pre-new" cfg.hooks.preNew)
|
||||
//
|
||||
optionalAttrs (cfg.hooks.postNew != "")
|
||||
(hook "post-new" cfg.hooks.postNew)
|
||||
//
|
||||
optionalAttrs (cfg.hooks.postInsert != "")
|
||||
(hook "post-insert" cfg.hooks.postInsert);
|
||||
home.file = let
|
||||
hook = name: cmds: {
|
||||
"${notmuchIni.database.path}/.notmuch/hooks/${name}".source =
|
||||
pkgs.writeShellScript name ''
|
||||
export PATH="${pkgs.notmuch}/bin''${PATH:+:}$PATH"
|
||||
export NOTMUCH_CONFIG="${config.xdg.configHome}/notmuch/notmuchrc"
|
||||
export NMBGIT="${config.xdg.dataHome}/notmuch/nmbug"
|
||||
|
||||
${cmds}
|
||||
'';
|
||||
};
|
||||
in optionalAttrs (cfg.hooks.preNew != "") (hook "pre-new" cfg.hooks.preNew)
|
||||
// optionalAttrs (cfg.hooks.postNew != "")
|
||||
(hook "post-new" cfg.hooks.postNew)
|
||||
// optionalAttrs (cfg.hooks.postInsert != "")
|
||||
(hook "post-insert" cfg.hooks.postInsert);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -11,23 +11,18 @@ let
|
|||
let
|
||||
pluginDirs = map (pkg: "${pkg}/share/obs/obs-plugins") packages;
|
||||
plugins = concatMapStringsSep " " (p: "${p}/*") pluginDirs;
|
||||
in
|
||||
pkgs.runCommand "obs-studio-plugins"
|
||||
{
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
}
|
||||
''
|
||||
mkdir $out
|
||||
[[ '${plugins}' ]] || exit 0
|
||||
for plugin in ${plugins}; do
|
||||
ln -s "$plugin" $out/
|
||||
done
|
||||
'';
|
||||
in pkgs.runCommand "obs-studio-plugins" {
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
} ''
|
||||
mkdir $out
|
||||
[[ '${plugins}' ]] || exit 0
|
||||
for plugin in ${plugins}; do
|
||||
ln -s "$plugin" $out/
|
||||
done
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.adisbladis ];
|
||||
|
||||
options = {
|
||||
|
@ -35,7 +30,7 @@ in
|
|||
enable = mkEnableOption "obs-studio";
|
||||
|
||||
plugins = mkOption {
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = literalExample "[ pkgs.obs-linuxbrowser ]";
|
||||
description = "Optional OBS plugins.";
|
||||
type = types.listOf types.package;
|
||||
|
@ -46,8 +41,7 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ package ];
|
||||
|
||||
xdg.configFile."obs-studio/plugins" = mkIf (cfg.plugins != []) {
|
||||
source = mkPluginEnv cfg.plugins;
|
||||
};
|
||||
xdg.configFile."obs-studio/plugins" =
|
||||
mkIf (cfg.plugins != [ ]) { source = mkPluginEnv cfg.plugins; };
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,18 +6,14 @@ let
|
|||
|
||||
extraConfigType = with types; attrsOf (either (either str int) bool);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options.offlineimap = {
|
||||
enable = mkEnableOption "OfflineIMAP";
|
||||
|
||||
extraConfig.account = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
example = {
|
||||
autorefresh = 20;
|
||||
};
|
||||
default = { };
|
||||
example = { autorefresh = 20; };
|
||||
description = ''
|
||||
Extra configuration options to add to the account section.
|
||||
'';
|
||||
|
@ -25,10 +21,8 @@ in
|
|||
|
||||
extraConfig.local = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
example = {
|
||||
sync_deletes = true;
|
||||
};
|
||||
default = { };
|
||||
example = { sync_deletes = true; };
|
||||
description = ''
|
||||
Extra configuration options to add to the local account
|
||||
section.
|
||||
|
@ -37,7 +31,7 @@ in
|
|||
|
||||
extraConfig.remote = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
default = { };
|
||||
example = {
|
||||
maxconnections = 2;
|
||||
expunge = false;
|
||||
|
|
|
@ -12,11 +12,11 @@ let
|
|||
toIni = generators.toINI {
|
||||
mkKeyValue = key: value:
|
||||
let
|
||||
value' =
|
||||
if isBool value then (if value then "yes" else "no")
|
||||
else toString value;
|
||||
in
|
||||
"${key} = ${value'}";
|
||||
value' = if isBool value then
|
||||
(if value then "yes" else "no")
|
||||
else
|
||||
toString value;
|
||||
in "${key} = ${value'}";
|
||||
};
|
||||
|
||||
# Generates a script to fetch only a specific account.
|
||||
|
@ -29,90 +29,65 @@ let
|
|||
# Something like
|
||||
#
|
||||
# $ email <account name> <program name> <program args>
|
||||
genOfflineImapScript = account: with account;
|
||||
genOfflineImapScript = account:
|
||||
with account;
|
||||
pkgs.writeShellScriptBin "offlineimap-${name}" ''
|
||||
exec ${pkgs.offlineimap}/bin/offlineimap -a${account.name} "$@"
|
||||
'';
|
||||
|
||||
accountStr = account: with account;
|
||||
accountStr = account:
|
||||
with account;
|
||||
let
|
||||
postSyncHook = optionalAttrs (offlineimap.postSyncHookCommand != "") {
|
||||
postsynchook =
|
||||
pkgs.writeShellScriptBin
|
||||
"postsynchook"
|
||||
offlineimap.postSyncHookCommand
|
||||
+ "/bin/postsynchook";
|
||||
postsynchook = pkgs.writeShellScriptBin "postsynchook"
|
||||
offlineimap.postSyncHookCommand + "/bin/postsynchook";
|
||||
};
|
||||
|
||||
localType =
|
||||
if account.flavor == "gmail.com"
|
||||
then "GmailMaildir"
|
||||
else "Maildir";
|
||||
if account.flavor == "gmail.com" then "GmailMaildir" else "Maildir";
|
||||
|
||||
remoteType =
|
||||
if account.flavor == "gmail.com"
|
||||
then "Gmail"
|
||||
else "IMAP";
|
||||
remoteType = if account.flavor == "gmail.com" then "Gmail" else "IMAP";
|
||||
|
||||
remoteHost = optionalAttrs (imap.host != null) {
|
||||
remotehost = imap.host;
|
||||
remoteHost =
|
||||
optionalAttrs (imap.host != null) { remotehost = imap.host; };
|
||||
|
||||
remotePort =
|
||||
optionalAttrs ((imap.port or null) != null) { remoteport = imap.port; };
|
||||
|
||||
ssl = if imap.tls.enable then {
|
||||
ssl = true;
|
||||
sslcacertfile = imap.tls.certificatesFile;
|
||||
starttls = imap.tls.useStartTls;
|
||||
} else {
|
||||
ssl = false;
|
||||
};
|
||||
|
||||
remotePort = optionalAttrs ((imap.port or null) != null) {
|
||||
remoteport = imap.port;
|
||||
};
|
||||
|
||||
ssl =
|
||||
if imap.tls.enable
|
||||
then
|
||||
{
|
||||
ssl = true;
|
||||
sslcacertfile = imap.tls.certificatesFile;
|
||||
starttls = imap.tls.useStartTls;
|
||||
}
|
||||
else
|
||||
{
|
||||
ssl = false;
|
||||
};
|
||||
|
||||
remotePassEval =
|
||||
let
|
||||
arglist = concatMapStringsSep "," (x: "'${x}'") passwordCommand;
|
||||
in
|
||||
optionalAttrs (passwordCommand != null) {
|
||||
remotepasseval = ''get_pass("${name}", [${arglist}])'';
|
||||
};
|
||||
in
|
||||
toIni {
|
||||
"Account ${name}" = {
|
||||
localrepository = "${name}-local";
|
||||
remoterepository = "${name}-remote";
|
||||
}
|
||||
// postSyncHook
|
||||
// offlineimap.extraConfig.account;
|
||||
let arglist = concatMapStringsSep "," (x: "'${x}'") passwordCommand;
|
||||
in optionalAttrs (passwordCommand != null) {
|
||||
remotepasseval = ''get_pass("${name}", [${arglist}])'';
|
||||
};
|
||||
in toIni {
|
||||
"Account ${name}" = {
|
||||
localrepository = "${name}-local";
|
||||
remoterepository = "${name}-remote";
|
||||
} // postSyncHook // offlineimap.extraConfig.account;
|
||||
|
||||
"Repository ${name}-local" = {
|
||||
type = localType;
|
||||
localfolders = maildir.absPath;
|
||||
}
|
||||
// offlineimap.extraConfig.local;
|
||||
"Repository ${name}-local" = {
|
||||
type = localType;
|
||||
localfolders = maildir.absPath;
|
||||
} // offlineimap.extraConfig.local;
|
||||
|
||||
"Repository ${name}-remote" = {
|
||||
type = remoteType;
|
||||
remoteuser = userName;
|
||||
}
|
||||
// remoteHost
|
||||
// remotePort
|
||||
// remotePassEval
|
||||
// ssl
|
||||
"Repository ${name}-remote" = {
|
||||
type = remoteType;
|
||||
remoteuser = userName;
|
||||
} // remoteHost // remotePort // remotePassEval // ssl
|
||||
// offlineimap.extraConfig.remote;
|
||||
};
|
||||
};
|
||||
|
||||
extraConfigType = with types; attrsOf (either (either str int) bool);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.offlineimap = {
|
||||
enable = mkEnableOption "OfflineIMAP";
|
||||
|
@ -133,7 +108,7 @@ in
|
|||
|
||||
extraConfig.general = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
default = { };
|
||||
example = {
|
||||
maxage = 30;
|
||||
ui = "blinkenlights";
|
||||
|
@ -146,10 +121,8 @@ in
|
|||
|
||||
extraConfig.default = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
example = {
|
||||
gmailtrashfolder = "[Gmail]/Papierkorb";
|
||||
};
|
||||
default = { };
|
||||
example = { gmailtrashfolder = "[Gmail]/Papierkorb"; };
|
||||
description = ''
|
||||
Extra configuration options added to the
|
||||
<option>DEFAULT</option> section.
|
||||
|
@ -158,7 +131,7 @@ in
|
|||
|
||||
extraConfig.mbnames = mkOption {
|
||||
type = extraConfigType;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
filename = "~/.config/mutt/mailboxes";
|
||||
|
@ -181,27 +154,20 @@ in
|
|||
|
||||
xdg.configFile."offlineimap/get_settings.py".text = cfg.pythonFile;
|
||||
|
||||
xdg.configFile."offlineimap/config".text =
|
||||
''
|
||||
# Generated by Home Manager.
|
||||
# See https://github.com/OfflineIMAP/offlineimap/blob/master/offlineimap.conf
|
||||
# for an exhaustive list of options.
|
||||
''
|
||||
+ toIni ({
|
||||
general = {
|
||||
accounts = concatMapStringsSep "," (a: a.name) accounts;
|
||||
pythonfile = "${config.xdg.configHome}/offlineimap/get_settings.py";
|
||||
metadata = "${config.xdg.dataHome}/offlineimap";
|
||||
}
|
||||
// cfg.extraConfig.general;
|
||||
}
|
||||
// optionalAttrs (cfg.extraConfig.mbnames != {}) {
|
||||
mbnames = { enabled = true; } // cfg.extraConfig.mbnames;
|
||||
}
|
||||
// optionalAttrs (cfg.extraConfig.default != {}) {
|
||||
DEFAULT = cfg.extraConfig.default;
|
||||
})
|
||||
+ "\n"
|
||||
+ concatStringsSep "\n" (map accountStr accounts);
|
||||
xdg.configFile."offlineimap/config".text = ''
|
||||
# Generated by Home Manager.
|
||||
# See https://github.com/OfflineIMAP/offlineimap/blob/master/offlineimap.conf
|
||||
# for an exhaustive list of options.
|
||||
'' + toIni ({
|
||||
general = {
|
||||
accounts = concatMapStringsSep "," (a: a.name) accounts;
|
||||
pythonfile = "${config.xdg.configHome}/offlineimap/get_settings.py";
|
||||
metadata = "${config.xdg.dataHome}/offlineimap";
|
||||
} // cfg.extraConfig.general;
|
||||
} // optionalAttrs (cfg.extraConfig.mbnames != { }) {
|
||||
mbnames = { enabled = true; } // cfg.extraConfig.mbnames;
|
||||
} // optionalAttrs (cfg.extraConfig.default != { }) {
|
||||
DEFAULT = cfg.extraConfig.default;
|
||||
}) + "\n" + concatStringsSep "\n" (map accountStr accounts);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.opam;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.marsam ];
|
||||
|
||||
options.programs.opam = {
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.password-store;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = with maintainers; [ pacien ];
|
||||
|
||||
options.programs.password-store = {
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.pazi;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.marsam ];
|
||||
|
||||
options.programs.pazi = {
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.pidgin;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
|
@ -23,7 +21,7 @@ in
|
|||
};
|
||||
|
||||
plugins = mkOption {
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = literalExample "[ pkgs.pidgin-otr pkgs.pidgin-osd ]";
|
||||
description = "Plugins that should be available to Pidgin.";
|
||||
};
|
||||
|
|
|
@ -9,32 +9,34 @@ let
|
|||
mkSetVariableStr = n: v:
|
||||
let
|
||||
mkValueStr = v:
|
||||
if v == true then "on"
|
||||
else if v == false then "off"
|
||||
else if isInt v then toString v
|
||||
else if isString v then v
|
||||
else abort ("values ${toPretty v} is of unsupported type");
|
||||
in
|
||||
"set ${n} ${mkValueStr v}";
|
||||
if v == true then
|
||||
"on"
|
||||
else if v == false then
|
||||
"off"
|
||||
else if isInt v then
|
||||
toString 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 = {
|
||||
enable = mkEnableOption "readline";
|
||||
|
||||
bindings = mkOption {
|
||||
default = {};
|
||||
default = { };
|
||||
type = types.attrsOf types.str;
|
||||
example = { "\C-h" = "backward-kill-word"; };
|
||||
example = { "\\C-h" = "backward-kill-word"; };
|
||||
description = "Readline bindings.";
|
||||
};
|
||||
|
||||
variables = mkOption {
|
||||
type = with types; attrsOf (either str (either int bool));
|
||||
default = {};
|
||||
default = { };
|
||||
example = { expand-tilde = true; };
|
||||
description = ''
|
||||
Readline customization variable assignments.
|
||||
|
@ -58,19 +60,16 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
home.file.".inputrc".text =
|
||||
let
|
||||
configStr = concatStringsSep "\n" (
|
||||
optional cfg.includeSystemConfig "$include /etc/inputrc"
|
||||
home.file.".inputrc".text = let
|
||||
configStr = concatStringsSep "\n"
|
||||
(optional cfg.includeSystemConfig "$include /etc/inputrc"
|
||||
++ mapAttrsToList mkSetVariableStr cfg.variables
|
||||
++ mapAttrsToList mkBindingStr cfg.bindings
|
||||
);
|
||||
in
|
||||
''
|
||||
# Generated by Home Manager.
|
||||
++ mapAttrsToList mkBindingStr cfg.bindings);
|
||||
in ''
|
||||
# Generated by Home Manager.
|
||||
|
||||
${configStr}
|
||||
${cfg.extraConfig}
|
||||
'';
|
||||
${configStr}
|
||||
${cfg.extraConfig}
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,10 +7,11 @@ let
|
|||
|
||||
cfg = config.programs.rofi;
|
||||
|
||||
colorOption = description: mkOption {
|
||||
type = types.str;
|
||||
description = description;
|
||||
};
|
||||
colorOption = description:
|
||||
mkOption {
|
||||
type = types.str;
|
||||
description = description;
|
||||
};
|
||||
|
||||
rowColorSubmodule = types.submodule {
|
||||
options = {
|
||||
|
@ -71,72 +72,64 @@ let
|
|||
};
|
||||
|
||||
valueToString = value:
|
||||
if isBool value
|
||||
then (if value then "true" else "else")
|
||||
else toString value;
|
||||
if isBool value then (if value then "true" else "else") else toString value;
|
||||
|
||||
windowColorsToString = window: concatStringsSep ", " (with window; [
|
||||
background
|
||||
border
|
||||
separator
|
||||
]);
|
||||
windowColorsToString = window:
|
||||
concatStringsSep ", " (with window; [ background border separator ]);
|
||||
|
||||
rowsColorsToString = rows: ''
|
||||
${optionalString
|
||||
(rows.normal != null)
|
||||
(setOption "color-normal" (rowColorsToString rows.normal))}
|
||||
${optionalString
|
||||
(rows.active != null)
|
||||
(setOption "color-active" (rowColorsToString rows.active))}
|
||||
${optionalString
|
||||
(rows.urgent != null)
|
||||
(setOption "color-urgent" (rowColorsToString rows.urgent))}
|
||||
${optionalString (rows.normal != null)
|
||||
(setOption "color-normal" (rowColorsToString rows.normal))}
|
||||
${optionalString (rows.active != null)
|
||||
(setOption "color-active" (rowColorsToString rows.active))}
|
||||
${optionalString (rows.urgent != null)
|
||||
(setOption "color-urgent" (rowColorsToString rows.urgent))}
|
||||
'';
|
||||
|
||||
rowColorsToString = row: concatStringsSep ", " (with row; [
|
||||
background
|
||||
foreground
|
||||
backgroundAlt
|
||||
highlight.background
|
||||
highlight.foreground
|
||||
]);
|
||||
rowColorsToString = row:
|
||||
concatStringsSep ", " (with row; [
|
||||
background
|
||||
foreground
|
||||
backgroundAlt
|
||||
highlight.background
|
||||
highlight.foreground
|
||||
]);
|
||||
|
||||
setOption = name: value:
|
||||
optionalString (value != null) "rofi.${name}: ${valueToString value}";
|
||||
|
||||
setColorScheme = colors: optionalString (colors != null) ''
|
||||
${optionalString
|
||||
(colors.window != null)
|
||||
setOption "color-window" (windowColorsToString colors.window)}
|
||||
${optionalString
|
||||
(colors.rows != null)
|
||||
(rowsColorsToString colors.rows)}
|
||||
'';
|
||||
setColorScheme = colors:
|
||||
optionalString (colors != null) ''
|
||||
${optionalString (colors.window != null) setOption "color-window"
|
||||
(windowColorsToString colors.window)}
|
||||
${optionalString (colors.rows != null) (rowsColorsToString colors.rows)}
|
||||
'';
|
||||
|
||||
locationsMap = {
|
||||
center = 0;
|
||||
top-left = 1;
|
||||
top = 2;
|
||||
top-right = 3;
|
||||
right = 4;
|
||||
center = 0;
|
||||
top-left = 1;
|
||||
top = 2;
|
||||
top-right = 3;
|
||||
right = 4;
|
||||
bottom-right = 5;
|
||||
bottom = 6;
|
||||
bottom-left = 7;
|
||||
left = 8;
|
||||
bottom = 6;
|
||||
bottom-left = 7;
|
||||
left = 8;
|
||||
};
|
||||
|
||||
themeName =
|
||||
if (cfg.theme == null) then null
|
||||
else if (lib.isString cfg.theme) then cfg.theme
|
||||
else lib.removeSuffix ".rasi" (baseNameOf cfg.theme);
|
||||
themeName = if (cfg.theme == null) then
|
||||
null
|
||||
else if (lib.isString cfg.theme) then
|
||||
cfg.theme
|
||||
else
|
||||
lib.removeSuffix ".rasi" (baseNameOf cfg.theme);
|
||||
|
||||
themePath = if (lib.isString cfg.theme) then null else cfg.theme;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
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 {
|
||||
default = null;
|
||||
|
@ -295,14 +288,12 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = cfg.theme == null || cfg.colors == null;
|
||||
message = ''
|
||||
Cannot use the rofi options 'theme' and 'colors' simultaneously.
|
||||
'';
|
||||
}
|
||||
];
|
||||
assertions = [{
|
||||
assertion = cfg.theme == null || cfg.colors == null;
|
||||
message = ''
|
||||
Cannot use the rofi options 'theme' and 'colors' simultaneously.
|
||||
'';
|
||||
}];
|
||||
|
||||
home.packages = [ pkgs.rofi ];
|
||||
|
||||
|
@ -314,11 +305,8 @@ in
|
|||
${setOption "eh" cfg.rowHeight}
|
||||
${setOption "padding" cfg.padding}
|
||||
${setOption "separator-style" cfg.separator}
|
||||
${setOption "hide-scrollbar" (
|
||||
if (cfg.scrollbar != null)
|
||||
then (! cfg.scrollbar)
|
||||
else cfg.scrollbar
|
||||
)}
|
||||
${setOption "hide-scrollbar"
|
||||
(if (cfg.scrollbar != null) then (!cfg.scrollbar) else cfg.scrollbar)}
|
||||
${setOption "terminal" cfg.terminal}
|
||||
${setOption "cycle" cfg.cycle}
|
||||
${setOption "fullscreen" cfg.fullscreen}
|
||||
|
@ -333,7 +321,7 @@ in
|
|||
'';
|
||||
|
||||
xdg.dataFile = mkIf (themePath != null) {
|
||||
"rofi/themes/${themeName}.rasi".source = themePath;
|
||||
"rofi/themes/${themeName}.rasi".source = themePath;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.rtorrent;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.marsam ];
|
||||
|
||||
options.programs.rtorrent = {
|
||||
|
@ -30,8 +28,7 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.rtorrent ];
|
||||
|
||||
xdg.configFile."rtorrent/rtorrent.rc" = mkIf (cfg.settings != "") {
|
||||
text = cfg.settings;
|
||||
};
|
||||
xdg.configFile."rtorrent/rtorrent.rc" =
|
||||
mkIf (cfg.settings != "") { text = cfg.settings; };
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.skim;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options.programs.skim = {
|
||||
enable = mkEnableOption "skim - a command-line fuzzy finder";
|
||||
|
||||
|
@ -24,7 +22,7 @@ in
|
|||
|
||||
defaultOptions = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "--height 40%" "--prompt ⟫" ];
|
||||
description = ''
|
||||
Extra command line options given to skim by default.
|
||||
|
@ -43,7 +41,7 @@ in
|
|||
|
||||
fileWidgetOptions = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "--preview 'head {}'" ];
|
||||
description = ''
|
||||
Command line options for the CTRL-T keybinding.
|
||||
|
@ -53,7 +51,7 @@ in
|
|||
changeDirWidgetCommand = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "fd --type d" ;
|
||||
example = "fd --type d";
|
||||
description = ''
|
||||
The command that gets executed as the source for skim for the
|
||||
ALT-C keybinding.
|
||||
|
@ -62,7 +60,7 @@ in
|
|||
|
||||
changeDirWidgetOptions = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "--preview 'tree -C {} | head -200'" ];
|
||||
description = ''
|
||||
Command line options for the ALT-C keybinding.
|
||||
|
@ -71,7 +69,7 @@ in
|
|||
|
||||
historyWidgetOptions = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "--tac" "--exact" ];
|
||||
description = ''
|
||||
Command line options for the CTRL-R keybinding.
|
||||
|
@ -98,18 +96,16 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.skim ];
|
||||
|
||||
home.sessionVariables =
|
||||
mapAttrs (n: v: toString v) (
|
||||
filterAttrs (n: v: v != [] && v != null) {
|
||||
SKIM_ALT_C_COMMAND = cfg.changeDirWidgetCommand;
|
||||
SKIM_ALT_C_OPTS = cfg.changeDirWidgetOptions;
|
||||
SKIM_CTRL_R_OPTS = cfg.historyWidgetOptions;
|
||||
SKIM_CTRL_T_COMMAND = cfg.fileWidgetCommand;
|
||||
SKIM_CTRL_T_OPTS = cfg.fileWidgetOptions;
|
||||
SKIM_DEFAULT_COMMAND = cfg.defaultCommand;
|
||||
SKIM_DEFAULT_OPTIONS = cfg.defaultOptions;
|
||||
}
|
||||
);
|
||||
home.sessionVariables = mapAttrs (n: v: toString v)
|
||||
(filterAttrs (n: v: v != [ ] && v != null) {
|
||||
SKIM_ALT_C_COMMAND = cfg.changeDirWidgetCommand;
|
||||
SKIM_ALT_C_OPTS = cfg.changeDirWidgetOptions;
|
||||
SKIM_CTRL_R_OPTS = cfg.historyWidgetOptions;
|
||||
SKIM_CTRL_T_COMMAND = cfg.fileWidgetCommand;
|
||||
SKIM_CTRL_T_OPTS = cfg.fileWidgetOptions;
|
||||
SKIM_DEFAULT_COMMAND = cfg.defaultCommand;
|
||||
SKIM_DEFAULT_OPTIONS = cfg.defaultOptions;
|
||||
});
|
||||
|
||||
programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
|
||||
if [[ :$SHELLOPTS: =~ :(vi|emacs): ]]; then
|
||||
|
|
|
@ -7,20 +7,17 @@ let
|
|||
cfg = config.programs.starship;
|
||||
|
||||
configFile = config:
|
||||
pkgs.runCommand "config.toml"
|
||||
{
|
||||
buildInputs = [ pkgs.remarshal ];
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
}
|
||||
''
|
||||
remarshal -if json -of toml \
|
||||
< ${pkgs.writeText "config.json" (builtins.toJSON config)} \
|
||||
> $out
|
||||
'';
|
||||
in
|
||||
pkgs.runCommand "config.toml" {
|
||||
buildInputs = [ pkgs.remarshal ];
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
} ''
|
||||
remarshal -if json -of toml \
|
||||
< ${pkgs.writeText "config.json" (builtins.toJSON config)} \
|
||||
> $out
|
||||
'';
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.marsam ];
|
||||
|
||||
options.programs.starship = {
|
||||
|
@ -35,7 +32,7 @@ in
|
|||
|
||||
settings = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
description = ''
|
||||
Configuration written to
|
||||
<filename>~/.config/starship.toml</filename>.
|
||||
|
@ -73,9 +70,8 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
xdg.configFile."starship.toml" = mkIf (cfg.settings != {}) {
|
||||
source = configFile cfg.settings;
|
||||
};
|
||||
xdg.configFile."starship.toml" =
|
||||
mkIf (cfg.settings != { }) { source = configFile cfg.settings; };
|
||||
|
||||
programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
|
||||
if [[ -z $INSIDE_EMACS ]]; then
|
||||
|
|
|
@ -9,38 +9,39 @@ let
|
|||
themePath = theme: "${pkgs.taskwarrior}/share/doc/task/rc/${theme}.theme";
|
||||
|
||||
includeTheme = location:
|
||||
if location == null then ""
|
||||
else if isString location then "include ${themePath location}"
|
||||
else "include ${location}";
|
||||
if location == null then
|
||||
""
|
||||
else if isString location then
|
||||
"include ${themePath location}"
|
||||
else
|
||||
"include ${location}";
|
||||
|
||||
formatValue = value:
|
||||
if isBool value then if value then "true" else "false"
|
||||
else if isList value then concatMapStringsSep "," formatValue value
|
||||
else toString value;
|
||||
if isBool value then
|
||||
if value then "true" else "false"
|
||||
else if isList value then
|
||||
concatMapStringsSep "," formatValue value
|
||||
else
|
||||
toString value;
|
||||
|
||||
formatLine = key: value:
|
||||
"${key}=${formatValue value}";
|
||||
formatLine = key: value: "${key}=${formatValue value}";
|
||||
|
||||
formatSet = key: values:
|
||||
(concatStringsSep "\n"
|
||||
(mapAttrsToList
|
||||
(subKey: subValue: formatPair "${key}.${subKey}" subValue)
|
||||
(mapAttrsToList (subKey: subValue: formatPair "${key}.${subKey}" subValue)
|
||||
values));
|
||||
|
||||
formatPair = key: value:
|
||||
if isAttrs value then formatSet key value
|
||||
else formatLine key value;
|
||||
if isAttrs value then formatSet key value else formatLine key value;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.taskwarrior = {
|
||||
enable = mkEnableOption "Task Warrior";
|
||||
|
||||
config = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
confirmation = false;
|
||||
|
@ -103,8 +104,7 @@ in
|
|||
data.location=${cfg.dataLocation}
|
||||
${includeTheme cfg.colorTheme}
|
||||
|
||||
${concatStringsSep "\n" (
|
||||
mapAttrsToList formatPair cfg.config)}
|
||||
${concatStringsSep "\n" (mapAttrsToList formatPair cfg.config)}
|
||||
|
||||
${cfg.extraConfig}
|
||||
'';
|
||||
|
|
|
@ -13,9 +13,7 @@ let
|
|||
fi
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.termite = {
|
||||
enable = mkEnableOption "Termite VTE-based terminal";
|
||||
|
@ -61,7 +59,9 @@ in
|
|||
mouseAutohide = mkOption {
|
||||
default = null;
|
||||
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 {
|
||||
|
@ -73,7 +73,9 @@ in
|
|||
scrollOnKeystroke = mkOption {
|
||||
default = null;
|
||||
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 {
|
||||
|
@ -106,14 +108,16 @@ in
|
|||
default = null;
|
||||
example = "terminal";
|
||||
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 {
|
||||
default = null;
|
||||
example = 10000;
|
||||
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 {
|
||||
|
@ -149,7 +153,8 @@ in
|
|||
filterUnmatchedUrls = mkOption {
|
||||
default = null;
|
||||
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 {
|
||||
|
@ -290,7 +295,8 @@ in
|
|||
default = "";
|
||||
example = "fullscreen = true";
|
||||
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 {
|
||||
|
@ -301,78 +307,81 @@ in
|
|||
color2 = #60b48a
|
||||
'';
|
||||
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 {
|
||||
default = "";
|
||||
example = "border = #3f3f3f";
|
||||
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 = (
|
||||
let
|
||||
boolToString = v: if v then "true" else "false";
|
||||
optionalBoolean = name: val: lib.optionalString (val != null) "${name} = ${boolToString val}";
|
||||
optionalInteger = name: val: lib.optionalString (val != null) "${name} = ${toString val}";
|
||||
optionalString = name: val: lib.optionalString (val != null) "${name} = ${val}";
|
||||
in mkIf cfg.enable {
|
||||
home.packages = [ pkgs.termite ];
|
||||
xdg.configFile."termite/config".text = ''
|
||||
[options]
|
||||
${optionalBoolean "allow_bold" cfg.allowBold}
|
||||
${optionalBoolean "audible_bell" cfg.audibleBell}
|
||||
${optionalString "browser" cfg.browser}
|
||||
${optionalBoolean "clickable_url" cfg.clickableUrl}
|
||||
${optionalString "cursor_blink" cfg.cursorBlink}
|
||||
${optionalString "cursor_shape" cfg.cursorShape}
|
||||
${optionalBoolean "dynamic_title" cfg.dynamicTitle}
|
||||
${optionalBoolean "filter_unmatched_urls" cfg.filterUnmatchedUrls}
|
||||
${optionalString "font" cfg.font}
|
||||
${optionalBoolean "fullscreen" cfg.fullscreen}
|
||||
${optionalString "geometry" cfg.geometry}
|
||||
${optionalString "icon_name" cfg.iconName}
|
||||
${optionalBoolean "modify_other_keys" cfg.modifyOtherKeys}
|
||||
${optionalBoolean "mouse_autohide" cfg.mouseAutohide}
|
||||
${optionalBoolean "scroll_on_keystroke" cfg.scrollOnKeystroke}
|
||||
${optionalBoolean "scroll_on_output" cfg.scrollOnOutput}
|
||||
${optionalInteger "scrollback_lines" cfg.scrollbackLines}
|
||||
${optionalString "scrollbar" cfg.scrollbar}
|
||||
${optionalBoolean "search_wrap" cfg.searchWrap}
|
||||
${optionalBoolean "size_hints" cfg.sizeHints}
|
||||
${optionalBoolean "urgent_on_bell" cfg.urgentOnBell}
|
||||
config = (let
|
||||
boolToString = v: if v then "true" else "false";
|
||||
optionalBoolean = name: val:
|
||||
lib.optionalString (val != null) "${name} = ${boolToString val}";
|
||||
optionalInteger = name: val:
|
||||
lib.optionalString (val != null) "${name} = ${toString val}";
|
||||
optionalString = name: val:
|
||||
lib.optionalString (val != null) "${name} = ${val}";
|
||||
in mkIf cfg.enable {
|
||||
home.packages = [ pkgs.termite ];
|
||||
xdg.configFile."termite/config".text = ''
|
||||
[options]
|
||||
${optionalBoolean "allow_bold" cfg.allowBold}
|
||||
${optionalBoolean "audible_bell" cfg.audibleBell}
|
||||
${optionalString "browser" cfg.browser}
|
||||
${optionalBoolean "clickable_url" cfg.clickableUrl}
|
||||
${optionalString "cursor_blink" cfg.cursorBlink}
|
||||
${optionalString "cursor_shape" cfg.cursorShape}
|
||||
${optionalBoolean "dynamic_title" cfg.dynamicTitle}
|
||||
${optionalBoolean "filter_unmatched_urls" cfg.filterUnmatchedUrls}
|
||||
${optionalString "font" cfg.font}
|
||||
${optionalBoolean "fullscreen" cfg.fullscreen}
|
||||
${optionalString "geometry" cfg.geometry}
|
||||
${optionalString "icon_name" cfg.iconName}
|
||||
${optionalBoolean "modify_other_keys" cfg.modifyOtherKeys}
|
||||
${optionalBoolean "mouse_autohide" cfg.mouseAutohide}
|
||||
${optionalBoolean "scroll_on_keystroke" cfg.scrollOnKeystroke}
|
||||
${optionalBoolean "scroll_on_output" cfg.scrollOnOutput}
|
||||
${optionalInteger "scrollback_lines" cfg.scrollbackLines}
|
||||
${optionalString "scrollbar" cfg.scrollbar}
|
||||
${optionalBoolean "search_wrap" cfg.searchWrap}
|
||||
${optionalBoolean "size_hints" cfg.sizeHints}
|
||||
${optionalBoolean "urgent_on_bell" cfg.urgentOnBell}
|
||||
|
||||
${cfg.optionsExtra}
|
||||
${cfg.optionsExtra}
|
||||
|
||||
[colors]
|
||||
${optionalString "background" cfg.backgroundColor}
|
||||
${optionalString "cursor" cfg.cursorColor}
|
||||
${optionalString "cursor_foreground" cfg.cursorForegroundColor}
|
||||
${optionalString "foreground" cfg.foregroundColor}
|
||||
${optionalString "foregroundBold" cfg.foregroundBoldColor}
|
||||
${optionalString "highlight" cfg.highlightColor}
|
||||
[colors]
|
||||
${optionalString "background" cfg.backgroundColor}
|
||||
${optionalString "cursor" cfg.cursorColor}
|
||||
${optionalString "cursor_foreground" cfg.cursorForegroundColor}
|
||||
${optionalString "foreground" cfg.foregroundColor}
|
||||
${optionalString "foregroundBold" cfg.foregroundBoldColor}
|
||||
${optionalString "highlight" cfg.highlightColor}
|
||||
|
||||
${cfg.colorsExtra}
|
||||
${cfg.colorsExtra}
|
||||
|
||||
[hints]
|
||||
${optionalString "active_background" cfg.hintsActiveBackgroundColor}
|
||||
${optionalString "active_foreground" cfg.hintsActiveForegroundColor}
|
||||
${optionalString "background" cfg.hintsBackgroundColor}
|
||||
${optionalString "border" cfg.hintsBorderColor}
|
||||
${optionalInteger "border_width" cfg.hintsBorderWidth}
|
||||
${optionalString "font" cfg.hintsFont}
|
||||
${optionalString "foreground" cfg.hintsForegroundColor}
|
||||
${optionalInteger "padding" cfg.hintsPadding}
|
||||
${optionalInteger "roundness" cfg.hintsRoundness}
|
||||
[hints]
|
||||
${optionalString "active_background" cfg.hintsActiveBackgroundColor}
|
||||
${optionalString "active_foreground" cfg.hintsActiveForegroundColor}
|
||||
${optionalString "background" cfg.hintsBackgroundColor}
|
||||
${optionalString "border" cfg.hintsBorderColor}
|
||||
${optionalInteger "border_width" cfg.hintsBorderWidth}
|
||||
${optionalString "font" cfg.hintsFont}
|
||||
${optionalString "foreground" cfg.hintsForegroundColor}
|
||||
${optionalInteger "padding" cfg.hintsPadding}
|
||||
${optionalInteger "roundness" cfg.hintsRoundness}
|
||||
|
||||
${cfg.hintsExtra}
|
||||
'';
|
||||
${cfg.hintsExtra}
|
||||
'';
|
||||
|
||||
programs.bash.initExtra = vteInitStr;
|
||||
programs.zsh.initExtra = vteInitStr;
|
||||
}
|
||||
);
|
||||
programs.bash.initExtra = vteInitStr;
|
||||
programs.zsh.initExtra = vteInitStr;
|
||||
});
|
||||
}
|
||||
|
|
|
@ -8,9 +8,7 @@ let
|
|||
|
||||
texlivePkgs = cfg.extraPackages pkgs.texlive;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
|
@ -35,13 +33,11 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = texlivePkgs != {};
|
||||
message = "Must provide at least one extra package in"
|
||||
+ " 'programs.texlive.extraPackages'.";
|
||||
}
|
||||
];
|
||||
assertions = [{
|
||||
assertion = texlivePkgs != { };
|
||||
message = "Must provide at least one extra package in"
|
||||
+ " 'programs.texlive.extraPackages'.";
|
||||
}];
|
||||
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.programs.urxvt;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options.programs.urxvt = {
|
||||
enable = mkEnableOption "rxvt-unicode terminal emulator";
|
||||
|
||||
|
@ -21,14 +19,14 @@ in
|
|||
|
||||
fonts = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
description = "List of fonts to be used.";
|
||||
example = [ "xft:Droid Sans Mono Nerd Font:size=9" ];
|
||||
};
|
||||
|
||||
keybindings = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
default = { };
|
||||
description = "Mapping of keybindings to actions";
|
||||
example = literalExample ''
|
||||
{
|
||||
|
@ -41,7 +39,8 @@ in
|
|||
iso14755 = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "ISO14755 support for viewing and entering unicode characters.";
|
||||
description =
|
||||
"ISO14755 support for viewing and entering unicode characters.";
|
||||
};
|
||||
|
||||
scroll = {
|
||||
|
@ -75,11 +74,12 @@ in
|
|||
floating = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "Whether to display an rxvt scrollbar without a trough.";
|
||||
description =
|
||||
"Whether to display an rxvt scrollbar without a trough.";
|
||||
};
|
||||
};
|
||||
};
|
||||
default = {};
|
||||
default = { };
|
||||
description = "Scrollbar settings.";
|
||||
};
|
||||
|
||||
|
@ -92,7 +92,8 @@ in
|
|||
keepPosition = mkOption {
|
||||
type = types.bool;
|
||||
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 {
|
||||
|
@ -117,11 +118,12 @@ in
|
|||
shading = mkOption {
|
||||
type = types.ints.between 0 200;
|
||||
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 {
|
||||
default = {};
|
||||
default = { };
|
||||
type = types.attrs;
|
||||
description = "Additional configuration to add.";
|
||||
example = { "shading" = 15; };
|
||||
|
@ -145,12 +147,10 @@ in
|
|||
"URxvt.transparent" = cfg.transparent;
|
||||
"URxvt.shading" = cfg.shading;
|
||||
"URxvt.iso14755" = cfg.iso14755;
|
||||
} // flip mapAttrs' cfg.keybindings (kb: action:
|
||||
nameValuePair "URxvt.keysym.${kb}" action
|
||||
) // optionalAttrs (cfg.fonts != []) {
|
||||
"URxvt.font" = concatStringsSep "," cfg.fonts;
|
||||
} // flip mapAttrs' cfg.extraConfig (k: v:
|
||||
nameValuePair "URxvt.${k}" v
|
||||
);
|
||||
} // flip mapAttrs' cfg.keybindings
|
||||
(kb: action: nameValuePair "URxvt.keysym.${kb}" action)
|
||||
// optionalAttrs (cfg.fonts != [ ]) {
|
||||
"URxvt.font" = concatStringsSep "," cfg.fonts;
|
||||
} // flip mapAttrs' cfg.extraConfig (k: v: nameValuePair "URxvt.${k}" v);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -31,43 +31,36 @@ let
|
|||
};
|
||||
|
||||
vimSettingsType = types.submodule {
|
||||
options =
|
||||
let
|
||||
opt = name: type: mkOption {
|
||||
options = let
|
||||
opt = name: type:
|
||||
mkOption {
|
||||
type = types.nullOr type;
|
||||
default = null;
|
||||
visible = false;
|
||||
};
|
||||
in
|
||||
mapAttrs opt knownSettings;
|
||||
in mapAttrs opt knownSettings;
|
||||
};
|
||||
|
||||
setExpr = name: value:
|
||||
let
|
||||
v =
|
||||
if isBool value then (if value then "" else "no") + name
|
||||
else
|
||||
"${name}=${
|
||||
if isList value
|
||||
then concatStringsSep "," value
|
||||
else toString value
|
||||
}";
|
||||
in
|
||||
optionalString (value != null) ("set " + v);
|
||||
v = if isBool value then
|
||||
(if value then "" else "no") + name
|
||||
else
|
||||
"${name}=${
|
||||
if isList value then concatStringsSep "," value else toString value
|
||||
}";
|
||||
in optionalString (value != null) ("set " + v);
|
||||
|
||||
plugins =
|
||||
let
|
||||
vpkgs = pkgs.vimPlugins;
|
||||
getPkg = p:
|
||||
if isDerivation p
|
||||
then [ p ]
|
||||
else optional (isString p && hasAttr p vpkgs) vpkgs.${p};
|
||||
in
|
||||
concatMap getPkg cfg.plugins;
|
||||
plugins = let
|
||||
vpkgs = pkgs.vimPlugins;
|
||||
getPkg = p:
|
||||
if isDerivation p then
|
||||
[ p ]
|
||||
else
|
||||
optional (isString p && hasAttr p vpkgs) vpkgs.${p};
|
||||
in concatMap getPkg cfg.plugins;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
programs.vim = {
|
||||
enable = mkEnableOption "Vim";
|
||||
|
@ -75,7 +68,7 @@ in
|
|||
plugins = mkOption {
|
||||
type = with types; listOf (either str package);
|
||||
default = defaultPlugins;
|
||||
example = literalExample ''[ pkgs.vimPlugins.YankRing ]'';
|
||||
example = literalExample "[ pkgs.vimPlugins.YankRing ]";
|
||||
description = ''
|
||||
List of vim plugins to install. To get a list of supported plugins run:
|
||||
<command>nix-env -f '<nixpkgs>' -qaP -A vimPlugins</command>.
|
||||
|
@ -88,7 +81,7 @@ in
|
|||
|
||||
settings = mkOption {
|
||||
type = vimSettingsType;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
expandtab = true;
|
||||
|
@ -102,14 +95,12 @@ in
|
|||
options.
|
||||
|
||||
<informaltable frame="none"><tgroup cols="1"><tbody>
|
||||
${concatStringsSep "\n" (
|
||||
mapAttrsToList (n: v: ''
|
||||
<row>
|
||||
<entry><varname>${n}</varname></entry>
|
||||
<entry>${v.description}</entry>
|
||||
</row>
|
||||
'') knownSettings
|
||||
)}
|
||||
${concatStringsSep "\n" (mapAttrsToList (n: v: ''
|
||||
<row>
|
||||
<entry><varname>${n}</varname></entry>
|
||||
<entry>${v.description}</entry>
|
||||
</row>
|
||||
'') knownSettings)}
|
||||
</tbody></tgroup></informaltable>
|
||||
|
||||
See the Vim documentation for detailed descriptions of these
|
||||
|
@ -136,56 +127,45 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
config = (
|
||||
let
|
||||
customRC = ''
|
||||
${concatStringsSep "\n" (
|
||||
filter (v: v != "") (
|
||||
mapAttrsToList setExpr (
|
||||
builtins.intersectAttrs knownSettings cfg.settings)))}
|
||||
config = (let
|
||||
customRC = ''
|
||||
${concatStringsSep "\n" (filter (v: v != "") (mapAttrsToList setExpr
|
||||
(builtins.intersectAttrs knownSettings cfg.settings)))}
|
||||
|
||||
${cfg.extraConfig}
|
||||
'';
|
||||
${cfg.extraConfig}
|
||||
'';
|
||||
|
||||
vim = pkgs.vim_configurable.customize {
|
||||
name = "vim";
|
||||
vimrcConfig = {
|
||||
inherit customRC;
|
||||
vim = pkgs.vim_configurable.customize {
|
||||
name = "vim";
|
||||
vimrcConfig = {
|
||||
inherit customRC;
|
||||
|
||||
packages.home-manager.start = plugins;
|
||||
};
|
||||
packages.home-manager.start = plugins;
|
||||
};
|
||||
in
|
||||
mkIf cfg.enable {
|
||||
assertions =
|
||||
let
|
||||
packagesNotFound = filter (p: isString p && (!hasAttr p pkgs.vimPlugins)) cfg.plugins;
|
||||
in
|
||||
[
|
||||
{
|
||||
assertion = packagesNotFound == [];
|
||||
message = "Following VIM plugin not found in pkgs.vimPlugins: ${
|
||||
concatMapStringsSep ", " (p: ''"${p}"'') packagesNotFound
|
||||
}";
|
||||
}
|
||||
];
|
||||
};
|
||||
in mkIf cfg.enable {
|
||||
assertions = let
|
||||
packagesNotFound =
|
||||
filter (p: isString p && (!hasAttr p pkgs.vimPlugins)) cfg.plugins;
|
||||
in [{
|
||||
assertion = packagesNotFound == [ ];
|
||||
message = "Following VIM plugin not found in pkgs.vimPlugins: ${
|
||||
concatMapStringsSep ", " (p: ''"${p}"'') packagesNotFound
|
||||
}";
|
||||
}];
|
||||
|
||||
warnings =
|
||||
let
|
||||
stringPlugins = filter isString cfg.plugins;
|
||||
in
|
||||
optional (stringPlugins != []) ''
|
||||
Specifying VIM plugins using strings is deprecated, found ${
|
||||
concatMapStringsSep ", " (p: ''"${p}"'') stringPlugins
|
||||
} as strings.
|
||||
'';
|
||||
warnings = let stringPlugins = filter isString cfg.plugins;
|
||||
in optional (stringPlugins != [ ]) ''
|
||||
Specifying VIM plugins using strings is deprecated, found ${
|
||||
concatMapStringsSep ", " (p: ''"${p}"'') stringPlugins
|
||||
} as strings.
|
||||
'';
|
||||
|
||||
home.packages = [ cfg.package ];
|
||||
home.packages = [ cfg.package ];
|
||||
|
||||
programs.vim = {
|
||||
package = vim;
|
||||
plugins = defaultPlugins;
|
||||
};
|
||||
}
|
||||
);
|
||||
programs.vim = {
|
||||
package = vim;
|
||||
plugins = defaultPlugins;
|
||||
};
|
||||
});
|
||||
}
|
||||
|
|
|
@ -7,8 +7,8 @@ let
|
|||
cfg = config.programs.vscode.haskell;
|
||||
|
||||
defaultHieNixExe = hie-nix.hies + "/bin/hie-wrapper";
|
||||
defaultHieNixExeText = literalExample
|
||||
"\"\${pkgs.hie-nix.hies}/bin/hie-wrapper\"";
|
||||
defaultHieNixExeText =
|
||||
literalExample ''"''${pkgs.hie-nix.hies}/bin/hie-wrapper"'';
|
||||
|
||||
hie-nix = pkgs.hie-nix or (abort ''
|
||||
vscode.haskell: pkgs.hie-nix missing. Please add an overlay such as:
|
||||
|
@ -21,9 +21,7 @@ let
|
|||
]
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options.programs.vscode.haskell = {
|
||||
enable = mkEnableOption "Haskell integration for Visual Studio Code";
|
||||
|
||||
|
@ -57,10 +55,8 @@ in
|
|||
};
|
||||
|
||||
programs.vscode.extensions =
|
||||
[
|
||||
pkgs.vscode-extensions.justusadam.language-haskell
|
||||
]
|
||||
[ pkgs.vscode-extensions.justusadam.language-haskell ]
|
||||
++ lib.optional cfg.hie.enable
|
||||
pkgs.vscode-extensions.alanz.vscode-hie-server;
|
||||
pkgs.vscode-extensions.alanz.vscode-hie-server;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,16 +7,14 @@ let
|
|||
cfg = config.programs.z-lua;
|
||||
|
||||
aliases = {
|
||||
zz = "z -c"; # restrict matches to subdirs of $PWD
|
||||
zi = "z -i"; # cd with interactive selection
|
||||
zf = "z -I"; # use fzf to select in multiple matches
|
||||
zb = "z -b"; # quickly cd to the parent directory
|
||||
zh = "z -I -t ."; # fzf
|
||||
zz = "z -c"; # restrict matches to subdirs of $PWD
|
||||
zi = "z -i"; # cd with interactive selection
|
||||
zf = "z -I"; # use fzf to select in multiple matches
|
||||
zb = "z -b"; # quickly cd to the parent directory
|
||||
zh = "z -I -t ."; # fzf
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.marsam ];
|
||||
|
||||
options.programs.z-lua = {
|
||||
|
@ -24,7 +22,7 @@ in
|
|||
|
||||
options = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "enhanced" "once" "fzf" ];
|
||||
description = ''
|
||||
List of options to pass to z.lua.
|
||||
|
@ -68,15 +66,21 @@ in
|
|||
home.packages = [ pkgs.z-lua ];
|
||||
|
||||
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 ''
|
||||
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 ''
|
||||
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;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
{ config, lib, pkgs, ...}:
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
|
@ -9,14 +9,10 @@ let
|
|||
formatLine = n: v:
|
||||
let
|
||||
formatValue = v:
|
||||
if isBool v then (if v then "true" else "false")
|
||||
else toString v;
|
||||
in
|
||||
"set ${n}\t\"${formatValue v}\"";
|
||||
if isBool v then (if v then "true" else "false") else toString v;
|
||||
in ''set ${n} "${formatValue v}"'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rprospero ];
|
||||
|
||||
options.programs.zathura = {
|
||||
|
@ -25,7 +21,7 @@ in
|
|||
focused on keyboard interaction'';
|
||||
|
||||
options = mkOption {
|
||||
default = {};
|
||||
default = { };
|
||||
type = with types; attrsOf (either str (either bool int));
|
||||
description = ''
|
||||
Add <option>:set</option> command options to zathura and make
|
||||
|
@ -36,7 +32,10 @@ in
|
|||
</citerefentry>
|
||||
for the full list of options.
|
||||
'';
|
||||
example = { default-bg = "#000000"; default-fg = "#FFFFFF"; };
|
||||
example = {
|
||||
default-bg = "#000000";
|
||||
default-fg = "#FFFFFF";
|
||||
};
|
||||
};
|
||||
|
||||
extraConfig = mkOption {
|
||||
|
@ -52,10 +51,8 @@ in
|
|||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.zathura ];
|
||||
|
||||
xdg.configFile."zathura/zathurarc".text =
|
||||
concatStringsSep "\n" ([]
|
||||
++ optional (cfg.extraConfig != "") cfg.extraConfig
|
||||
++ mapAttrsToList formatLine cfg.options
|
||||
) + "\n";
|
||||
xdg.configFile."zathura/zathurarc".text = concatStringsSep "\n" ([ ]
|
||||
++ optional (cfg.extraConfig != "") cfg.extraConfig
|
||||
++ mapAttrsToList formatLine cfg.options) + "\n";
|
||||
};
|
||||
}
|
||||
|
|
|
@ -22,19 +22,15 @@ with lib;
|
|||
|
||||
config = mkIf config.services.blueman-applet.enable {
|
||||
systemd.user.services.blueman-applet = {
|
||||
Unit = {
|
||||
Description = "Blueman applet";
|
||||
After = [ "graphical-session-pre.target" ];
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
Unit = {
|
||||
Description = "Blueman applet";
|
||||
After = [ "graphical-session-pre.target" ];
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
ExecStart = "${pkgs.blueman}/bin/blueman-applet";
|
||||
};
|
||||
Service = { ExecStart = "${pkgs.blueman}/bin/blueman-applet"; };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -9,37 +9,24 @@ let
|
|||
package = pkgs.cbatticon;
|
||||
|
||||
makeCommand = commandName: commandArg:
|
||||
optional (commandArg != null) (
|
||||
let
|
||||
cmd = pkgs.writeShellScript commandName commandArg;
|
||||
in
|
||||
"--${commandName} ${cmd}"
|
||||
);
|
||||
optional (commandArg != null)
|
||||
(let cmd = pkgs.writeShellScript commandName commandArg;
|
||||
in "--${commandName} ${cmd}");
|
||||
|
||||
commandLine = concatStringsSep " " (
|
||||
[ "${package}/bin/cbatticon" ]
|
||||
commandLine = concatStringsSep " " ([ "${package}/bin/cbatticon" ]
|
||||
++ makeCommand "command-critical-level" cfg.commandCriticalLevel
|
||||
++ makeCommand "command-left-click" cfg.commandLeftClick
|
||||
++ optional
|
||||
(cfg.iconType != null)
|
||||
"--icon-type ${cfg.iconType}"
|
||||
++ optional
|
||||
(cfg.lowLevelPercent != null)
|
||||
"--low-level ${toString cfg.lowLevelPercent}"
|
||||
++ optional
|
||||
(cfg.criticalLevelPercent != null)
|
||||
"--critical-level ${toString cfg.criticalLevelPercent}"
|
||||
++ optional
|
||||
(cfg.updateIntervalSeconds != null)
|
||||
"--update-interval ${toString cfg.updateIntervalSeconds}"
|
||||
++ optional
|
||||
(cfg.hideNotification != null && cfg.hideNotification)
|
||||
"--hide-notification"
|
||||
);
|
||||
++ optional (cfg.iconType != null) "--icon-type ${cfg.iconType}"
|
||||
++ optional (cfg.lowLevelPercent != null)
|
||||
"--low-level ${toString cfg.lowLevelPercent}"
|
||||
++ optional (cfg.criticalLevelPercent != null)
|
||||
"--critical-level ${toString cfg.criticalLevelPercent}"
|
||||
++ optional (cfg.updateIntervalSeconds != null)
|
||||
"--update-interval ${toString cfg.updateIntervalSeconds}"
|
||||
++ optional (cfg.hideNotification != null && cfg.hideNotification)
|
||||
"--hide-notification");
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.pmiddend ];
|
||||
|
||||
options = {
|
||||
|
@ -66,7 +53,8 @@ in
|
|||
};
|
||||
|
||||
iconType = mkOption {
|
||||
type = types.nullOr (types.enum [ "standard" "notification" "symbolic" ]);
|
||||
type =
|
||||
types.nullOr (types.enum [ "standard" "notification" "symbolic" ]);
|
||||
default = null;
|
||||
example = "symbolic";
|
||||
description = "Icon type to display in the system tray.";
|
||||
|
@ -119,9 +107,7 @@ in
|
|||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
ExecStart = commandLine;
|
||||
|
|
|
@ -7,44 +7,41 @@ let
|
|||
|
||||
cfg = config.services.compton;
|
||||
|
||||
configFile = pkgs.writeText "compton.conf"
|
||||
(optionalString cfg.fade ''
|
||||
# fading
|
||||
fading = true;
|
||||
fade-delta = ${toString cfg.fadeDelta};
|
||||
fade-in-step = ${elemAt cfg.fadeSteps 0};
|
||||
fade-out-step = ${elemAt cfg.fadeSteps 1};
|
||||
fade-exclude = ${toJSON cfg.fadeExclude};
|
||||
'' +
|
||||
optionalString cfg.shadow ''
|
||||
configFile = pkgs.writeText "compton.conf" (optionalString cfg.fade ''
|
||||
# fading
|
||||
fading = true;
|
||||
fade-delta = ${toString cfg.fadeDelta};
|
||||
fade-in-step = ${elemAt cfg.fadeSteps 0};
|
||||
fade-out-step = ${elemAt cfg.fadeSteps 1};
|
||||
fade-exclude = ${toJSON cfg.fadeExclude};
|
||||
'' + optionalString cfg.shadow ''
|
||||
|
||||
# shadows
|
||||
shadow = true;
|
||||
shadow-offset-x = ${toString (elemAt cfg.shadowOffsets 0)};
|
||||
shadow-offset-y = ${toString (elemAt cfg.shadowOffsets 1)};
|
||||
shadow-opacity = ${cfg.shadowOpacity};
|
||||
shadow-exclude = ${toJSON cfg.shadowExclude};
|
||||
no-dock-shadow = ${toJSON cfg.noDockShadow};
|
||||
no-dnd-shadow = ${toJSON cfg.noDNDShadow};
|
||||
'' +
|
||||
optionalString cfg.blur ''
|
||||
# shadows
|
||||
shadow = true;
|
||||
shadow-offset-x = ${toString (elemAt cfg.shadowOffsets 0)};
|
||||
shadow-offset-y = ${toString (elemAt cfg.shadowOffsets 1)};
|
||||
shadow-opacity = ${cfg.shadowOpacity};
|
||||
shadow-exclude = ${toJSON cfg.shadowExclude};
|
||||
no-dock-shadow = ${toJSON cfg.noDockShadow};
|
||||
no-dnd-shadow = ${toJSON cfg.noDNDShadow};
|
||||
'' + optionalString cfg.blur ''
|
||||
|
||||
# blur
|
||||
blur-background = true;
|
||||
blur-background-exclude = ${toJSON cfg.blurExclude};
|
||||
'' + ''
|
||||
# blur
|
||||
blur-background = true;
|
||||
blur-background-exclude = ${toJSON cfg.blurExclude};
|
||||
'' + ''
|
||||
|
||||
# opacity
|
||||
active-opacity = ${cfg.activeOpacity};
|
||||
inactive-opacity = ${cfg.inactiveOpacity};
|
||||
menu-opacity = ${cfg.menuOpacity};
|
||||
opacity-rule = ${toJSON cfg.opacityRule};
|
||||
# opacity
|
||||
active-opacity = ${cfg.activeOpacity};
|
||||
inactive-opacity = ${cfg.inactiveOpacity};
|
||||
menu-opacity = ${cfg.menuOpacity};
|
||||
opacity-rule = ${toJSON cfg.opacityRule};
|
||||
|
||||
# other options
|
||||
backend = ${toJSON cfg.backend};
|
||||
vsync = ${toJSON cfg.vSync};
|
||||
refresh-rate = ${toString cfg.refreshRate};
|
||||
'' + cfg.extraOptions);
|
||||
# other options
|
||||
backend = ${toJSON cfg.backend};
|
||||
vsync = ${toJSON cfg.vSync};
|
||||
refresh-rate = ${toString cfg.refreshRate};
|
||||
'' + cfg.extraOptions);
|
||||
|
||||
in {
|
||||
|
||||
|
@ -61,11 +58,8 @@ in {
|
|||
|
||||
blurExclude = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [
|
||||
"class_g = 'slop'"
|
||||
"class_i = 'polybar'"
|
||||
];
|
||||
default = [ ];
|
||||
example = [ "class_g = 'slop'" "class_i = 'polybar'" ];
|
||||
description = ''
|
||||
List of windows to exclude background blur.
|
||||
See the
|
||||
|
@ -105,12 +99,8 @@ in {
|
|||
|
||||
fadeExclude = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [
|
||||
"window_type *= 'menu'"
|
||||
"name ~= 'Firefox$'"
|
||||
"focused = 1"
|
||||
];
|
||||
default = [ ];
|
||||
example = [ "window_type *= 'menu'" "name ~= 'Firefox$'" "focused = 1" ];
|
||||
description = ''
|
||||
List of conditions of windows that should not be faded.
|
||||
See the
|
||||
|
@ -150,12 +140,8 @@ in {
|
|||
|
||||
shadowExclude = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [
|
||||
"window_type *= 'menu'"
|
||||
"name ~= 'Firefox$'"
|
||||
"focused = 1"
|
||||
];
|
||||
default = [ ];
|
||||
example = [ "window_type *= 'menu'" "name ~= 'Firefox$'" "focused = 1" ];
|
||||
description = ''
|
||||
List of conditions of windows that should have no shadow.
|
||||
See the
|
||||
|
@ -212,11 +198,8 @@ in {
|
|||
|
||||
opacityRule = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [
|
||||
"87:class_i ?= 'scratchpad'"
|
||||
"91:class_i ?= 'xterm'"
|
||||
];
|
||||
default = [ ];
|
||||
example = [ "87:class_i ?= 'scratchpad'" "91:class_i ?= 'xterm'" ];
|
||||
description = ''
|
||||
List of opacity rules.
|
||||
See the
|
||||
|
@ -256,7 +239,7 @@ in {
|
|||
default = 0;
|
||||
example = 60;
|
||||
description = ''
|
||||
Screen refresh rate (0 = automatically detect).
|
||||
Screen refresh rate (0 = automatically detect).
|
||||
'';
|
||||
};
|
||||
|
||||
|
@ -293,16 +276,13 @@ in {
|
|||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
ExecStart = "${cfg.package}/bin/compton --config ${configFile}";
|
||||
Restart = "always";
|
||||
RestartSec = 3;
|
||||
}
|
||||
// optionalAttrs (cfg.backend == "glx") {
|
||||
} // optionalAttrs (cfg.backend == "glx") {
|
||||
# Temporarily fixes corrupt colours with Mesa 18.
|
||||
Environment = [ "allow_rgb10_configs=false" ];
|
||||
};
|
||||
|
|
|
@ -6,17 +6,19 @@ let
|
|||
|
||||
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 {
|
||||
mkKeyValue = key: value:
|
||||
let
|
||||
value' =
|
||||
if isBool value then (if value then "yes" else "no")
|
||||
else if isString value then "\"${value}\""
|
||||
else toString value;
|
||||
in
|
||||
"${key}=${value'}";
|
||||
let
|
||||
value' = if isBool value then
|
||||
(if value then "yes" else "no")
|
||||
else if isString value then
|
||||
''"${value}"''
|
||||
else
|
||||
toString value;
|
||||
in "${key}=${value'}";
|
||||
};
|
||||
|
||||
themeType = types.submodule {
|
||||
|
@ -48,9 +50,7 @@ let
|
|||
size = "32x32";
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
|
@ -65,7 +65,7 @@ in
|
|||
|
||||
settings = mkOption {
|
||||
type = with types; attrsOf (attrsOf eitherStrBoolIntList);
|
||||
default = {};
|
||||
default = { };
|
||||
description = "Configuration written to ~/.config/dunstrc";
|
||||
example = literalExample ''
|
||||
{
|
||||
|
@ -87,86 +87,73 @@ in
|
|||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable (
|
||||
mkMerge [
|
||||
{
|
||||
xdg.dataFile."dbus-1/services/org.knopwob.dunst.service".source =
|
||||
"${pkgs.dunst}/share/dbus-1/services/org.knopwob.dunst.service";
|
||||
config = mkIf cfg.enable (mkMerge [
|
||||
{
|
||||
xdg.dataFile."dbus-1/services/org.knopwob.dunst.service".source =
|
||||
"${pkgs.dunst}/share/dbus-1/services/org.knopwob.dunst.service";
|
||||
|
||||
services.dunst.settings.global.icon_path =
|
||||
let
|
||||
useCustomTheme =
|
||||
cfg.iconTheme.package != hicolorTheme.package
|
||||
|| cfg.iconTheme.name != hicolorTheme.name
|
||||
|| cfg.iconTheme.size != hicolorTheme.size;
|
||||
services.dunst.settings.global.icon_path = let
|
||||
useCustomTheme = cfg.iconTheme.package != hicolorTheme.package
|
||||
|| cfg.iconTheme.name != hicolorTheme.name || cfg.iconTheme.size
|
||||
!= hicolorTheme.size;
|
||||
|
||||
basePaths = [
|
||||
"/run/current-system/sw"
|
||||
config.home.profileDirectory
|
||||
cfg.iconTheme.package
|
||||
] ++ optional useCustomTheme hicolorTheme.package;
|
||||
basePaths = [
|
||||
"/run/current-system/sw"
|
||||
config.home.profileDirectory
|
||||
cfg.iconTheme.package
|
||||
] ++ optional useCustomTheme hicolorTheme.package;
|
||||
|
||||
themes =
|
||||
[
|
||||
cfg.iconTheme
|
||||
] ++ optional useCustomTheme (
|
||||
hicolorTheme // { size = cfg.iconTheme.size; }
|
||||
);
|
||||
themes = [ cfg.iconTheme ] ++ optional useCustomTheme
|
||||
(hicolorTheme // { size = cfg.iconTheme.size; });
|
||||
|
||||
categories = [
|
||||
"actions"
|
||||
"animations"
|
||||
"apps"
|
||||
"categories"
|
||||
"devices"
|
||||
"emblems"
|
||||
"emotes"
|
||||
"filesystem"
|
||||
"intl"
|
||||
"mimetypes"
|
||||
"places"
|
||||
"status"
|
||||
"stock"
|
||||
];
|
||||
in
|
||||
concatStringsSep ":" (
|
||||
concatMap (theme:
|
||||
concatMap (basePath:
|
||||
map (category:
|
||||
"${basePath}/share/icons/${theme.name}/${theme.size}/${category}"
|
||||
) categories
|
||||
) basePaths
|
||||
) themes
|
||||
);
|
||||
categories = [
|
||||
"actions"
|
||||
"animations"
|
||||
"apps"
|
||||
"categories"
|
||||
"devices"
|
||||
"emblems"
|
||||
"emotes"
|
||||
"filesystem"
|
||||
"intl"
|
||||
"mimetypes"
|
||||
"places"
|
||||
"status"
|
||||
"stock"
|
||||
];
|
||||
in concatStringsSep ":" (concatMap (theme:
|
||||
concatMap (basePath:
|
||||
map (category:
|
||||
"${basePath}/share/icons/${theme.name}/${theme.size}/${category}")
|
||||
categories) basePaths) themes);
|
||||
|
||||
systemd.user.services.dunst = {
|
||||
Unit = {
|
||||
Description = "Dunst notification daemon";
|
||||
After = [ "graphical-session-pre.target" ];
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Service = {
|
||||
Type = "dbus";
|
||||
BusName = "org.freedesktop.Notifications";
|
||||
ExecStart = "${pkgs.dunst}/bin/dunst";
|
||||
};
|
||||
systemd.user.services.dunst = {
|
||||
Unit = {
|
||||
Description = "Dunst notification daemon";
|
||||
After = [ "graphical-session-pre.target" ];
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
}
|
||||
|
||||
(mkIf (cfg.settings != {}) {
|
||||
xdg.configFile."dunst/dunstrc" = {
|
||||
text = toDunstIni cfg.settings;
|
||||
onChange = ''
|
||||
pkillVerbose=""
|
||||
if [[ -v VERBOSE ]]; then
|
||||
pkillVerbose="-e"
|
||||
fi
|
||||
$DRY_RUN_CMD ${pkgs.procps}/bin/pkill -u $USER $pkillVerbose dunst || true
|
||||
unset pkillVerbose
|
||||
'';
|
||||
Service = {
|
||||
Type = "dbus";
|
||||
BusName = "org.freedesktop.Notifications";
|
||||
ExecStart = "${pkgs.dunst}/bin/dunst";
|
||||
};
|
||||
})
|
||||
]
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
(mkIf (cfg.settings != { }) {
|
||||
xdg.configFile."dunst/dunstrc" = {
|
||||
text = toDunstIni cfg.settings;
|
||||
onChange = ''
|
||||
pkillVerbose=""
|
||||
if [[ -v VERBOSE ]]; then
|
||||
pkillVerbose="-e"
|
||||
fi
|
||||
$DRY_RUN_CMD ${pkgs.procps}/bin/pkill -u $USER $pkillVerbose dunst || true
|
||||
unset pkillVerbose
|
||||
'';
|
||||
};
|
||||
})
|
||||
]);
|
||||
}
|
||||
|
|
|
@ -10,9 +10,8 @@ let
|
|||
configText = builtins.toJSON ({ inherit (cfg) order; } // cfg.extraConfig);
|
||||
|
||||
configFile = pkgs.writeText "dwm-status.json" configText;
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
options = {
|
||||
services.dwm-status = {
|
||||
enable = mkEnableOption "dwm-status user service";
|
||||
|
@ -32,7 +31,7 @@ in
|
|||
|
||||
extraConfig = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
separator = "#";
|
||||
|
@ -58,13 +57,9 @@ in
|
|||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
ExecStart = "${cfg.package}/bin/dwm-status ${configFile}";
|
||||
};
|
||||
Service = { ExecStart = "${cfg.package}/bin/dwm-status ${configFile}"; };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -8,26 +8,21 @@ let
|
|||
emacsCfg = config.programs.emacs;
|
||||
emacsBinPath = "${emacsCfg.finalPackage}/bin";
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
options.services.emacs = {
|
||||
enable = mkEnableOption "the Emacs daemon";
|
||||
};
|
||||
in {
|
||||
options.services.emacs = { enable = mkEnableOption "the Emacs daemon"; };
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = emacsCfg.enable;
|
||||
message = "The Emacs service module requires"
|
||||
+ " 'programs.emacs.enable = true'.";
|
||||
}
|
||||
];
|
||||
assertions = [{
|
||||
assertion = emacsCfg.enable;
|
||||
message = "The Emacs service module requires"
|
||||
+ " 'programs.emacs.enable = true'.";
|
||||
}];
|
||||
|
||||
systemd.user.services.emacs = {
|
||||
Unit = {
|
||||
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
|
||||
# unsaved buffers.
|
||||
|
@ -35,14 +30,13 @@ in
|
|||
};
|
||||
|
||||
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)'";
|
||||
Restart = "on-failure";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "default.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "default.target" ]; };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,16 +7,10 @@ let
|
|||
cfg = config.services.flameshot;
|
||||
package = pkgs.flameshot;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.hamhut1066 ];
|
||||
|
||||
options = {
|
||||
services.flameshot = {
|
||||
enable = mkEnableOption "Flameshot";
|
||||
};
|
||||
};
|
||||
options = { services.flameshot = { enable = mkEnableOption "Flameshot"; }; };
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
home.packages = [ package ];
|
||||
|
@ -33,9 +27,7 @@ in
|
|||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
Environment = "PATH=${config.home.profileDirectory}/bin";
|
||||
|
|
|
@ -6,17 +6,19 @@ let
|
|||
|
||||
cfg = config.services.getmail;
|
||||
|
||||
accounts = filter (a: a.getmail.enable)
|
||||
(attrValues config.accounts.email.accounts);
|
||||
accounts =
|
||||
filter (a: a.getmail.enable) (attrValues config.accounts.email.accounts);
|
||||
|
||||
# Note: The getmail service does not expect a path, but just the filename!
|
||||
renderConfigFilepath = a: if a.primary then "getmailrc" else "getmail${a.name}";
|
||||
configFiles = concatMapStringsSep " " (a: " --rcfile ${renderConfigFilepath a}") accounts;
|
||||
in
|
||||
{
|
||||
renderConfigFilepath = a:
|
||||
if a.primary then "getmailrc" else "getmail${a.name}";
|
||||
configFiles =
|
||||
concatMapStringsSep " " (a: " --rcfile ${renderConfigFilepath a}") accounts;
|
||||
in {
|
||||
options = {
|
||||
services.getmail = {
|
||||
enable = mkEnableOption "the getmail systemd service to automatically retrieve mail";
|
||||
enable = mkEnableOption
|
||||
"the getmail systemd service to automatically retrieve mail";
|
||||
|
||||
frequency = mkOption {
|
||||
type = types.str;
|
||||
|
@ -36,25 +38,17 @@ in
|
|||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.user.services.getmail = {
|
||||
Unit = {
|
||||
Description = "getmail email fetcher";
|
||||
};
|
||||
Service = {
|
||||
ExecStart = "${pkgs.getmail}/bin/getmail ${configFiles}";
|
||||
};
|
||||
Unit = { Description = "getmail email fetcher"; };
|
||||
Service = { ExecStart = "${pkgs.getmail}/bin/getmail ${configFiles}"; };
|
||||
};
|
||||
|
||||
systemd.user.timers.getmail = {
|
||||
Unit = {
|
||||
Description = "getmail email fetcher";
|
||||
};
|
||||
Unit = { Description = "getmail email fetcher"; };
|
||||
Timer = {
|
||||
OnCalendar = "${cfg.frequency}";
|
||||
Unit = "getmail.service";
|
||||
};
|
||||
Install = {
|
||||
WantedBy = [ "timers.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "timers.target" ]; };
|
||||
};
|
||||
|
||||
};
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.services.gnome-keyring;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
|
@ -16,8 +14,8 @@ in
|
|||
enable = mkEnableOption "GNOME Keyring";
|
||||
|
||||
components = mkOption {
|
||||
type = types.listOf (types.enum ["pkcs11" "secrets" "ssh"]);
|
||||
default = [];
|
||||
type = types.listOf (types.enum [ "pkcs11" "secrets" "ssh" ]);
|
||||
default = [ ];
|
||||
description = ''
|
||||
The GNOME keyring components to start. If empty then the
|
||||
default set of components will be started.
|
||||
|
@ -34,22 +32,15 @@ in
|
|||
};
|
||||
|
||||
Service = {
|
||||
ExecStart =
|
||||
let
|
||||
args = concatStringsSep " " (
|
||||
[ "--start" "--foreground" ]
|
||||
++ optional (cfg.components != []) (
|
||||
"--components=" + concatStringsSep "," cfg.components
|
||||
)
|
||||
);
|
||||
in
|
||||
"${pkgs.gnome3.gnome_keyring}/bin/gnome-keyring-daemon ${args}";
|
||||
ExecStart = let
|
||||
args = concatStringsSep " " ([ "--start" "--foreground" ]
|
||||
++ optional (cfg.components != [ ])
|
||||
("--components=" + concatStringsSep "," cfg.components));
|
||||
in "${pkgs.gnome3.gnome_keyring}/bin/gnome-keyring-daemon ${args}";
|
||||
Restart = "on-abort";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session-pre.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session-pre.target" ]; };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,12 +6,10 @@ let
|
|||
|
||||
cfg = config.services.grobi;
|
||||
|
||||
eitherStrBoolIntList =
|
||||
with types; either str (either bool (either int (listOf str)));
|
||||
eitherStrBoolIntList = with types;
|
||||
either str (either bool (either int (listOf str)));
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.mbrgm ];
|
||||
|
||||
options = {
|
||||
|
@ -20,7 +18,7 @@ in
|
|||
|
||||
executeAfter = mkOption {
|
||||
type = with types; listOf str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "setxkbmap dvorak" ];
|
||||
description = ''
|
||||
Commands to be run after an output configuration was
|
||||
|
@ -32,7 +30,7 @@ in
|
|||
|
||||
rules = mkOption {
|
||||
type = with types; listOf (attrsOf eitherStrBoolIntList);
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = literalExample ''
|
||||
[
|
||||
{
|
||||
|
@ -88,9 +86,7 @@ in
|
|||
Environment = "PATH=${pkgs.xorg.xrandr}/bin:${pkgs.bash}/bin";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
};
|
||||
|
||||
xdg.configFile."grobi.conf".text = builtins.toJSON {
|
||||
|
|
|
@ -6,23 +6,16 @@ let
|
|||
|
||||
cfg = config.services.hound;
|
||||
|
||||
configFile = pkgs.writeText "hound-config.json" (
|
||||
builtins.toJSON {
|
||||
max-concurrent-indexers = cfg.maxConcurrentIndexers;
|
||||
dbpath = cfg.databasePath;
|
||||
repos = cfg.repositories;
|
||||
health-check-url = "/healthz";
|
||||
}
|
||||
);
|
||||
configFile = pkgs.writeText "hound-config.json" (builtins.toJSON {
|
||||
max-concurrent-indexers = cfg.maxConcurrentIndexers;
|
||||
dbpath = cfg.databasePath;
|
||||
repos = cfg.repositories;
|
||||
health-check-url = "/healthz";
|
||||
});
|
||||
|
||||
houndOptions = [
|
||||
"--addr ${cfg.listenAddress}"
|
||||
"--conf ${configFile}"
|
||||
];
|
||||
houndOptions = [ "--addr ${cfg.listenAddress}" "--conf ${configFile}" ];
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.adisbladis ];
|
||||
|
||||
options.services.hound = {
|
||||
|
@ -37,7 +30,7 @@ in
|
|||
databasePath = mkOption {
|
||||
type = types.path;
|
||||
default = "${config.xdg.dataHome}/hound";
|
||||
defaultText = "\$XDG_DATA_HOME/hound";
|
||||
defaultText = "$XDG_DATA_HOME/hound";
|
||||
description = "The Hound database path.";
|
||||
};
|
||||
|
||||
|
@ -49,7 +42,7 @@ in
|
|||
|
||||
repositories = mkOption {
|
||||
type = types.attrsOf (types.uniq types.attrs);
|
||||
default = {};
|
||||
default = { };
|
||||
example = literalExample ''
|
||||
{
|
||||
SomeGitRepo = {
|
||||
|
@ -67,17 +60,14 @@ in
|
|||
home.packages = [ pkgs.hound ];
|
||||
|
||||
systemd.user.services.hound = {
|
||||
Unit = {
|
||||
Description = "Hound source code search engine";
|
||||
};
|
||||
Unit = { Description = "Hound source code search engine"; };
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "default.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "default.target" ]; };
|
||||
|
||||
Service = {
|
||||
Environment = "PATH=${makeBinPath [ pkgs.mercurial pkgs.git ]}";
|
||||
ExecStart = "${pkgs.hound}/bin/houndd ${concatStringsSep " " houndOptions}";
|
||||
ExecStart =
|
||||
"${pkgs.hound}/bin/houndd ${concatStringsSep " " houndOptions}";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -16,13 +16,16 @@ with lib;
|
|||
onNotifyPost = mkOption {
|
||||
type = with types; either str (attrsOf str);
|
||||
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.";
|
||||
};
|
||||
|
||||
boxes = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
default = [ ];
|
||||
example = [ "Inbox" "[Gmail]/MyLabel" ];
|
||||
description = "IMAP folders to watch.";
|
||||
};
|
||||
|
|
|
@ -6,102 +6,85 @@ let
|
|||
|
||||
cfg = config.services.imapnotify;
|
||||
|
||||
safeName = lib.replaceChars ["@" ":" "\\" "[" "]"] ["-" "-" "-" "" ""];
|
||||
safeName = lib.replaceChars [ "@" ":" "\\" "[" "]" ] [ "-" "-" "-" "" "" ];
|
||||
|
||||
imapnotifyAccounts =
|
||||
filter (a: a.imapnotify.enable)
|
||||
(attrValues config.accounts.email.accounts);
|
||||
filter (a: a.imapnotify.enable) (attrValues config.accounts.email.accounts);
|
||||
|
||||
genAccountUnit = account:
|
||||
let
|
||||
name = safeName account.name;
|
||||
in
|
||||
{
|
||||
name = "imapnotify-${name}";
|
||||
value = {
|
||||
Unit = {
|
||||
Description = "imapnotify for ${name}";
|
||||
};
|
||||
let name = safeName account.name;
|
||||
in {
|
||||
name = "imapnotify-${name}";
|
||||
value = {
|
||||
Unit = { Description = "imapnotify for ${name}"; };
|
||||
|
||||
Service = {
|
||||
ExecStart = "${pkgs.imapnotify}/bin/imapnotify -c ${genAccountConfig account}";
|
||||
} // optionalAttrs account.notmuch.enable {
|
||||
Environment = "NOTMUCH_CONFIG=${config.xdg.configHome}/notmuch/notmuchrc";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "default.target" ];
|
||||
};
|
||||
Service = {
|
||||
ExecStart =
|
||||
"${pkgs.imapnotify}/bin/imapnotify -c ${genAccountConfig account}";
|
||||
} // optionalAttrs account.notmuch.enable {
|
||||
Environment =
|
||||
"NOTMUCH_CONFIG=${config.xdg.configHome}/notmuch/notmuchrc";
|
||||
};
|
||||
|
||||
Install = { WantedBy = [ "default.target" ]; };
|
||||
};
|
||||
};
|
||||
|
||||
genAccountConfig = account:
|
||||
pkgs.writeText "imapnotify-${safeName account.name}-config.js" (
|
||||
let
|
||||
port =
|
||||
if account.imap.port != null then account.imap.port
|
||||
else if account.imap.tls.enable then 993
|
||||
else 143;
|
||||
pkgs.writeText "imapnotify-${safeName account.name}-config.js" (let
|
||||
port = if account.imap.port != null then
|
||||
account.imap.port
|
||||
else if account.imap.tls.enable then
|
||||
993
|
||||
else
|
||||
143;
|
||||
|
||||
toJSON = builtins.toJSON;
|
||||
in
|
||||
''
|
||||
var child_process = require('child_process');
|
||||
toJSON = builtins.toJSON;
|
||||
in ''
|
||||
var child_process = require('child_process');
|
||||
|
||||
function getStdout(cmd) {
|
||||
var stdout = child_process.execSync(cmd);
|
||||
return stdout.toString().trim();
|
||||
}
|
||||
function getStdout(cmd) {
|
||||
var stdout = child_process.execSync(cmd);
|
||||
return stdout.toString().trim();
|
||||
}
|
||||
|
||||
exports.host = ${toJSON account.imap.host}
|
||||
exports.port = ${toJSON port};
|
||||
exports.tls = ${toJSON account.imap.tls.enable};
|
||||
exports.username = ${toJSON account.userName};
|
||||
exports.password = getStdout("${toString account.passwordCommand}");
|
||||
exports.onNotify = ${toJSON account.imapnotify.onNotify};
|
||||
exports.onNotifyPost = ${toJSON account.imapnotify.onNotifyPost};
|
||||
exports.boxes = ${toJSON account.imapnotify.boxes};
|
||||
''
|
||||
);
|
||||
exports.host = ${toJSON account.imap.host}
|
||||
exports.port = ${toJSON port};
|
||||
exports.tls = ${toJSON account.imap.tls.enable};
|
||||
exports.username = ${toJSON account.userName};
|
||||
exports.password = getStdout("${toString account.passwordCommand}");
|
||||
exports.onNotify = ${toJSON account.imapnotify.onNotify};
|
||||
exports.onNotifyPost = ${toJSON account.imapnotify.onNotifyPost};
|
||||
exports.boxes = ${toJSON account.imapnotify.boxes};
|
||||
'');
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.nickhu ];
|
||||
|
||||
options = {
|
||||
services.imapnotify = {
|
||||
enable = mkEnableOption "imapnotify";
|
||||
};
|
||||
services.imapnotify = { enable = mkEnableOption "imapnotify"; };
|
||||
|
||||
accounts.email.accounts = mkOption {
|
||||
type = with types; attrsOf (submodule (
|
||||
import ./imapnotify-accounts.nix
|
||||
));
|
||||
type = with types; attrsOf (submodule (import ./imapnotify-accounts.nix));
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions =
|
||||
let
|
||||
checkAccounts = pred: msg:
|
||||
let
|
||||
badAccounts = filter pred imapnotifyAccounts;
|
||||
in
|
||||
{
|
||||
assertion = badAccounts == [];
|
||||
message = "imapnotify: Missing ${msg} for accounts: "
|
||||
+ concatMapStringsSep ", " (a: a.name) badAccounts;
|
||||
};
|
||||
in
|
||||
[
|
||||
(checkAccounts (a: a.maildir == null) "maildir configuration")
|
||||
(checkAccounts (a: a.imap == null) "IMAP configuration")
|
||||
(checkAccounts (a: a.passwordCommand == null) "password command")
|
||||
(checkAccounts (a: a.userName == null) "username")
|
||||
];
|
||||
assertions = let
|
||||
checkAccounts = pred: msg:
|
||||
let badAccounts = filter pred imapnotifyAccounts;
|
||||
in {
|
||||
assertion = badAccounts == [ ];
|
||||
message = "imapnotify: Missing ${msg} for accounts: "
|
||||
+ concatMapStringsSep ", " (a: a.name) badAccounts;
|
||||
};
|
||||
in [
|
||||
(checkAccounts (a: a.maildir == null) "maildir configuration")
|
||||
(checkAccounts (a: a.imap == null) "IMAP configuration")
|
||||
(checkAccounts (a: a.passwordCommand == null) "password command")
|
||||
(checkAccounts (a: a.userName == null) "username")
|
||||
];
|
||||
|
||||
systemd.user.services =
|
||||
listToAttrs (map genAccountUnit imapnotifyAccounts);
|
||||
systemd.user.services = listToAttrs (map genAccountUnit imapnotifyAccounts);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,9 +7,7 @@ let
|
|||
cfg = config.services.kdeconnect;
|
||||
package = pkgs.kdeconnect;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.adisbladis ];
|
||||
|
||||
options = {
|
||||
|
@ -31,14 +29,13 @@ in
|
|||
|
||||
systemd.user.services.kdeconnect = {
|
||||
Unit = {
|
||||
Description = "Adds communication between your desktop and your smartphone";
|
||||
Description =
|
||||
"Adds communication between your desktop and your smartphone";
|
||||
After = [ "graphical-session-pre.target" ];
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
Environment = "PATH=${config.home.profileDirectory}/bin";
|
||||
|
@ -52,16 +49,16 @@ in
|
|||
systemd.user.services.kdeconnect-indicator = {
|
||||
Unit = {
|
||||
Description = "kdeconnect-indicator";
|
||||
After = [ "graphical-session-pre.target"
|
||||
"polybar.service"
|
||||
"taffybar.service"
|
||||
"stalonetray.service" ];
|
||||
After = [
|
||||
"graphical-session-pre.target"
|
||||
"polybar.service"
|
||||
"taffybar.service"
|
||||
"stalonetray.service"
|
||||
];
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
Environment = "PATH=${config.home.profileDirectory}/bin";
|
||||
|
|
|
@ -13,19 +13,15 @@ with lib;
|
|||
|
||||
config = mkIf config.services.keepassx.enable {
|
||||
systemd.user.services.keepassx = {
|
||||
Unit = {
|
||||
Description = "KeePassX password manager";
|
||||
After = [ "graphical-session-pre.target" ];
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
Unit = {
|
||||
Description = "KeePassX password manager";
|
||||
After = [ "graphical-session-pre.target" ];
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
ExecStart = "${pkgs.keepassx}/bin/keepassx -min -lock";
|
||||
};
|
||||
Service = { ExecStart = "${pkgs.keepassx}/bin/keepassx -min -lock"; };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,14 +6,10 @@ let
|
|||
|
||||
cfg = config.services.lorri;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.gerschtli ];
|
||||
|
||||
options = {
|
||||
services.lorri.enable = mkEnableOption "lorri build daemon";
|
||||
};
|
||||
options = { services.lorri.enable = mkEnableOption "lorri build daemon"; };
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
home.packages = [ pkgs.lorri ];
|
||||
|
@ -33,25 +29,22 @@ in
|
|||
ProtectSystem = "strict";
|
||||
ProtectHome = "read-only";
|
||||
Restart = "on-failure";
|
||||
Environment =
|
||||
let path = with pkgs; makeSearchPath "bin" [ nix gitMinimal gnutar gzip ];
|
||||
in "PATH=${path}";
|
||||
Environment = let
|
||||
path = with pkgs;
|
||||
makeSearchPath "bin" [ nix gitMinimal gnutar gzip ];
|
||||
in "PATH=${path}";
|
||||
};
|
||||
};
|
||||
|
||||
sockets.lorri = {
|
||||
Unit = {
|
||||
Description = "Socket for lorri build daemon";
|
||||
};
|
||||
Unit = { Description = "Socket for lorri build daemon"; };
|
||||
|
||||
Socket = {
|
||||
ListenStream = "%t/lorri/daemon.socket";
|
||||
RuntimeDirectory = "lorri";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "sockets.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "sockets.target" ]; };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -6,14 +6,10 @@ let
|
|||
|
||||
cfg = config.services.mbsync;
|
||||
|
||||
mbsyncOptions =
|
||||
[ "--all"
|
||||
] ++ optional (cfg.verbose) "--verbose"
|
||||
++ optional (cfg.configFile != null) "--config ${cfg.configFile}";
|
||||
mbsyncOptions = [ "--all" ] ++ optional (cfg.verbose) "--verbose"
|
||||
++ optional (cfg.configFile != null) "--config ${cfg.configFile}";
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.pjones ];
|
||||
|
||||
options.services.mbsync = {
|
||||
|
@ -81,30 +77,28 @@ in
|
|||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.user.services.mbsync = {
|
||||
Unit = {
|
||||
Description = "mbsync mailbox synchronization";
|
||||
};
|
||||
Unit = { Description = "mbsync mailbox synchronization"; };
|
||||
|
||||
Service = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${cfg.package}/bin/mbsync ${concatStringsSep " " mbsyncOptions}";
|
||||
} // (optionalAttrs (cfg.postExec != null) { ExecStartPost = cfg.postExec; })
|
||||
// (optionalAttrs (cfg.preExec != null) { ExecStartPre = cfg.preExec; });
|
||||
ExecStart =
|
||||
"${cfg.package}/bin/mbsync ${concatStringsSep " " mbsyncOptions}";
|
||||
} // (optionalAttrs (cfg.postExec != null) {
|
||||
ExecStartPost = cfg.postExec;
|
||||
}) // (optionalAttrs (cfg.preExec != null) {
|
||||
ExecStartPre = cfg.preExec;
|
||||
});
|
||||
};
|
||||
|
||||
systemd.user.timers.mbsync = {
|
||||
Unit = {
|
||||
Description = "mbsync mailbox synchronization";
|
||||
};
|
||||
Unit = { Description = "mbsync mailbox synchronization"; };
|
||||
|
||||
Timer = {
|
||||
OnCalendar = cfg.frequency;
|
||||
Unit = "mbsync.service";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "timers.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "timers.target" ]; };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -9,11 +9,11 @@ let
|
|||
toIni = generators.toINI {
|
||||
mkKeyValue = key: value:
|
||||
let
|
||||
value' =
|
||||
if isBool value then (if value then "True" else "False")
|
||||
else toString value;
|
||||
in
|
||||
"${key} = ${value'}";
|
||||
value' = if isBool value then
|
||||
(if value then "True" else "False")
|
||||
else
|
||||
toString value;
|
||||
in "${key} = ${value'}";
|
||||
};
|
||||
|
||||
mpdris2Conf = {
|
||||
|
@ -29,9 +29,7 @@ let
|
|||
};
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.pjones ];
|
||||
|
||||
options.services.mpdris2 = {
|
||||
|
@ -76,19 +74,15 @@ in
|
|||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions = [
|
||||
{
|
||||
assertion = config.services.mpd.enable;
|
||||
message = "The mpdris2 module requires 'services.mpd.enable = true'.";
|
||||
}
|
||||
];
|
||||
assertions = [{
|
||||
assertion = config.services.mpd.enable;
|
||||
message = "The mpdris2 module requires 'services.mpd.enable = true'.";
|
||||
}];
|
||||
|
||||
xdg.configFile."mpDris2/mpDris2.conf".text = toIni mpdris2Conf;
|
||||
|
||||
systemd.user.services.mpdris2 = {
|
||||
Install = {
|
||||
WantedBy = [ "default.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "default.target" ]; };
|
||||
|
||||
Unit = {
|
||||
Description = "MPRIS 2 support for MPD";
|
||||
|
|
|
@ -150,23 +150,21 @@ in {
|
|||
};
|
||||
|
||||
config = let
|
||||
mapRemotes = gen: with attrsets; mapAttrs'
|
||||
mapRemotes = gen:
|
||||
with attrsets;
|
||||
mapAttrs'
|
||||
(name: remoteCfg: nameValuePair "muchsync-${name}" (gen name remoteCfg))
|
||||
cfg.remotes;
|
||||
in mkIf (cfg.remotes != { }) {
|
||||
assertions = [
|
||||
{
|
||||
assertion = config.programs.notmuch.enable;
|
||||
message = ''
|
||||
The muchsync module requires 'programs.notmuch.enable = true'.
|
||||
'';
|
||||
}
|
||||
];
|
||||
assertions = [{
|
||||
assertion = config.programs.notmuch.enable;
|
||||
message = ''
|
||||
The muchsync module requires 'programs.notmuch.enable = true'.
|
||||
'';
|
||||
}];
|
||||
|
||||
systemd.user.services = mapRemotes (name: remoteCfg: {
|
||||
Unit = {
|
||||
Description = "muchsync sync service (${name})";
|
||||
};
|
||||
Unit = { Description = "muchsync sync service (${name})"; };
|
||||
Service = {
|
||||
CPUSchedulingPolicy = "idle";
|
||||
IOSchedulingClass = "idle";
|
||||
|
@ -175,8 +173,7 @@ in {
|
|||
''"NOTMUCH_CONFIG=${config.home.sessionVariables.NOTMUCH_CONFIG}"''
|
||||
''"NMBGIT=${config.home.sessionVariables.NMBGIT}"''
|
||||
];
|
||||
ExecStart = concatStringsSep " " (
|
||||
[ "${pkgs.muchsync}/bin/muchsync" ]
|
||||
ExecStart = concatStringsSep " " ([ "${pkgs.muchsync}/bin/muchsync" ]
|
||||
++ [ "-s ${escapeShellArg remoteCfg.sshCommand}" ]
|
||||
++ optional (!remoteCfg.upload) "--noup"
|
||||
|
||||
|
@ -187,25 +184,20 @@ in {
|
|||
# remote configuration
|
||||
++ [ (escapeShellArg remoteCfg.remote.host) ]
|
||||
++ optional (remoteCfg.remote.muchsyncPath != "")
|
||||
"-r ${escapeShellArg remoteCfg.remote.muchsyncPath}"
|
||||
"-r ${escapeShellArg remoteCfg.remote.muchsyncPath}"
|
||||
++ optional remoteCfg.remote.checkForModifiedFiles "-F"
|
||||
++ optional (!remoteCfg.remote.importNew) "--nonew"
|
||||
);
|
||||
++ optional (!remoteCfg.remote.importNew) "--nonew");
|
||||
};
|
||||
});
|
||||
|
||||
systemd.user.timers = mapRemotes (name: remoteCfg: {
|
||||
Unit = {
|
||||
Description = "muchsync periodic sync (${name})";
|
||||
};
|
||||
Unit = { Description = "muchsync periodic sync (${name})"; };
|
||||
Timer = {
|
||||
Unit = "muchsync-${name}.service";
|
||||
OnCalendar = remoteCfg.frequency;
|
||||
Persistent = true;
|
||||
};
|
||||
Install = {
|
||||
WantedBy = [ "timers.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "timers.target" ]; };
|
||||
});
|
||||
};
|
||||
}
|
||||
|
|
|
@ -6,9 +6,7 @@ let
|
|||
|
||||
cfg = config.services.network-manager-applet;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.rycee ];
|
||||
|
||||
options = {
|
||||
|
@ -25,17 +23,13 @@ in
|
|||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
ExecStart = toString (
|
||||
[
|
||||
"${pkgs.networkmanagerapplet}/bin/nm-applet"
|
||||
"--sm-disable"
|
||||
] ++ optional config.xsession.preferStatusNotifierItems "--indicator"
|
||||
);
|
||||
ExecStart = toString
|
||||
([ "${pkgs.networkmanagerapplet}/bin/nm-applet" "--sm-disable" ]
|
||||
++ optional config.xsession.preferStatusNotifierItems
|
||||
"--indicator");
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -4,9 +4,7 @@ with lib;
|
|||
|
||||
{
|
||||
options = {
|
||||
services.nextcloud-client = {
|
||||
enable = mkEnableOption "Nextcloud Client";
|
||||
};
|
||||
services.nextcloud-client = { enable = mkEnableOption "Nextcloud Client"; };
|
||||
};
|
||||
|
||||
config = mkIf config.services.nextcloud-client.enable {
|
||||
|
@ -22,9 +20,7 @@ with lib;
|
|||
ExecStart = "${pkgs.nextcloud-client}/bin/nextcloud";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -4,9 +4,7 @@ with lib;
|
|||
|
||||
{
|
||||
options = {
|
||||
services.owncloud-client = {
|
||||
enable = mkEnableOption "Owncloud Client";
|
||||
};
|
||||
services.owncloud-client = { enable = mkEnableOption "Owncloud Client"; };
|
||||
};
|
||||
|
||||
config = mkIf config.services.owncloud-client.enable {
|
||||
|
@ -22,9 +20,7 @@ with lib;
|
|||
ExecStart = "${pkgs.owncloud-client}/bin/owncloud";
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -7,15 +7,11 @@ let
|
|||
cfg = config.services.parcellite;
|
||||
package = pkgs.parcellite;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
in {
|
||||
meta.maintainers = [ maintainers.gleber ];
|
||||
|
||||
options = {
|
||||
services.parcellite = {
|
||||
enable = mkEnableOption "Parcellite";
|
||||
};
|
||||
services.parcellite = { enable = mkEnableOption "Parcellite"; };
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
|
@ -28,9 +24,7 @@ in
|
|||
PartOf = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
Install = {
|
||||
WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||
|
||||
Service = {
|
||||
ExecStart = "${package}/bin/parcellite";
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue