diff --git a/share/functions/__fish_apropos.fish b/share/functions/__fish_apropos.fish index d8b203654..fb1e0196e 100644 --- a/share/functions/__fish_apropos.fish +++ b/share/functions/__fish_apropos.fish @@ -4,39 +4,49 @@ if not type -q apropos exit end -function __fish_apropos - # macOS 10.15 "Catalina" has some major issues. - # The whatis database is non-existent, so apropos tries (and fails) to create it every time, - # which takes about half a second. - # - # Instead, we build a whatis database in the user cache directory - # and override the MANPATH using that directory before we run `apropos` - # - # the cache is rebuilt once a day - if test (uname) = Darwin - set -l cache $HOME/.cache/fish/ - if test -n "$XDG_CACHE_HOME" - set cache $XDG_CACHE_HOME/fish - end +# Check for macOS Catalina or above. This is Darwin 19.x or above. See unames reported here: +# https://en.wikipedia.org/wiki/Darwin_(operating_system) +set -l sysver (uname -sr | string match -r "(Darwin) (\d\d)"\.) - set -l db $cache/whatis +test $status -eq 0 -a (count $sysver) -eq 3 +and if test $sysver[2] = 'Darwin' -a $sysver[3] -ge 19 + + if test -n "$XDG_CACHE_HOME" + set dir $XDG_CACHE_HOME/fish + else + set dir (getconf DARWIN_USER_CACHE_DIR)"fish" + end + + function __fish_apropos -V dir + # macOS 10.15 "Catalina" has a read only filesystem where the whatis database should be. + # The whatis database is non-existent, so apropos tries (and fails) to create it every time, + # which can take seconds. + # + # Instead, we build a whatis database in the user cache directory + # and override the MANPATH using that directory before we run `apropos` + # + # the cache is rebuilt once a week. + set -l whatis $cache/whatis set -l max_age 86400 # one day set -l age $max_age - if test -f "$db" + if test -f "$whatis" # Some people use GNU tools on macOS, and GNU stat works differently. # However it's currently guaranteed that the macOS stat is in /usr/bin, # so we use that explicitly. - set age (math (date +%s) - (/usr/bin/stat -f %m $db)) + set age (math (date +%s) - (/usr/bin/stat -f %m $whatis)) end - MANPATH="$cache" apropos -- $argv + MANPATH="$dir" apropos $argv if test $age -ge $max_age - mkdir -m 700 -p $cache - /usr/libexec/makewhatis -o $db (man --path | string split :) >/dev/null 2>&1 /dev/null 2>&1