From a6a0d43c9c211ad35d379a62b24da1c9b8c1d57e Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 1 Oct 2020 15:04:11 +0200 Subject: [PATCH] Better __fish_describe_command for Macos override MANPATH used by apropos with local whatis database and update it once a day get rid of xargs Created __fish_apropos and fixed __fish_complete_man to use that as well moved macos apropos comment --- share/functions/__fish_apropos.fish | 39 ++++++++++++++++++++ share/functions/__fish_complete_man.fish | 21 +---------- share/functions/__fish_describe_command.fish | 18 +-------- 3 files changed, 41 insertions(+), 37 deletions(-) create mode 100644 share/functions/__fish_apropos.fish diff --git a/share/functions/__fish_apropos.fish b/share/functions/__fish_apropos.fish new file mode 100644 index 000000000..dd04ed31b --- /dev/null +++ b/share/functions/__fish_apropos.fish @@ -0,0 +1,39 @@ +if not type -q apropos + function __fish_apropos + end + 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 + + set -l db $cache/whatis + set -l max_age 86400 # one day + set -l age $max_age + + if test -f $db + set age (math (date +%s) - (stat -f %m $db)) + end + + if test $age -ge $max_age + echo "making cache $age $max_age" + mkdir -m 700 -p $cache + /usr/libexec/makewhatis -o $db (man --path | string split :) >/dev/null 2>&1 + end + MANPATH="$cache" apropos $argv + else + apropos $argv + end +end \ No newline at end of file diff --git a/share/functions/__fish_complete_man.fish b/share/functions/__fish_complete_man.fish index 2eafde97e..057b298c0 100644 --- a/share/functions/__fish_complete_man.fish +++ b/share/functions/__fish_complete_man.fish @@ -1,22 +1,3 @@ -# 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. -# -# So we disable this entirely in that case, unless the user has overridden the system -# `apropos` with their own, which presumably doesn't have the same problem. -if test (uname) = Darwin - set -l darwin_version (uname -r | string split .) - # macOS 15 is Darwin 19, this is an issue up to and including 10.15.3. - if test "$darwin_version[1]" = 19 -a "$darwin_version[2]" -le 3 - set -l apropos (command -s apropos) - if test "$apropos" = /usr/bin/apropos - function __fish_complete_man - end - # (remember: exit when `source`ing only exits the file, not the shell) - exit - end - end -end function __fish_complete_man # Try to guess what section to search in. If we don't know, we @@ -51,7 +32,7 @@ function __fish_complete_man if test -n "$token" # Do the actual search - apropos $token 2>/dev/null | awk ' + __fish_apropos $token 2>/dev/null | awk ' BEGIN { FS="[\t ]- "; OFS="\t"; } # BSD/Darwin /^[^( \t]+\('$section'\)/ { diff --git a/share/functions/__fish_describe_command.fish b/share/functions/__fish_describe_command.fish index 7dfcaa166..1bd604ff4 100644 --- a/share/functions/__fish_describe_command.fish +++ b/share/functions/__fish_describe_command.fish @@ -2,22 +2,6 @@ # This function is used internally by the fish command completion code # -# 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. -# -# So we disable this entirely in that case. -if test (uname) = Darwin - set -l darwin_version (uname -r | string split .) - # macOS 15 is Darwin 19, this is an issue up to and including 10.15.3. - if test "$darwin_version[1]" = 19 -a "$darwin_version[2]" -le 3 - function __fish_describe_command - end - # (remember: exit when `source`ing only exits the file, not the shell) - exit - end -end - # Perform this check once at startup rather than on each invocation if not type -q apropos function __fish_describe_command @@ -28,7 +12,7 @@ end function __fish_describe_command -d "Command used to find descriptions for commands" # $argv will be inserted directly into the awk regex, so it must be escaped set -l argv_regex (string escape --style=regex "$argv") - apropos $argv 2>/dev/null | awk -v FS=" +- +" '{ + __fish_apropos $argv 2>/dev/null | awk -v FS=" +- +" '{ split($1, names, ", "); for (name in names) if (names[name] ~ /^'"$argv_regex"'.* *\([18]\)/ ) {