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
fi
local defaultConfFile="${XDG_CONFIG_HOME:-$HOME/.config}/nixpkgs/home.nix"
local confFile
for confFile in "$HOME/.config/nixpkgs/home.nix" \
for confFile in "$defaultConfFile" \
"$HOME/.nixpkgs/home.nix" ; do
if [[ -e "$confFile" ]] ; then
HOME_MANAGER_CONFIG="$confFile"
@ -36,14 +37,14 @@ function setConfigFile() {
done
errorEcho "No configuration file found." \
"Please create one at ~/.config/nixpkgs/home.nix"
"Please create one at $defaultConfFile"
exit 1
}
function setHomeManagerNixPath() {
local 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
if [[ -e "$path" || "$path" =~ ^https?:// ]] ; then
export NIX_PATH="$NIX_PATH${NIX_PATH:+:}home-manager=$path"

View file

@ -19,6 +19,7 @@ let
./misc/news.nix
./misc/nixpkgs.nix
./misc/pam.nix
./misc/xdg.nix
./programs/bash.nix
./programs/beets.nix
./programs/browserpass.nix

View file

@ -29,7 +29,7 @@ in
};
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'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>

View file

@ -124,10 +124,10 @@ in
mapAttrsToList formatGtk2Option ini
) + "\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; };
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.
'';
}
{
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 != {}) {
home.packages = [ pkgs.beets ];
home.file.".config/beets/config.yaml".text =
xdg.configFile."beets/config.yaml".text =
builtins.toJSON config.programs.beets.settings;
};
}

View file

@ -30,7 +30,7 @@ in
config = mkIf cfg.enable {
home.packages = [ pkgs.feh ];
home.file.".config/feh/keys".text = ''
xdg.configFile."feh/keys".text = ''
# Disable default keybindings
${concatStringsSep "\n" (mapAttrsToList disableBinding cfg.keybindings)}

View file

@ -290,7 +290,7 @@ in
config = mkIf cfg.enable {
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;
leftModes = map (m: m.mode) cfg.meters.left;
rightMeters = map (m: m.kind) cfg.meters.right;

View file

@ -310,7 +310,7 @@ in
optionalString = name: val: lib.optionalString (val != null) "${name} = ${val}";
in mkIf cfg.enable {
home.packages = [ pkgs.termite ];
home.file.".config/termite/config".text = ''
xdg.configFile."termite/config".text = ''
[options]
${optionalBoolean "allow_bold" cfg.allowBold}
${optionalBoolean "audible_bell" cfg.audibleBell}

View file

@ -71,7 +71,7 @@ in
}
(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 {
home.packages = [ cfg.package ];
home.file.".config/polybar/config".source = configFile;
xdg.configFile."polybar/config".source = configFile;
systemd.user.services.polybar = {
Unit = {

View file

@ -28,12 +28,12 @@ let
wantedBy = target:
{
name = ".config/systemd/user/${target}.wants/${name}.${style}";
name = "systemd/user/${target}.wants/${name}.${style}";
value = { inherit source; };
};
in
singleton {
name = ".config/systemd/user/${name}.${style}";
name = "systemd/user/${name}.${style}";
value = { inherit source; };
}
++
@ -107,7 +107,7 @@ in
# If we run under a Linux system we assume that systemd is
# available, in particular we assume that systemctl is in PATH.
(mkIf pkgs.stdenv.isLinux {
home.file =
xdg.configFile =
listToAttrs (
(buildServices "service" cfg.services)
++