fish: avoid shadowing builtin completions

The fish shell comes with builtin completions. For example, git
completion supports context-aware completion of things like commit
hashes, branch names, sub-commands, etc.

Until fish 4.2, builtin completions were explicitly loaded from
`share/fish/completions`, however that is now deprecated and disabled.
In effect, this means generating manpage-based completion will shadow
and disable builtin completion.

Avoid that, by only generating completion when fish does not have
builtin support for the command.

(cherry picked from commit 23f2ba7ae0)
This commit is contained in:
Matt Sturgeon 2025-11-27 09:46:37 +00:00 committed by Austin Horstman
parent ba2259d7d5
commit 3fdd076e08

View file

@ -628,9 +628,30 @@ in
mkdir -p $out
for src in $srcs; do
if [ -d $src/share/man ]; then
find -L $src/share/man -type f \
-exec python ${cfg.package}/share/fish/tools/create_manpage_completions.py --directory $out {} + \
> /dev/null
while IFS= read -r manpage; do
# Approximate the corresponding command for this manpage
bin="$(basename "$manpage")"
bin="''${bin%%.*}"
bin="$src/bin/$bin"
# Check for builtin completion
if
[ -e "$bin" ] &&
fish \
--no-config \
--command 'complete --do-complete $argv[1]' \
-- "$bin" \
>/dev/null 2>&1
then
echo "Found builtin completion for $bin (skipping)"
continue
fi
# Generate completion based on the manpage
python ${cfg.package}/share/fish/tools/create_manpage_completions.py \
--directory "$out" "$manpage" > /dev/null
done < <(find -L "$src/share/man" -type f)
fi
done
'';