diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 590ba9ea..6568dd32 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -30,12 +30,6 @@ jobs: - name: Format run: cargo fmt --all -- --check - - name: Completion Scripts - run: | - ./bin/update-completions - git diff --no-ext-diff --quiet --exit-code - ./tests/completions/just.bash - - name: Install Dependencies run: | sudo apt-get update diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 1e2f20db..f1ac72a3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -73,6 +73,14 @@ jobs: id: ref-type run: cargo run --package ref-type -- --reference ${{ github.ref }} >> $GITHUB_OUTPUT + - name: Generate Completion Scripts + run: | + set -euxo pipefail + cargo build + for shell in bash elvish fish powershell zsh; do + ./target/debug/just --completions $shell > completions/just.$shell + done + - name: Package id: package env: diff --git a/README.md b/README.md index c651c91a..da01ddf1 100644 --- a/README.md +++ b/README.md @@ -3472,18 +3472,18 @@ complete -F _just -o bashdefault -o default j ### Shell Completion Scripts -Shell completion scripts for Bash, Zsh, Fish, PowerShell, and Elvish are -available in the -[completions](https://github.com/casey/just/tree/master/completions) directory. -Please refer to your shell's documentation for how to install them. +Shell completion scripts for Bash, Elvish, Fish, Nushell, PowerShell, and Zsh +are available [release archives](https://github.com/casey/just/releases). -The `just` binary can also generate the same completion scripts at runtime, -using the `--completions` command: +The `just` binary can also generate the same completion scripts at runtime +using `just --completions SHELL`: ```sh $ just --completions zsh > just.zsh ``` +Please refer to your shell's documentation for how to install them. + *macOS Note:* Recent versions of macOS use zsh as the default shell. If you use Homebrew to install `just`, it will automatically install the most recent copy of the zsh completion script in the Homebrew zsh directory, which the built-in diff --git a/bin/update-completions b/bin/update-completions deleted file mode 100755 index b10efff9..00000000 --- a/bin/update-completions +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -set -euxo pipefail - -cargo build - -for script in completions/*; do - shell=${script##*.} - if [ $shell == nu ]; then - continue - fi - ./target/debug/just --completions $shell > $script -done diff --git a/completions/just.bash b/completions/just.bash deleted file mode 100644 index e2513b01..00000000 --- a/completions/just.bash +++ /dev/null @@ -1,165 +0,0 @@ -_just() { - local i cur prev words cword opts cmd - COMPREPLY=() - - # Modules use "::" as the separator, which is considered a wordbreak character in bash. - # The _get_comp_words_by_ref function is a hack to allow for exceptions to this rule without - # modifying the global COMP_WORDBREAKS environment variable. - if type _get_comp_words_by_ref &>/dev/null; then - _get_comp_words_by_ref -n : cur prev words cword - else - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - words=$COMP_WORDS - cword=$COMP_CWORD - fi - - cmd="" - opts="" - - for i in ${words[@]} - do - case "${cmd},${i}" in - ",$1") - cmd="just" - ;; - *) - ;; - esac - done - - case "${cmd}" in - just) - opts="-n -f -q -u -v -d -c -e -l -s -E -g -h -V --check --chooser --color --command-color --yes --dry-run --dump-format --highlight --list-heading --list-prefix --list-submodules --no-aliases --no-deps --no-dotenv --no-highlight --justfile --quiet --set --shell --shell-arg --shell-command --clear-shell-args --unsorted --unstable --verbose --working-directory --changelog --choose --command --completions --dump --edit --evaluate --fmt --init --list --groups --man --show --summary --variables --dotenv-filename --dotenv-path --global-justfile --timestamp --timestamp-format --help --version [ARGUMENTS]..." - if [[ ${cur} == -* ]] ; then - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - elif [[ ${cword} -eq 1 ]]; then - local recipes=$(just --summary 2> /dev/null) - - if echo "${cur}" | \grep -qF '/'; then - local path_prefix=$(echo "${cur}" | sed 's/[/][^/]*$/\//') - local recipes=$(just --summary 2> /dev/null -- "${path_prefix}") - local recipes=$(printf "${path_prefix}%s\t" $recipes) - fi - - if [[ $? -eq 0 ]]; then - COMPREPLY=( $(compgen -W "${recipes}" -- "${cur}") ) - if type __ltrim_colon_completions &>/dev/null; then - __ltrim_colon_completions "$cur" - fi - return 0 - fi - fi - case "${prev}" in - --chooser) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --color) - COMPREPLY=($(compgen -W "auto always never" -- "${cur}")) - return 0 - ;; - --command-color) - COMPREPLY=($(compgen -W "black blue cyan green purple red yellow" -- "${cur}")) - return 0 - ;; - --dump-format) - COMPREPLY=($(compgen -W "just json" -- "${cur}")) - return 0 - ;; - --list-heading) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --list-prefix) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --justfile) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -f) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --set) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --shell) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --shell-arg) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --working-directory) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -d) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --command) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -c) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --completions) - COMPREPLY=($(compgen -W "bash elvish fish powershell zsh" -- "${cur}")) - return 0 - ;; - --list) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -l) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --show) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -s) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --dotenv-filename) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --dotenv-path) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - -E) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - --timestamp-format) - COMPREPLY=($(compgen -f "${cur}")) - return 0 - ;; - *) - COMPREPLY=() - ;; - esac - COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) - return 0 - ;; - esac -} - -if [[ "${BASH_VERSINFO[0]}" -eq 4 && "${BASH_VERSINFO[1]}" -ge 4 || "${BASH_VERSINFO[0]}" -gt 4 ]]; then - complete -F _just -o nosort -o bashdefault -o default just -else - complete -F _just -o bashdefault -o default just -fi diff --git a/completions/just.elvish b/completions/just.elvish deleted file mode 100644 index 9655fe45..00000000 --- a/completions/just.elvish +++ /dev/null @@ -1,85 +0,0 @@ -use builtin; -use str; - -set edit:completion:arg-completer[just] = {|@words| - fn spaces {|n| - builtin:repeat $n ' ' | str:join '' - } - fn cand {|text desc| - edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc - } - var command = 'just' - for word $words[1..-1] { - if (str:has-prefix $word '-') { - break - } - set command = $command';'$word - } - var completions = [ - &'just'= { - cand --chooser 'Override binary invoked by `--choose`' - cand --color 'Print colorful output' - cand --command-color 'Echo recipe lines in ' - cand --dump-format 'Dump justfile as ' - cand --list-heading 'Print before list' - cand --list-prefix 'Print before each list item' - cand -f 'Use as justfile' - cand --justfile 'Use as justfile' - cand --set 'Override with ' - cand --shell 'Invoke to run recipes' - cand --shell-arg 'Invoke shell with as an argument' - cand -d 'Use as working directory. --justfile must also be set' - cand --working-directory 'Use as working directory. --justfile must also be set' - cand -c 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set' - cand --command 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set' - cand --completions 'Print shell completion script for ' - cand -l 'List available recipes' - cand --list 'List available recipes' - cand -s 'Show recipe at ' - cand --show 'Show recipe at ' - cand --dotenv-filename 'Search for environment file named instead of `.env`' - cand -E 'Load as environment file instead of searching for one' - cand --dotenv-path 'Load as environment file instead of searching for one' - cand --timestamp-format 'Timestamp format string' - cand --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.' - cand --yes 'Automatically confirm all recipes.' - cand -n 'Print what just would do without doing it' - cand --dry-run 'Print what just would do without doing it' - cand --highlight 'Highlight echoed recipe lines in bold' - cand --list-submodules 'List recipes in submodules' - cand --no-aliases 'Don''t show aliases in list' - cand --no-deps 'Don''t run recipe dependencies' - cand --no-dotenv 'Don''t load `.env` file' - cand --no-highlight 'Don''t highlight echoed recipe lines in bold' - cand -q 'Suppress all output' - cand --quiet 'Suppress all output' - cand --shell-command 'Invoke with the shell used to run recipe lines and backticks' - cand --clear-shell-args 'Clear shell arguments' - cand -u 'Return list and summary entries in source order' - cand --unsorted 'Return list and summary entries in source order' - cand --unstable 'Enable unstable features' - cand -v 'Use verbose output' - cand --verbose 'Use verbose output' - cand --changelog 'Print changelog' - cand --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`' - cand --dump 'Print justfile' - cand -e 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`' - cand --edit 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`' - cand --evaluate 'Evaluate and print all variables. If a variable name is given as an argument, only print that variable''s value.' - cand --fmt 'Format and overwrite justfile' - cand --init 'Initialize new justfile in project root' - cand --groups 'List recipe groups' - cand --man 'Print man page' - cand --summary 'List names of available recipes' - cand --variables 'List names of variables' - cand -g 'Use global justfile' - cand --global-justfile 'Use global justfile' - cand --timestamp 'Print recipe command timestamps' - cand -h 'Print help' - cand --help 'Print help' - cand -V 'Print version' - cand --version 'Print version' - } - ] - $completions[$command] -} diff --git a/completions/just.fish b/completions/just.fish deleted file mode 100644 index 4a49db2a..00000000 --- a/completions/just.fish +++ /dev/null @@ -1,85 +0,0 @@ -function __fish_just_complete_recipes - just --list 2> /dev/null | tail -n +2 | awk '{ - command = $1; - args = $0; - desc = ""; - delim = ""; - sub(/^[[:space:]]*[^[:space:]]*/, "", args); - gsub(/^[[:space:]]+|[[:space:]]+$/, "", args); - - if (match(args, /#.*/)) { - desc = substr(args, RSTART+2, RLENGTH); - args = substr(args, 0, RSTART-1); - gsub(/^[[:space:]]+|[[:space:]]+$/, "", args); - } - - gsub(/\+|=[`\'"][^`\'"]*[`\'"]/, "", args); - gsub(/ /, ",", args); - - if (args != ""){ - args = "Args: " args; - } - - if (args != "" && desc != "") { - delim = "; "; - } - - print command "\t" args delim desc - }' -end - -# don't suggest files right off -complete -c just -n "__fish_is_first_arg" --no-files - -# complete recipes -complete -c just -a '(__fish_just_complete_recipes)' - -# autogenerated completions -complete -c just -l chooser -d 'Override binary invoked by `--choose`' -r -complete -c just -l color -d 'Print colorful output' -r -f -a "{auto '',always '',never ''}" -complete -c just -l command-color -d 'Echo recipe lines in ' -r -f -a "{black '',blue '',cyan '',green '',purple '',red '',yellow ''}" -complete -c just -l dump-format -d 'Dump justfile as ' -r -f -a "{just '',json ''}" -complete -c just -l list-heading -d 'Print before list' -r -complete -c just -l list-prefix -d 'Print before each list item' -r -complete -c just -s f -l justfile -d 'Use as justfile' -r -F -complete -c just -l set -d 'Override with ' -r -complete -c just -l shell -d 'Invoke to run recipes' -r -complete -c just -l shell-arg -d 'Invoke shell with as an argument' -r -complete -c just -s d -l working-directory -d 'Use as working directory. --justfile must also be set' -r -F -complete -c just -s c -l command -d 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set' -r -complete -c just -l completions -d 'Print shell completion script for ' -r -f -a "{bash '',elvish '',fish '',powershell '',zsh ''}" -complete -c just -s l -l list -d 'List available recipes' -r -complete -c just -s s -l show -d 'Show recipe at ' -r -complete -c just -l dotenv-filename -d 'Search for environment file named instead of `.env`' -r -complete -c just -s E -l dotenv-path -d 'Load as environment file instead of searching for one' -r -F -complete -c just -l timestamp-format -d 'Timestamp format string' -r -complete -c just -l check -d 'Run `--fmt` in \'check\' mode. Exits with 0 if justfile is formatted correctly. Exits with 1 and prints a diff if formatting is required.' -complete -c just -l yes -d 'Automatically confirm all recipes.' -complete -c just -s n -l dry-run -d 'Print what just would do without doing it' -complete -c just -l highlight -d 'Highlight echoed recipe lines in bold' -complete -c just -l list-submodules -d 'List recipes in submodules' -complete -c just -l no-aliases -d 'Don\'t show aliases in list' -complete -c just -l no-deps -d 'Don\'t run recipe dependencies' -complete -c just -l no-dotenv -d 'Don\'t load `.env` file' -complete -c just -l no-highlight -d 'Don\'t highlight echoed recipe lines in bold' -complete -c just -s q -l quiet -d 'Suppress all output' -complete -c just -l shell-command -d 'Invoke with the shell used to run recipe lines and backticks' -complete -c just -l clear-shell-args -d 'Clear shell arguments' -complete -c just -s u -l unsorted -d 'Return list and summary entries in source order' -complete -c just -l unstable -d 'Enable unstable features' -complete -c just -s v -l verbose -d 'Use verbose output' -complete -c just -l changelog -d 'Print changelog' -complete -c just -l choose -d '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`' -complete -c just -l dump -d 'Print justfile' -complete -c just -s e -l edit -d 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`' -complete -c just -l evaluate -d 'Evaluate and print all variables. If a variable name is given as an argument, only print that variable\'s value.' -complete -c just -l fmt -d 'Format and overwrite justfile' -complete -c just -l init -d 'Initialize new justfile in project root' -complete -c just -l groups -d 'List recipe groups' -complete -c just -l man -d 'Print man page' -complete -c just -l summary -d 'List names of available recipes' -complete -c just -l variables -d 'List names of variables' -complete -c just -s g -l global-justfile -d 'Use global justfile' -complete -c just -l timestamp -d 'Print recipe command timestamps' -complete -c just -s h -l help -d 'Print help' -complete -c just -s V -l version -d 'Print version' diff --git a/completions/just.powershell b/completions/just.powershell deleted file mode 100644 index b39d367f..00000000 --- a/completions/just.powershell +++ /dev/null @@ -1,111 +0,0 @@ -using namespace System.Management.Automation -using namespace System.Management.Automation.Language - -Register-ArgumentCompleter -Native -CommandName 'just' -ScriptBlock { - param($wordToComplete, $commandAst, $cursorPosition) - - $commandElements = $commandAst.CommandElements - $command = @( - 'just' - for ($i = 1; $i -lt $commandElements.Count; $i++) { - $element = $commandElements[$i] - if ($element -isnot [StringConstantExpressionAst] -or - $element.StringConstantType -ne [StringConstantType]::BareWord -or - $element.Value.StartsWith('-') -or - $element.Value -eq $wordToComplete) { - break - } - $element.Value - }) -join ';' - - $completions = @(switch ($command) { - 'just' { - [CompletionResult]::new('--chooser', 'chooser', [CompletionResultType]::ParameterName, 'Override binary invoked by `--choose`') - [CompletionResult]::new('--color', 'color', [CompletionResultType]::ParameterName, 'Print colorful output') - [CompletionResult]::new('--command-color', 'command-color', [CompletionResultType]::ParameterName, 'Echo recipe lines in ') - [CompletionResult]::new('--dump-format', 'dump-format', [CompletionResultType]::ParameterName, 'Dump justfile as ') - [CompletionResult]::new('--list-heading', 'list-heading', [CompletionResultType]::ParameterName, 'Print before list') - [CompletionResult]::new('--list-prefix', 'list-prefix', [CompletionResultType]::ParameterName, 'Print before each list item') - [CompletionResult]::new('-f', 'f', [CompletionResultType]::ParameterName, 'Use as justfile') - [CompletionResult]::new('--justfile', 'justfile', [CompletionResultType]::ParameterName, 'Use as justfile') - [CompletionResult]::new('--set', 'set', [CompletionResultType]::ParameterName, 'Override with ') - [CompletionResult]::new('--shell', 'shell', [CompletionResultType]::ParameterName, 'Invoke to run recipes') - [CompletionResult]::new('--shell-arg', 'shell-arg', [CompletionResultType]::ParameterName, 'Invoke shell with as an argument') - [CompletionResult]::new('-d', 'd', [CompletionResultType]::ParameterName, 'Use as working directory. --justfile must also be set') - [CompletionResult]::new('--working-directory', 'working-directory', [CompletionResultType]::ParameterName, 'Use as working directory. --justfile must also be set') - [CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set') - [CompletionResult]::new('--command', 'command', [CompletionResultType]::ParameterName, 'Run an arbitrary command with the working directory, `.env`, overrides, and exports set') - [CompletionResult]::new('--completions', 'completions', [CompletionResultType]::ParameterName, 'Print shell completion script for ') - [CompletionResult]::new('-l', 'l', [CompletionResultType]::ParameterName, 'List available recipes') - [CompletionResult]::new('--list', 'list', [CompletionResultType]::ParameterName, 'List available recipes') - [CompletionResult]::new('-s', 's', [CompletionResultType]::ParameterName, 'Show recipe at ') - [CompletionResult]::new('--show', 'show', [CompletionResultType]::ParameterName, 'Show recipe at ') - [CompletionResult]::new('--dotenv-filename', 'dotenv-filename', [CompletionResultType]::ParameterName, 'Search for environment file named instead of `.env`') - [CompletionResult]::new('-E', 'E ', [CompletionResultType]::ParameterName, 'Load as environment file instead of searching for one') - [CompletionResult]::new('--dotenv-path', 'dotenv-path', [CompletionResultType]::ParameterName, 'Load as environment file instead of searching for one') - [CompletionResult]::new('--timestamp-format', 'timestamp-format', [CompletionResultType]::ParameterName, 'Timestamp format string') - [CompletionResult]::new('--check', 'check', [CompletionResultType]::ParameterName, 'Run `--fmt` in ''check'' mode. Exits with 0 if justfile is formatted correctly. Exits with 1 and prints a diff if formatting is required.') - [CompletionResult]::new('--yes', 'yes', [CompletionResultType]::ParameterName, 'Automatically confirm all recipes.') - [CompletionResult]::new('-n', 'n', [CompletionResultType]::ParameterName, 'Print what just would do without doing it') - [CompletionResult]::new('--dry-run', 'dry-run', [CompletionResultType]::ParameterName, 'Print what just would do without doing it') - [CompletionResult]::new('--highlight', 'highlight', [CompletionResultType]::ParameterName, 'Highlight echoed recipe lines in bold') - [CompletionResult]::new('--list-submodules', 'list-submodules', [CompletionResultType]::ParameterName, 'List recipes in submodules') - [CompletionResult]::new('--no-aliases', 'no-aliases', [CompletionResultType]::ParameterName, 'Don''t show aliases in list') - [CompletionResult]::new('--no-deps', 'no-deps', [CompletionResultType]::ParameterName, 'Don''t run recipe dependencies') - [CompletionResult]::new('--no-dotenv', 'no-dotenv', [CompletionResultType]::ParameterName, 'Don''t load `.env` file') - [CompletionResult]::new('--no-highlight', 'no-highlight', [CompletionResultType]::ParameterName, 'Don''t highlight echoed recipe lines in bold') - [CompletionResult]::new('-q', 'q', [CompletionResultType]::ParameterName, 'Suppress all output') - [CompletionResult]::new('--quiet', 'quiet', [CompletionResultType]::ParameterName, 'Suppress all output') - [CompletionResult]::new('--shell-command', 'shell-command', [CompletionResultType]::ParameterName, 'Invoke with the shell used to run recipe lines and backticks') - [CompletionResult]::new('--clear-shell-args', 'clear-shell-args', [CompletionResultType]::ParameterName, 'Clear shell arguments') - [CompletionResult]::new('-u', 'u', [CompletionResultType]::ParameterName, 'Return list and summary entries in source order') - [CompletionResult]::new('--unsorted', 'unsorted', [CompletionResultType]::ParameterName, 'Return list and summary entries in source order') - [CompletionResult]::new('--unstable', 'unstable', [CompletionResultType]::ParameterName, 'Enable unstable features') - [CompletionResult]::new('-v', 'v', [CompletionResultType]::ParameterName, 'Use verbose output') - [CompletionResult]::new('--verbose', 'verbose', [CompletionResultType]::ParameterName, 'Use verbose output') - [CompletionResult]::new('--changelog', 'changelog', [CompletionResultType]::ParameterName, 'Print changelog') - [CompletionResult]::new('--choose', 'choose', [CompletionResultType]::ParameterName, '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`') - [CompletionResult]::new('--dump', 'dump', [CompletionResultType]::ParameterName, 'Print justfile') - [CompletionResult]::new('-e', 'e', [CompletionResultType]::ParameterName, 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`') - [CompletionResult]::new('--edit', 'edit', [CompletionResultType]::ParameterName, 'Edit justfile with editor given by $VISUAL or $EDITOR, falling back to `vim`') - [CompletionResult]::new('--evaluate', 'evaluate', [CompletionResultType]::ParameterName, 'Evaluate and print all variables. If a variable name is given as an argument, only print that variable''s value.') - [CompletionResult]::new('--fmt', 'fmt', [CompletionResultType]::ParameterName, 'Format and overwrite justfile') - [CompletionResult]::new('--init', 'init', [CompletionResultType]::ParameterName, 'Initialize new justfile in project root') - [CompletionResult]::new('--groups', 'groups', [CompletionResultType]::ParameterName, 'List recipe groups') - [CompletionResult]::new('--man', 'man', [CompletionResultType]::ParameterName, 'Print man page') - [CompletionResult]::new('--summary', 'summary', [CompletionResultType]::ParameterName, 'List names of available recipes') - [CompletionResult]::new('--variables', 'variables', [CompletionResultType]::ParameterName, 'List names of variables') - [CompletionResult]::new('-g', 'g', [CompletionResultType]::ParameterName, 'Use global justfile') - [CompletionResult]::new('--global-justfile', 'global-justfile', [CompletionResultType]::ParameterName, 'Use global justfile') - [CompletionResult]::new('--timestamp', 'timestamp', [CompletionResultType]::ParameterName, 'Print recipe command timestamps') - [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help') - [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help') - [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version') - [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version') - break - } - }) - - function Get-JustFileRecipes([string[]]$CommandElements) { - $justFileIndex = $commandElements.IndexOf("--justfile"); - - if ($justFileIndex -ne -1 && $justFileIndex + 1 -le $commandElements.Length) { - $justFileLocation = $commandElements[$justFileIndex + 1] - } - - $justArgs = @("--summary") - - if (Test-Path $justFileLocation) { - $justArgs += @("--justfile", $justFileLocation) - } - - $recipes = $(just @justArgs) -split ' ' - return $recipes | ForEach-Object { [CompletionResult]::new($_) } - } - - $elementValues = $commandElements | Select-Object -ExpandProperty Value - $recipes = Get-JustFileRecipes -CommandElements $elementValues - $completions += $recipes - $completions.Where{ $_.CompletionText -like "$wordToComplete*" } | - Sort-Object -Property ListItemText -} diff --git a/completions/just.zsh b/completions/just.zsh deleted file mode 100644 index 1c7dab01..00000000 --- a/completions/just.zsh +++ /dev/null @@ -1,172 +0,0 @@ -#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 ]:FORMAT:(just json)' \ -'--list-heading=[Print before list]:TEXT: ' \ -'--list-prefix=[Print before each list item]:TEXT: ' \ -'-f+[Use as justfile]: :_files' \ -'--justfile=[Use as justfile]: :_files' \ -'*--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]: :_files' \ -'--working-directory=[Use as working directory. --justfile must also be set]: :_files' \ -'*-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:(bash elvish fish powershell zsh)' \ -'()-l+[List available recipes]' \ -'()--list=[List available recipes]' \ -'-s+[Show recipe at ]: :(_just_commands)' \ -'--show=[Show recipe at ]: :(_just_commands)' \ -'(-E --dotenv-path)--dotenv-filename=[Search for environment file named instead of \`.env\`]: : ' \ -'-E+[Load as environment file instead of searching for one]: :_files' \ -'--dotenv-path=[Load as environment file instead of searching for one]: :_files' \ -'--timestamp-format=[Timestamp format string]: : ' \ -'--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]' \ -'--list-submodules[List recipes in submodules]' \ -'--no-aliases[Don'\''t show aliases in list]' \ -'--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]' \ -'--groups[List recipe groups]' \ -'--man[Print man page]' \ -'--summary[List names of available recipes]' \ -'--variables[List names of variables]' \ -'(-f --justfile -d --working-directory)-g[Use global justfile]' \ -'(-f --justfile -d --working-directory)--global-justfile[Use global justfile]' \ -'--timestamp[Print recipe command timestamps]' \ -'-h[Print help]' \ -'--help[Print help]' \ -'-V[Print version]' \ -'--version[Print version]' \ -) - - _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 - -} - -if [ "$funcstack[1]" = "_just" ]; then - (( $+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 "$@" -else - compdef _just just -fi diff --git a/tests/completions.rs b/tests/completions.rs index 2f33d2a8..6ba3e493 100644 --- a/tests/completions.rs +++ b/tests/completions.rs @@ -1,19 +1,38 @@ use super::*; #[test] -fn output() { - let tempdir = tempdir(); - +#[cfg(target_os = "linux")] +fn bash() { let output = Command::new(executable_path("just")) - .arg("--completions") - .arg("bash") - .current_dir(tempdir.path()) + .args(["--completions", "bash"]) .output() .unwrap(); assert!(output.status.success()); - let text = String::from_utf8_lossy(&output.stdout); + let script = str::from_utf8(&output.stdout).unwrap(); - assert!(text.starts_with("_just() {")); + let tempdir = tempdir(); + + let path = tempdir.path().join("just.bash"); + + fs::write(&path, script).unwrap(); + + let status = Command::new("./tests/completions/just.bash") + .arg(path) + .status() + .unwrap(); + + assert!(status.success()); +} + +#[test] +fn replacements() { + for shell in ["bash", "elvish", "fish", "powershell", "zsh"] { + let status = Command::new(executable_path("just")) + .args(["--completions", shell]) + .status() + .unwrap(); + assert!(status.success()); + } } diff --git a/tests/completions/just.bash b/tests/completions/just.bash index 79469cad..6d5c12cb 100755 --- a/tests/completions/just.bash +++ b/tests/completions/just.bash @@ -18,7 +18,7 @@ reply_equals() { } # --- Initial Setup --- -source ./completions/just.bash +source "$1" cd tests/completions cargo build PATH="$(git rev-parse --show-toplevel)/target/debug:$PATH"