| # Only generate completions if $FUCHSIA_DIR is set |
| if test -z "$FUCHSIA_DIR" |
| exit |
| end |
| |
| complete -c fx --no-files --require-parameter |
| |
| complete -c fx --condition __fish_use_subcommand --arguments help --description "Show help for COMMAND" |
| complete -c fx --condition "__fish_seen_subcommand_from help" -l no-contrib --description "Hide contrib commands (see //tools/devshell/README.md)" |
| complete -c fx --condition "__fish_seen_subcommand_from help" -l deprecated --description "Do not hide deprecated commands" |
| |
| # Compute vendor directories using set to avoid getting a Fish error if |
| # $FUCHSIA_DIR/vendor does not exist. |
| # https://fishshell.com/docs/current/language.html?highlight=exceptions#wildcards-globbing |
| set -l vendor_devshell_dirs $FUCHSIA_DIR/vendor/*/scripts/devshell/ |
| |
| # Find fx subcommands and their descriptions |
| find $FUCHSIA_DIR/tools/devshell/ $vendor_devshell_dirs \ |
| -maxdepth 2 -type f \( -executable -or -name '*.fx' \) \ |
| | xargs grep -E '^### +' \ |
| | while read -a -l line -d ':### ' |
| set -l command_name (basename -s '.fx' $line[1]) |
| set -l command_desc (string trim $line[2]) |
| # save subcommand name |
| set -a fx_subcommands $command_name |
| complete -c fx --condition __fish_use_subcommand --arguments $command_name --description $command_desc |
| complete -c fx --condition "__fish_seen_subcommand_from help" --arguments $command_name --description $command_desc |
| end |
| |
| # Returns true if no subcommand is on the command line |
| function __fish_fx_needs_subcommand |
| not __fish_seen_subcommand_from $fx_subcommands |
| end |
| |
| # global fx options |
| complete -c fx --condition __fish_fx_needs_subcommand -l dir -d "Path to the build directory to use when running COMMAND." |
| complete -c fx --condition __fish_fx_needs_subcommand -o d -d "Target a specific device." |
| complete -c fx --condition __fish_fx_needs_subcommand -o i -d "Iterative mode" |
| complete -c fx --condition __fish_fx_needs_subcommand -o x -d "Print commands and their arguments as they are executed." |
| complete -c fx --condition __fish_fx_needs_subcommand -o xx -d "Print extra logging of the fx tool itself (implies -x)" |
| |
| # Find fx subcommand options |
| find $FUCHSIA_DIR/tools/devshell/ \ |
| -maxdepth 2 -type f \( -executable -or -name '*.fx' \) \ |
| | xargs grep -E '^## +-[^ ]' \ |
| | while read -a -l line -d ':' |
| set -l command_name (basename -s '.fx' $line[1]) |
| set -l command_desc $line[2] |
| set -l shortoption |
| set -l longoption |
| set -l longoption2 |
| set -l argname |
| set -l desc |
| |
| if set -l flgs (string match --regex '##\s+(-[^-])(?:, ?|\|)(--[^ ]+)(?:\s*)([^-].*)?' $command_desc) |
| # short followed by long option |
| set shortoption $flgs[2] |
| set longoption $flgs[3] |
| set desc $flgs[4] |
| else if set -l flgs (string match --regex '##\s+(--[^ ,|]+)(?:, ?|\|)(-[^ ,|]+)(?:\s*)([^-].*)?' $command_desc) |
| # long followed by short option |
| set longoption $flgs[2] |
| |
| # is the second option another long? |
| if set -l second_option (printf "%s\n" $flgs[3] | string match --regex '(--[^ ,|]+).*') |
| set longoption2 $flgs[3] |
| else |
| set shortoption $flgs[3] |
| end |
| set desc $flgs[4] |
| else if set -l flgs (string match --regex '##\s+(--[^ ,|]+)(?:\s*)([^-].*)?' $command_desc) |
| # single long option |
| set longoption $flgs[2] |
| set desc $flgs[3] |
| if set -l la (printf "%s\n" $flgs[2] | string match --regex '(--[^=]+)=[<]?([^>\s]+)[>]?') |
| set longoption $la[2] |
| set argname $la[3] |
| end |
| else if set -l flgs (string match --regex '##\s+(-[^-\s]+)(?:\s*)([^-].*)?' $command_desc) |
| # single short option |
| set shortoption $flgs[2] |
| set desc $flgs[3] |
| end |
| |
| # extract the first word in the desc if it's all caps |
| if set -l leadingargname (string match --regex '^\s*([A-Z_-][A-Z_-]+)\s+(.*)' $desc) |
| set argname $leadingargname[2] |
| set desc $leadingargname[3] |
| end |
| |
| # trim desc |
| set desc (printf "%s" "$desc" | string trim) |
| # if no description set, create one so every completion has one |
| if test -z "$desc" |
| set desc "$shortoption $longoption" |
| end |
| |
| # trim remaining options |
| set shortoption (printf "%s" "$shortoption" | string trim | string trim -l -c '-') |
| set longoption (printf "%s" "$longoption" | string trim | string trim -l -c '-') |
| set longoption2 (printf "%s" "$longoption2" | string trim | string trim -l -c '-') |
| set argname (printf "%s" "$argname" | string trim) |
| |
| # define completions |
| if test -n "$shortoption" -a -n "$desc" |
| # old long option style (single dash): -xx |
| complete -c fx --condition "__fish_seen_subcommand_from $command_name" -o $shortoption -d $desc |
| end |
| if test -n "$longoption" -a -n "$desc" |
| # long option style: --option |
| complete -c fx --condition "__fish_seen_subcommand_from $command_name" -l $longoption -d $desc |
| end |
| if test -n "$longoption2" -a -n "$desc" |
| # second long option, --goma|--no-goma |
| complete -c fx --condition "__fish_seen_subcommand_from $command_name" -l $longoption2 -d $desc |
| end |
| end |
| |
| # Functions that will be available in subcommand completers |
| function __fuchsia_build_dir |
| set -l build_dir_file "$FUCHSIA_DIR"/.fx-build-dir |
| |
| if test -f "$build_dir_file" |
| # If the file exists, return its contents |
| cat "$build_dir_file" |
| else |
| # If the file does not exist, return an empty string |
| echo "" |
| end |
| end |
| |
| # Source any additional completers for the fx subcommands. If you would |
| # like to add additionaly functionality for a completer create a file |
| # named fx-<command>.fish which runs the completion command. |
| # These completers should be sourced at the end of this file to allow the |
| # subcommands to override any complete commands that have already been called. |
| set sub_command_completers (dirname (status --current-filename))/fx-*.fish |
| for completer in $sub_command_completers |
| source $completer |
| end |