diff --git a/share/functions/__fish_describe_command.fish b/share/functions/__fish_describe_command.fish index e11d49b0c..7fb334d78 100644 --- a/share/functions/__fish_describe_command.fish +++ b/share/functions/__fish_describe_command.fish @@ -3,8 +3,20 @@ # function __fish_describe_command -d "Command used to find descriptions for commands" - command -sq apropos; or return - # Some systems could use -s 1,8 here, but FreeBSD doesn't have that. - apropos $argv 2>/dev/null | string replace -rf '^(\S+) \(\S+\)\s+- (.*)' '$1\t$2' \ - | string match (string replace -a '*' '\*' -- "$argv")"*" + # We're going to try to build a regex out of $argv inside awk. + # Make sure $argv has no special characters. + # TODO: stop interpolating argv into regex, and remove this hack. + string match --quiet --regex '^[a-zA-Z0-9_ ]+$' -- "$argv" + or return + type -q apropos; or return + apropos $argv 2>/dev/null | awk -v FS=" +- +" '{ + split($1, names, ", "); + for (name in names) + if (names[name] ~ /^'"$argv"'.* *\([18]\)/ ) { + sub( "( |\t)*\\\([18]\\\)", "", names[name] ); + sub( " \\\[.*\\\]", "", names[name] ); + print names[name] "\t" $2; + } + }' end +