aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/programs/info.nix
blob: a7d2692b5155ecb62524a904e0d9d035979c64dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# info.nix -- install texinfo and 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.

# Specifically, 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 files installed in
# user profiles.

# This module contains extra profile commands that generate 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;

  # 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 {
  imports = [
    (mkRemovedOptionModule [ "programs" "info" "homeInfoDirLocation" ] ''
      The `dir` file is now generated as part of the Home Manager profile and
      will no longer be placed in your home directory.
    '')
  ];

  options.programs.info.enable = mkEnableOption "GNU Info";

  config = mkIf cfg.enable {
    home.packages = [
      infoPkg

      # Make sure the target directory is a real directory.
      (pkgs.runCommandLocal "dummy-info-dir1" { } "mkdir -p $out/share/info")
      (pkgs.runCommandLocal "dummy-info-dir2" { } "mkdir -p $out/share/info")
    ];

    home.extraOutputsToInstall = [ "info" ];

    home.extraProfileCommands = let infoPath = "$out/share/info";
    in ''
      if [[ -w "${infoPath}" && ! -e "${infoPath}/dir" ]]; then
        PATH="${lib.makeBinPath [ pkgs.gzip infoPkg ]}''${PATH:+:}$PATH" \
        find -L "${infoPath}" \( -name '*.info' -o -name '*.info.gz' \) \
          -exec install-info '{}' "${infoPath}/dir" ';'
      fi
    '';
  };
}