aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Cassou <damien@cassou.me>2020-09-09 08:50:32 +0200
committerRobert Helgesson <robert@rycee.net>2020-09-13 20:52:08 +0200
commit472ca211cac604efdf621337067a237be9df389e (patch)
tree51f3580baecce831fa2444bc0e505cb4256c3a3a
parent812b64d4d3c243bf7b6d08e9d210750f53e39e22 (diff)
man: support building manual page index cache
The apropos software is useful to get a list of manpages matching a description or to get a list of all manpages. The latter feature is used by Emacs to get manpage completion (`M-x man`). To have apropos working, a database of all available manpages must be built with mandb. This is what this commits does. A similar change was done for NixOS: https://github.com/NixOS/nixpkgs/commit/edc6a76cc025ef972979dad6692e0fd5d5cfcbbb
-rw-r--r--modules/misc/news.nix9
-rw-r--r--modules/programs/man.nix48
-rw-r--r--tests/default.nix1
-rw-r--r--tests/modules/programs/man/apropos.nix22
-rw-r--r--tests/modules/programs/man/default.nix4
-rw-r--r--tests/modules/programs/man/no-manpath.nix13
6 files changed, 97 insertions, 0 deletions
diff --git a/modules/misc/news.nix b/modules/misc/news.nix
index 7fdbdd69df9..b031af99685 100644
--- a/modules/misc/news.nix
+++ b/modules/misc/news.nix
@@ -1664,6 +1664,15 @@ in
available in menus.
'';
}
+
+ {
+ time = "2020-09-09T06:54:59+00:00";
+ condition = config.programs.man.enable;
+ message = ''
+ A new option 'programs.man.generateCaches' was added to
+ support the apropos command.
+ '';
+ }
];
};
}
diff --git a/modules/programs/man.nix b/modules/programs/man.nix
index 2968ccf4845..b235b02fe2d 100644
--- a/modules/programs/man.nix
+++ b/modules/programs/man.nix
@@ -14,11 +14,59 @@ with lib;
<literal>home.packages</literal>.
'';
};
+
+ generateCaches = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to generate the manual page index caches using
+ <citerefentry>
+ <refentrytitle>mandb</refentrytitle>
+ <manvolnum>8</manvolnum>
+ </citerefentry>. This allows searching for a page or
+ keyword using utilities like <citerefentry>
+ <refentrytitle>apropos</refentrytitle>
+ <manvolnum>1</manvolnum>
+ </citerefentry>.
+ </para><para>
+ This feature is disabled by default because it slows down
+ building. If you don't mind waiting a few more seconds when
+ Home Manager builds a new generation, you may safely enable
+ this option.
+ '';
+ };
};
};
config = mkIf config.programs.man.enable {
home.packages = [ pkgs.man ];
home.extraOutputsToInstall = [ "man" ];
+
+ # This is mostly copy/pasted/adapted from NixOS' documentation.nix.
+ home.file = mkIf config.programs.man.generateCaches {
+ ".manpath".text = let
+ # Generate a directory containing installed packages' manpages.
+ manualPages = pkgs.buildEnv {
+ name = "man-paths";
+ paths = config.home.packages;
+ pathsToLink = [ "/share/man" ];
+ extraOutputsToInstall = [ "man" ];
+ ignoreCollisions = true;
+ };
+
+ # Generate a database of all manpages in ${manualPages}.
+ manualCache = pkgs.runCommandLocal "man-cache" { } ''
+ # Generate a temporary man.conf so mandb knows where to
+ # write cache files.
+ echo "MANDB_MAP ${manualPages}/share/man $out" > man.conf
+
+ # Run mandb to generate cache files:
+ ${pkgs.man-db}/bin/mandb -C man.conf --no-straycats --create \
+ ${manualPages}/share/man
+ '';
+ in ''
+ MANDB_MAP ${config.home.profileDirectory}/share/man ${manualCache}
+ '';
+ };
};
}
diff --git a/tests/default.nix b/tests/default.nix
index b44e4185fcc..fc294206f76 100644
--- a/tests/default.nix
+++ b/tests/default.nix
@@ -52,6 +52,7 @@ import nmt {
./modules/programs/kakoune
./modules/programs/lf
./modules/programs/lieer
+ ./modules/programs/man
./modules/programs/mbsync
./modules/programs/ncmpcpp
./modules/programs/ne
diff --git a/tests/modules/programs/man/apropos.nix b/tests/modules/programs/man/apropos.nix
new file mode 100644
index 00000000000..a8ec35ead92
--- /dev/null
+++ b/tests/modules/programs/man/apropos.nix
@@ -0,0 +1,22 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+ config = {
+ programs.man = {
+ enable = true;
+ generateCaches = true;
+ };
+
+ nmt.script = ''
+ assertFileExists home-files/.manpath
+
+ CACHE_DIR=$(cat $TESTED/home-files/.manpath | cut --delimiter=' ' --fields=3)
+
+ if [[ ! -f "$CACHE_DIR/index.bt" ]]; then
+ fail "Expected man cache files to exist (in $CACHE_DIR) but they were not found."
+ fi
+ '';
+ };
+}
diff --git a/tests/modules/programs/man/default.nix b/tests/modules/programs/man/default.nix
new file mode 100644
index 00000000000..2e9d340f98d
--- /dev/null
+++ b/tests/modules/programs/man/default.nix
@@ -0,0 +1,4 @@
+{
+ man-apropos = ./apropos.nix;
+ man-no-manpath = ./no-manpath.nix;
+}
diff --git a/tests/modules/programs/man/no-manpath.nix b/tests/modules/programs/man/no-manpath.nix
new file mode 100644
index 00000000000..1b8cfb40c6e
--- /dev/null
+++ b/tests/modules/programs/man/no-manpath.nix
@@ -0,0 +1,13 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+ config = {
+ programs.man = { enable = true; };
+
+ nmt.script = ''
+ assertPathNotExists home-files/.manpath
+ '';
+ };
+}