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
This commit is contained in:
Folke Lemaitre 2020-10-01 15:04:11 +02:00 committed by ridiculousfish
parent f9e426813c
commit a6a0d43c9c
3 changed files with 41 additions and 37 deletions

View file

@ -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

View file

@ -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'\)/ {

View file

@ -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]\)/ ) {