From 472ca211cac604efdf621337067a237be9df389e Mon Sep 17 00:00:00 2001 From: Damien Cassou Date: Wed, 9 Sep 2020 08:50:32 +0200 Subject: [PATCH] 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 --- modules/misc/news.nix | 9 +++++ modules/programs/man.nix | 48 +++++++++++++++++++++++ tests/default.nix | 1 + tests/modules/programs/man/apropos.nix | 22 +++++++++++ tests/modules/programs/man/default.nix | 4 ++ tests/modules/programs/man/no-manpath.nix | 13 ++++++ 6 files changed, 97 insertions(+) create mode 100644 tests/modules/programs/man/apropos.nix create mode 100644 tests/modules/programs/man/default.nix create mode 100644 tests/modules/programs/man/no-manpath.nix diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 7fdbdd69d..b031af996 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 2968ccf48..b235b02fe 100644 --- a/modules/programs/man.nix +++ b/modules/programs/man.nix @@ -14,11 +14,59 @@ with lib; home.packages. ''; }; + + generateCaches = mkOption { + type = types.bool; + default = false; + description = '' + Whether to generate the manual page index caches using + + mandb + 8 + . This allows searching for a page or + keyword using utilities like + apropos + 1 + . + + 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 b44e4185f..fc294206f 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 000000000..a8ec35ead --- /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 000000000..2e9d340f9 --- /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 000000000..1b8cfb40c --- /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 + ''; + }; +}