mirror of
https://github.com/nix-community/home-manager
synced 2024-11-30 06:59:45 +01:00
Merge branch 'add/xdg'
This commit is contained in:
commit
f55fbe037a
13 changed files with 180 additions and 15 deletions
|
@ -26,8 +26,9 @@ function setConfigFile() {
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
local defaultConfFile="${XDG_CONFIG_HOME:-$HOME/.config}/nixpkgs/home.nix"
|
||||||
local confFile
|
local confFile
|
||||||
for confFile in "$HOME/.config/nixpkgs/home.nix" \
|
for confFile in "$defaultConfFile" \
|
||||||
"$HOME/.nixpkgs/home.nix" ; do
|
"$HOME/.nixpkgs/home.nix" ; do
|
||||||
if [[ -e "$confFile" ]] ; then
|
if [[ -e "$confFile" ]] ; then
|
||||||
HOME_MANAGER_CONFIG="$confFile"
|
HOME_MANAGER_CONFIG="$confFile"
|
||||||
|
@ -36,14 +37,14 @@ function setConfigFile() {
|
||||||
done
|
done
|
||||||
|
|
||||||
errorEcho "No configuration file found." \
|
errorEcho "No configuration file found." \
|
||||||
"Please create one at ~/.config/nixpkgs/home.nix"
|
"Please create one at $defaultConfFile"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
function setHomeManagerNixPath() {
|
function setHomeManagerNixPath() {
|
||||||
local path
|
local path
|
||||||
for path in "@HOME_MANAGER_PATH@" \
|
for path in "@HOME_MANAGER_PATH@" \
|
||||||
"$HOME/.config/nixpkgs/home-manager" \
|
"${XDG_CONFIG_HOME:-$HOME/.config}/nixpkgs/home-manager" \
|
||||||
"$HOME/.nixpkgs/home-manager" ; do
|
"$HOME/.nixpkgs/home-manager" ; do
|
||||||
if [[ -e "$path" || "$path" =~ ^https?:// ]] ; then
|
if [[ -e "$path" || "$path" =~ ^https?:// ]] ; then
|
||||||
export NIX_PATH="$NIX_PATH${NIX_PATH:+:}home-manager=$path"
|
export NIX_PATH="$NIX_PATH${NIX_PATH:+:}home-manager=$path"
|
||||||
|
|
|
@ -19,6 +19,7 @@ let
|
||||||
./misc/news.nix
|
./misc/news.nix
|
||||||
./misc/nixpkgs.nix
|
./misc/nixpkgs.nix
|
||||||
./misc/pam.nix
|
./misc/pam.nix
|
||||||
|
./misc/xdg.nix
|
||||||
./programs/bash.nix
|
./programs/bash.nix
|
||||||
./programs/beets.nix
|
./programs/beets.nix
|
||||||
./programs/browserpass.nix
|
./programs/browserpass.nix
|
||||||
|
|
|
@ -29,7 +29,7 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enableProfileFonts {
|
config = mkIf cfg.enableProfileFonts {
|
||||||
home.file.".config/fontconfig/conf.d/10-nix-profile-fonts.conf".text = ''
|
xdg.configFile."fontconfig/conf.d/10-nix-profile-fonts.conf".text = ''
|
||||||
<?xml version='1.0'?>
|
<?xml version='1.0'?>
|
||||||
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
|
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
|
||||||
<fontconfig>
|
<fontconfig>
|
||||||
|
|
|
@ -124,10 +124,10 @@ in
|
||||||
mapAttrsToList formatGtk2Option ini
|
mapAttrsToList formatGtk2Option ini
|
||||||
) + "\n" + cfg2.extraConfig;
|
) + "\n" + cfg2.extraConfig;
|
||||||
|
|
||||||
home.file.".config/gtk-3.0/settings.ini".text =
|
xdg.configFile."gtk-3.0/settings.ini".text =
|
||||||
toGtk3Ini { Settings = ini // cfg3.extraConfig; };
|
toGtk3Ini { Settings = ini // cfg3.extraConfig; };
|
||||||
|
|
||||||
home.file.".config/gtk-3.0/gtk.css".text = cfg3.extraCss;
|
xdg.configFile."gtk-3.0/gtk.css".text = cfg3.extraCss;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -422,6 +422,31 @@ in
|
||||||
commands run outside Home Manager.
|
commands run outside Home Manager.
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
time = "2017-10-28T23:39:55+00:00";
|
||||||
|
message = ''
|
||||||
|
A new module is available: 'xdg'.
|
||||||
|
|
||||||
|
If enabled, this module allows configuration of the XDG base
|
||||||
|
directory paths.
|
||||||
|
|
||||||
|
Whether the module is enabled or not, it also offers the
|
||||||
|
option 'xdg.configFile', which acts much like 'home.file'
|
||||||
|
except the target path is relative to the XDG configuration
|
||||||
|
directory. That is, unless `XDG_CONFIG_HOME` is configured
|
||||||
|
otherwise, the assignment
|
||||||
|
|
||||||
|
xdg.configFile.hello.text = "hello world";
|
||||||
|
|
||||||
|
will result in a file '$HOME/.config/hello'.
|
||||||
|
|
||||||
|
Most modules in Home Manager that previously were hard coded
|
||||||
|
to write configuration to '$HOME/.config' now use this
|
||||||
|
option and will therefore honor the XDG configuration
|
||||||
|
directory.
|
||||||
|
'';
|
||||||
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
138
modules/misc/xdg.nix
Normal file
138
modules/misc/xdg.nix
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
{ options, config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
cfg = config.xdg;
|
||||||
|
|
||||||
|
fileType = basePath: (types.loaOf (types.submodule (
|
||||||
|
{ name, config, ... }: {
|
||||||
|
options = {
|
||||||
|
target = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
apply = p: "${cfg.configHome}/${p}";
|
||||||
|
description = ''
|
||||||
|
Path to target file relative to <varname>${basePath}</varname>.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
text = mkOption {
|
||||||
|
default = null;
|
||||||
|
type = types.nullOr types.lines;
|
||||||
|
description = "Text of the file.";
|
||||||
|
};
|
||||||
|
|
||||||
|
source = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
description = ''
|
||||||
|
Path of the source file. The file name must not start
|
||||||
|
with a period since Nix will not allow such names in
|
||||||
|
the Nix store.
|
||||||
|
</para><para>
|
||||||
|
This may refer to a directory.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
executable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Whether the file should be executable.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
target = mkDefault name;
|
||||||
|
source = mkIf (config.text != null) (
|
||||||
|
let
|
||||||
|
file = pkgs.writeTextFile {
|
||||||
|
inherit (config) text executable;
|
||||||
|
name = "user-etc-" + baseNameOf name;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
mkDefault file
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)));
|
||||||
|
|
||||||
|
defaultCacheHome = "${config.home.homeDirectory}/.cache";
|
||||||
|
defaultConfigHome = "${config.home.homeDirectory}/.config";
|
||||||
|
defaultDataHome = "${config.home.homeDirectory}/.local/share";
|
||||||
|
|
||||||
|
getXdgDir = name: fallback:
|
||||||
|
let
|
||||||
|
value = builtins.getEnv name;
|
||||||
|
in
|
||||||
|
if value != "" then value else fallback;
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
options.xdg = {
|
||||||
|
enable = mkEnableOption "management of XDG base directories";
|
||||||
|
|
||||||
|
cacheHome = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
defaultText = "~/.cache";
|
||||||
|
description = ''
|
||||||
|
Absolute path to directory holding application caches.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
configFile = mkOption {
|
||||||
|
type = fileType "xdg.configHome";
|
||||||
|
default = {};
|
||||||
|
description = ''
|
||||||
|
Attribute set of files to link into the user's XDG
|
||||||
|
configuration home.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
configHome = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
defaultText = "~/.config";
|
||||||
|
description = ''
|
||||||
|
Absolute path to directory holding application configurations.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
dataHome = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
defaultText = "~/.local/share";
|
||||||
|
description = ''
|
||||||
|
Absolute path to directory holding application data.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkMerge [
|
||||||
|
(mkIf cfg.enable {
|
||||||
|
xdg.cacheHome = mkDefault defaultCacheHome;
|
||||||
|
xdg.configHome = mkDefault defaultConfigHome;
|
||||||
|
xdg.dataHome = mkDefault defaultDataHome;
|
||||||
|
|
||||||
|
home.sessionVariables = {
|
||||||
|
XDG_CACHE_HOME = cfg.cacheHome;
|
||||||
|
XDG_CONFIG_HOME = cfg.configHome;
|
||||||
|
XDG_DATA_HOME = cfg.dataHome;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkIf (!cfg.enable) {
|
||||||
|
xdg.cacheHome = getXdgDir "XDG_CACHE_HOME" defaultCacheHome;
|
||||||
|
xdg.configHome = getXdgDir "XDG_CONFIG_HOME" defaultConfigHome;
|
||||||
|
xdg.dataHome = getXdgDir "XDG_DATA_HOME" defaultDataHome;
|
||||||
|
})
|
||||||
|
|
||||||
|
{
|
||||||
|
home.file =
|
||||||
|
let
|
||||||
|
f = n: v: {
|
||||||
|
inherit (v) source target;
|
||||||
|
mode = if v.executable then "777" else "444";
|
||||||
|
};
|
||||||
|
in mapAttrsToList f cfg.configFile;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
|
@ -27,7 +27,7 @@ in
|
||||||
config = mkIf (cfg.settings != {}) {
|
config = mkIf (cfg.settings != {}) {
|
||||||
home.packages = [ pkgs.beets ];
|
home.packages = [ pkgs.beets ];
|
||||||
|
|
||||||
home.file.".config/beets/config.yaml".text =
|
xdg.configFile."beets/config.yaml".text =
|
||||||
builtins.toJSON config.programs.beets.settings;
|
builtins.toJSON config.programs.beets.settings;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ in
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
home.packages = [ pkgs.feh ];
|
home.packages = [ pkgs.feh ];
|
||||||
|
|
||||||
home.file.".config/feh/keys".text = ''
|
xdg.configFile."feh/keys".text = ''
|
||||||
# Disable default keybindings
|
# Disable default keybindings
|
||||||
${concatStringsSep "\n" (mapAttrsToList disableBinding cfg.keybindings)}
|
${concatStringsSep "\n" (mapAttrsToList disableBinding cfg.keybindings)}
|
||||||
|
|
||||||
|
|
|
@ -290,7 +290,7 @@ in
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
home.packages = [ pkgs.htop ];
|
home.packages = [ pkgs.htop ];
|
||||||
|
|
||||||
home.file.".config/htop/htoprc".text = let
|
xdg.configFile."htop/htoprc".text = let
|
||||||
leftMeters = map (m: m.kind) cfg.meters.left;
|
leftMeters = map (m: m.kind) cfg.meters.left;
|
||||||
leftModes = map (m: m.mode) cfg.meters.left;
|
leftModes = map (m: m.mode) cfg.meters.left;
|
||||||
rightMeters = map (m: m.kind) cfg.meters.right;
|
rightMeters = map (m: m.kind) cfg.meters.right;
|
||||||
|
|
|
@ -310,7 +310,7 @@ in
|
||||||
optionalString = name: val: lib.optionalString (val != null) "${name} = ${val}";
|
optionalString = name: val: lib.optionalString (val != null) "${name} = ${val}";
|
||||||
in mkIf cfg.enable {
|
in mkIf cfg.enable {
|
||||||
home.packages = [ pkgs.termite ];
|
home.packages = [ pkgs.termite ];
|
||||||
home.file.".config/termite/config".text = ''
|
xdg.configFile."termite/config".text = ''
|
||||||
[options]
|
[options]
|
||||||
${optionalBoolean "allow_bold" cfg.allowBold}
|
${optionalBoolean "allow_bold" cfg.allowBold}
|
||||||
${optionalBoolean "audible_bell" cfg.audibleBell}
|
${optionalBoolean "audible_bell" cfg.audibleBell}
|
||||||
|
|
|
@ -71,7 +71,7 @@ in
|
||||||
}
|
}
|
||||||
|
|
||||||
(mkIf (cfg.settings != {}) {
|
(mkIf (cfg.settings != {}) {
|
||||||
home.file.".config/dunst/dunstrc".text = toDunstIni cfg.settings;
|
xdg.configFile."dunst/dunstrc".text = toDunstIni cfg.settings;
|
||||||
})
|
})
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
|
@ -111,7 +111,7 @@ in
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
home.packages = [ cfg.package ];
|
home.packages = [ cfg.package ];
|
||||||
home.file.".config/polybar/config".source = configFile;
|
xdg.configFile."polybar/config".source = configFile;
|
||||||
|
|
||||||
systemd.user.services.polybar = {
|
systemd.user.services.polybar = {
|
||||||
Unit = {
|
Unit = {
|
||||||
|
|
|
@ -28,12 +28,12 @@ let
|
||||||
|
|
||||||
wantedBy = target:
|
wantedBy = target:
|
||||||
{
|
{
|
||||||
name = ".config/systemd/user/${target}.wants/${name}.${style}";
|
name = "systemd/user/${target}.wants/${name}.${style}";
|
||||||
value = { inherit source; };
|
value = { inherit source; };
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
singleton {
|
singleton {
|
||||||
name = ".config/systemd/user/${name}.${style}";
|
name = "systemd/user/${name}.${style}";
|
||||||
value = { inherit source; };
|
value = { inherit source; };
|
||||||
}
|
}
|
||||||
++
|
++
|
||||||
|
@ -107,7 +107,7 @@ in
|
||||||
# If we run under a Linux system we assume that systemd is
|
# If we run under a Linux system we assume that systemd is
|
||||||
# available, in particular we assume that systemctl is in PATH.
|
# available, in particular we assume that systemctl is in PATH.
|
||||||
(mkIf pkgs.stdenv.isLinux {
|
(mkIf pkgs.stdenv.isLinux {
|
||||||
home.file =
|
xdg.configFile =
|
||||||
listToAttrs (
|
listToAttrs (
|
||||||
(buildServices "service" cfg.services)
|
(buildServices "service" cfg.services)
|
||||||
++
|
++
|
||||||
|
|
Loading…
Reference in a new issue