1
0
mirror of https://github.com/nix-community/home-manager synced 2024-07-01 02:48:30 +02:00

Merge branch 'add/xdg'

This commit is contained in:
Robert Helgesson 2017-10-29 02:00:28 +02:00
commit f55fbe037a
No known key found for this signature in database
GPG Key ID: C3DB11069E65DC86
13 changed files with 180 additions and 15 deletions

View File

@ -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"

View File

@ -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

View File

@ -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>

View File

@ -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;
} }
); );
} }

View File

@ -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
View 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;
}
];
}

View File

@ -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;
}; };
} }

View File

@ -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)}

View File

@ -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;

View File

@ -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}

View File

@ -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;
}) })
] ]
); );

View File

@ -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 = {

View File

@ -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)
++ ++