aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/programs/info.nix
diff options
context:
space:
mode:
Diffstat (limited to 'home-manager/modules/programs/info.nix')
-rw-r--r--home-manager/modules/programs/info.nix78
1 files changed, 78 insertions, 0 deletions
diff --git a/home-manager/modules/programs/info.nix b/home-manager/modules/programs/info.nix
new file mode 100644
index 00000000000..93dcaf474af
--- /dev/null
+++ b/home-manager/modules/programs/info.nix
@@ -0,0 +1,78 @@
+# info.nix -- install texinfo, set INFOPATH, create `dir` file
+
+# This is a helper for the GNU info documentation system. By default,
+# the `info` command (and the Info subsystem within Emacs) gives easy
+# access to the info files stored system-wide, but not info files in
+# your ~/.nix-profile.
+
+# We set $INFOPATH to include `/run/current-system/sw/share/info` and
+# `~/.nix-profile/share/info` but it's not enough. Although info can
+# then find files when you explicitly ask for them, it doesn't show
+# them to you in the table of contents on startup. To do that requires
+# a `dir` file. NixOS keeps the system-wide `dir` file up to date, but
+# ignores home-installed packages.
+
+# So this module contains an activation script that generates the
+# `dir` for your home profile. Then when you start info (and both
+# `dir` files are in your $INFOPATH), it will *merge* the contents of
+# the two files, showing you a unified table of contents for all
+# packages. This is really nice.
+
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.programs.info;
+
+ dag = config.lib.dag;
+
+ # Indexes info files found in this location
+ homeInfoPath = "${config.home.profileDirectory}/share/info";
+
+ # Installs this package -- the interactive just means that it
+ # includes the curses `info` program. We also use `install-info`
+ # from this package in the activation script.
+ infoPkg = pkgs.texinfoInteractive;
+
+in
+
+{
+ options = {
+ programs.info = {
+ enable = mkEnableOption "GNU Info";
+
+ homeInfoDirLocation = mkOption {
+ default = "\${XDG_CACHE_HOME:-$HOME/.cache}/info";
+ description = ''
+ Directory in which to store the info <filename>dir</filename>
+ file within your home.
+ '';
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ home.sessionVariables.INFOPATH =
+ "${cfg.homeInfoDirLocation}\${INFOPATH:+:}\${INFOPATH}";
+
+ home.activation.createHomeInfoDir = 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 ];
+
+ home.extraOutputsToInstall = [ "info" ];
+ };
+}