Fix GNU Make completions when specifying a directory with -C

Make is much better than us at figuring out which makefile to use,
just pass through the relevant parameters.

Also previously they didn't work at all for Makefiles like the one in
https://github.com/jonas/tig, for example.
This commit is contained in:
Johannes Altmanninger 2020-03-28 22:13:09 +01:00
parent 1c880e5888
commit 79566bc325

View file

@ -4,58 +4,44 @@ function __fish_print_make_targets --argument-names directory file
# text will be using the correct locale. # text will be using the correct locale.
set -lx LC_ALL C set -lx LC_ALL C
if test -z "$directory" set -l makeflags -C $directory
set directory '.' if test -n "$file"
set -a makeflags -f $file
end end
if test -z "$file"
for standard_file in $directory/{GNUmakefile,Makefile,makefile}
if test -f $standard_file
set file $standard_file
break
end
end
end
set -l bsd_make
if make --version 2>/dev/null | string match -q 'GNU*' if make --version 2>/dev/null | string match -q 'GNU*'
set bsd_make 0
else
set bsd_make 1
end
if test "$bsd_make" = 0
# https://stackoverflow.com/a/26339924 # https://stackoverflow.com/a/26339924
make -C "$directory" -f "$file" -pRrq : 2>/dev/null | awk -v RS= -F: '/^# Files/,/^# Finished Make data base/ {if ($1 !~ "^[#.]") {print $1}}' 2>/dev/null make $makeflags -pRrq : 2>/dev/null > log.mk
make $makeflags -pRrq : 2>/dev/null |
awk -F: '/^# Files/,/^# Finished Make data base/ {
if ($1 == "# Not a target") skip = 1;
if ($1 !~ "^[#.\t]") { if (!skip) print $1; skip=0 }
}' 2>/dev/null
else else
make -C "$directory" -f "$file" -d g1 -rn >/dev/null 2>| awk -F, '/^#\*\*\* Input graph:/,/^$/ {if ($1 !~ "^#... ") {gsub(/# /,"",$1); print $1}}' 2>/dev/null # BSD make
make $makeflags -d g1 -rn >/dev/null 2>| awk -F, '/^#\*\*\* Input graph:/,/^$/ {if ($1 !~ "^#... ") {gsub(/# /,"",$1); print $1}}' 2>/dev/null
end end
end end
function __fish_complete_make_targets function __fish_complete_make_targets
set directory (string replace -r '^make .*(-C ?|--directory(=| +))([^ ]*) .*$' '$3' -- $argv) set -l directory (string replace -rf '^make .*(-C ?|--directory(=| +))([^ ]*) .*$' '$3' -- $argv)
if not test $status -eq 0 -a -d $directory or set directory .
set directory '' set -l file (string replace -rf '^make .*(-f ?|--file(=| +))([^ ]*) .*$' '$3' -- $argv)
end __fish_print_make_targets $directory $file
set file (string replace -r '^make .*(-f ?|--file(=| +))([^ ]*) .*$' '$3' -- $argv)
if not test $status -eq 0 -a -f $file
set file ''
end
__fish_print_make_targets "$directory" "$file"
end end
# This completion reenables file completion on # This completion reenables file completion on
# assignments, so e.g. 'make foo FILES=<tab>' will receive standard # assignments, so e.g. 'make foo FILES=<tab>' will receive standard
# filename completion. # filename completion.
complete -c make -n 'commandline -ct | string match -q "*=*"' -a "(__fish_complete_make_targets (commandline -c))" -d Target complete -c make -n 'commandline -ct | string match -q "*=*"' -a "(__fish_complete_make_targets (commandline -p))" -d Target
complete -f -c make -n 'commandline -ct | not string match -q "*=*"' -a "(__fish_complete_make_targets (commandline -c))" -d Target complete -f -c make -n 'commandline -ct | not string match -q "*=*"' -a "(__fish_complete_make_targets (commandline -p))" -d Target
complete -c make -s f -d "Use file as makefile" -r complete -c make -s f -d "Use file as makefile" -r
complete -x -c make -s C -l directory -x -a "(__fish_complete_directories (commandline -ct))" -d "Change directory" complete -x -c make -s C -l directory -x -a "(__fish_complete_directories (commandline -ct))" -d "Change directory"
complete -c make -s d -d "Debug mode" complete -c make -s d -d "Debug mode"
complete -c make -s e -d "Environment before makefile" complete -c make -s e -d "Environment before makefile"
complete -c make -s i -d "Ignore errors" complete -c make -s i -d "Ignore errors"
complete -x -c make -s I -d "Search directory for makefile" -a "(__fish_complete_directories (commandline -ct))" complete -x -c make -s I -d "Search directory for makefile" -a "(__fish_complete_directories (commandline -ct))"
complete -x -c make -s j -d "Number of concurrent jobs" complete -f -c make -s j -d "Number of concurrent jobs (default: 1 per CPU)"
complete -c make -s k -d "Continue after an error" complete -c make -s k -d "Continue after an error"
complete -c make -s l -d "Start when load drops" complete -c make -s l -d "Start when load drops"
complete -c make -s n -d "Do not execute commands" complete -c make -s n -d "Do not execute commands"