155 lines
5.7 KiB
Bash
155 lines
5.7 KiB
Bash
#compdef just
|
|
|
|
autoload -U is-at-least
|
|
|
|
_just() {
|
|
typeset -A opt_args
|
|
typeset -a _arguments_options
|
|
local ret=1
|
|
|
|
if is-at-least 5.2; then
|
|
_arguments_options=(-s -S -C)
|
|
else
|
|
_arguments_options=(-s -C)
|
|
fi
|
|
|
|
local context curcontext="$curcontext" state line
|
|
local common=(
|
|
'--chooser=[Override binary invoked by `--choose`]' \
|
|
'--color=[Print colorful output]: :(auto always never)' \
|
|
'--dump-format=[Dump justfile as <FORMAT>]: :(just json)' \
|
|
'--list-heading=[Print <TEXT> before list]' \
|
|
'--list-prefix=[Print <TEXT> before each list item]' \
|
|
'-f+[Use <JUSTFILE> as justfile]' \
|
|
'--justfile=[Use <JUSTFILE> as justfile]' \
|
|
'*--set[Override <VARIABLE> with <VALUE>]: :_just_variables' \
|
|
'--shell=[Invoke <SHELL> to run recipes]' \
|
|
'*--shell-arg=[Invoke shell with <SHELL-ARG> as an argument]' \
|
|
'-d+[Use <WORKING-DIRECTORY> as working directory. --justfile must also be set]' \
|
|
'--working-directory=[Use <WORKING-DIRECTORY> as working directory. --justfile must also be set]' \
|
|
'-c+[Run an arbitrary command with the working directory, `.env`, overrides, and exports set]' \
|
|
'--command=[Run an arbitrary command with the working directory, `.env`, overrides, and exports set]' \
|
|
'--completions=[Print shell completion script for <SHELL>]: :(zsh bash fish powershell elvish)' \
|
|
'-s+[Show information about <RECIPE>]: :_just_commands' \
|
|
'--show=[Show information about <RECIPE>]: :_just_commands' \
|
|
'(--dotenv-path)--dotenv-filename=[Search for environment file named <DOTENV-FILENAME> instead of `.env`]' \
|
|
'--dotenv-path=[Load environment file at <DOTENV-PATH> instead of searching for one]' \
|
|
'--check[Run `--fmt` in '\''check'\'' mode. Exits with 0 if justfile is formatted correctly. Exits with 1 and prints a diff if formatting is required.]' \
|
|
'(-q --quiet)--dry-run[Print what just would do without doing it]' \
|
|
'--highlight[Highlight echoed recipe lines in bold]' \
|
|
'--no-dotenv[Don'\''t load `.env` file]' \
|
|
'--no-highlight[Don'\''t highlight echoed recipe lines in bold]' \
|
|
'(--dry-run)-q[Suppress all output]' \
|
|
'(--dry-run)--quiet[Suppress all output]' \
|
|
'--shell-command[Invoke <COMMAND> with the shell used to run recipe lines and backticks]' \
|
|
'--clear-shell-args[Clear shell arguments]' \
|
|
'-u[Return list and summary entries in source order]' \
|
|
'--unsorted[Return list and summary entries in source order]' \
|
|
'--unstable[Enable unstable features]' \
|
|
'*-v[Use verbose output]' \
|
|
'*--verbose[Use verbose output]' \
|
|
'--changelog[Print changelog]' \
|
|
'--choose[Select one or more recipes to run using a binary. If `--chooser` is not passed the chooser defaults to the value of $JUST_CHOOSER, falling back to `fzf`]' \
|
|
'--dump[Print justfile]' \
|
|
'-e[Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`]' \
|
|
'--edit[Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`]' \
|
|
'--evaluate[Evaluate and print all variables. If a variable name is given as an argument, only print that variable'\''s value.]' \
|
|
'--fmt[Format and overwrite justfile]' \
|
|
'--init[Initialize new justfile in project root]' \
|
|
'-l[List available recipes and their arguments]' \
|
|
'--list[List available recipes and their arguments]' \
|
|
'--summary[List names of available recipes]' \
|
|
'--variables[List names of variables]' \
|
|
'-h[Print help information]' \
|
|
'--help[Print help information]' \
|
|
'-V[Print version information]' \
|
|
'--version[Print version information]' \
|
|
)
|
|
|
|
_arguments "${_arguments_options[@]}" $common \
|
|
'1: :_just_commands' \
|
|
'*: :->args' \
|
|
&& ret=0
|
|
|
|
case $state in
|
|
args)
|
|
curcontext="${curcontext%:*}-${words[2]}:"
|
|
|
|
local lastarg=${words[${#words}]}
|
|
local recipe
|
|
|
|
local cmds; cmds=(
|
|
${(s: :)$(_call_program commands just --summary)}
|
|
)
|
|
|
|
# Find first recipe name
|
|
for ((i = 2; i < $#words; i++ )) do
|
|
if [[ ${cmds[(I)${words[i]}]} -gt 0 ]]; then
|
|
recipe=${words[i]}
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [[ $lastarg = */* ]]; then
|
|
# Arguments contain slash would be recognised as a file
|
|
_arguments -s -S $common '*:: :_files'
|
|
elif [[ $lastarg = *=* ]]; then
|
|
# Arguments contain equal would be recognised as a variable
|
|
_message "value"
|
|
elif [[ $recipe ]]; then
|
|
# Show usage message
|
|
_message "`just --show $recipe`"
|
|
# Or complete with other commands
|
|
#_arguments -s -S $common '*:: :_just_commands'
|
|
else
|
|
_arguments -s -S $common '*:: :_just_commands'
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
return ret
|
|
}
|
|
|
|
(( $+functions[_just_commands] )) ||
|
|
_just_commands() {
|
|
[[ $PREFIX = -* ]] && return 1
|
|
integer ret=1
|
|
local variables; variables=(
|
|
${(s: :)$(_call_program commands just --variables)}
|
|
)
|
|
local commands; commands=(
|
|
${${${(M)"${(f)$(_call_program commands just --list)}":# *}/ ##/}/ ##/:Args: }
|
|
)
|
|
|
|
if compset -P '*='; then
|
|
case "${${words[-1]%=*}#*=}" in
|
|
*) _message 'value' && ret=0 ;;
|
|
esac
|
|
else
|
|
_describe -t variables 'variables' variables -qS "=" && ret=0
|
|
_describe -t commands 'just commands' commands "$@"
|
|
fi
|
|
|
|
}
|
|
|
|
(( $+functions[_just_variables] )) ||
|
|
_just_variables() {
|
|
[[ $PREFIX = -* ]] && return 1
|
|
integer ret=1
|
|
local variables; variables=(
|
|
${(s: :)$(_call_program commands just --variables)}
|
|
)
|
|
|
|
if compset -P '*='; then
|
|
case "${${words[-1]%=*}#*=}" in
|
|
*) _message 'value' && ret=0 ;;
|
|
esac
|
|
else
|
|
_describe -t variables 'variables' variables && ret=0
|
|
fi
|
|
|
|
return ret
|
|
}
|
|
|
|
_just "$@"
|