mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-29 14:23:09 +00:00
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:
parent
1c880e5888
commit
79566bc325
1 changed files with 18 additions and 32 deletions
|
@ -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"
|
||||||
|
|
Loading…
Reference in a new issue