From a2334cef1e6dcfbb2ae879faba1d41027e10d4be Mon Sep 17 00:00:00 2001 From: Luca Bilke Date: Thu, 22 Feb 2024 11:16:30 +0100 Subject: [PATCH] add justfiles autocomplete --- .config/zsh/completions/_just | 158 ++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 .config/zsh/completions/_just diff --git a/.config/zsh/completions/_just b/.config/zsh/completions/_just new file mode 100644 index 000000000..a8d1d7f1e --- /dev/null +++ b/.config/zsh/completions/_just @@ -0,0 +1,158 @@ +#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)' \ +'--command-color=[Echo recipe lines in ]: :(black blue cyan green purple red yellow)' \ +'--dump-format=[Dump justfile as ]: :(just json)' \ +'--list-heading=[Print before list]' \ +'--list-prefix=[Print before each list item]' \ +'-f+[Use as justfile]' \ +'--justfile=[Use as justfile]' \ +'*--set[Override with ]: :_just_variables' \ +'--shell=[Invoke to run recipes]' \ +'*--shell-arg=[Invoke shell with as an argument]' \ +'-d+[Use as working directory. --justfile must also be set]' \ +'--working-directory=[Use 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 ]: :(zsh bash fish powershell elvish)' \ +'-s+[Show information about ]: :_just_commands' \ +'--show=[Show information about ]: :_just_commands' \ +'(--dotenv-path)--dotenv-filename=[Search for environment file named instead of `.env`]' \ +'--dotenv-path=[Load environment file at 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.]' \ +'--yes[Automatically confirm all recipes.]' \ +'(-q --quiet)-n[Print what just would do without doing it]' \ +'(-q --quiet)--dry-run[Print what just would do without doing it]' \ +'--highlight[Highlight echoed recipe lines in bold]' \ +'--no-deps[Don'\''t run recipe dependencies]' \ +'--no-dotenv[Don'\''t load `.env` file]' \ +'--no-highlight[Don'\''t highlight echoed recipe lines in bold]' \ +'(-n --dry-run)-q[Suppress all output]' \ +'(-n --dry-run)--quiet[Suppress all output]' \ +'--shell-command[Invoke 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 chooser. 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 "$@"