diff --git a/.config/zsh/functions/_west b/.config/zsh/functions/_west new file mode 100644 index 0000000..fc3f551 --- /dev/null +++ b/.config/zsh/functions/_west @@ -0,0 +1,354 @@ +#compdef west + +# Copyright (c) 2022 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +# Ensure this works also when being source-ed +compdef _west west + +typeset -A -g _opt_args + +_west_cmds() { + local -a builtin_cmds=( + 'init[create a west workspace]' + 'update[update projects described in west manifest]' + 'list[print information about projects]' + 'manifest[manage the west manifest]' + 'diff["git diff" for one or more projects]' + 'status["git status" for one or more projects]' + 'forall[run a command in one or more local projects]' + 'config[get or set config file values]' + 'topdir[print the top level directory of the workspace]' + 'help[get help for west or a command]' + ) + + local -a zephyr_ext_cmds=( + 'completion[display shell completion scripts]' + 'boards[display information about supported boards]' + 'build[compile a Zephyr application]' + 'sign[sign a Zephyr binary for bootloader chain-loading]' + 'flash[flash and run a binary on a board]' + 'debug[flash and interactively debug a Zephyr application]' + 'debugserver[connect to board and launch a debug server]' + 'attach[interactively debug a board]' + 'zephyr-export[export Zephyr installation as a CMake config package]' + 'spdx[create SPDX bill of materials]' + 'blobs[work with binary blobs]' + ) + + local -a all_cmds=(${builtin_cmds} ${zephyr_ext_cmds}) + + if [[ -v WEST_COMP_CHECK_WORKSPACE ]]; then + west topdir &>/dev/null + if [ $? -eq 0 ]; then + _values "west command" $all_cmds + else + _values "west command" $builtin_cmds + fi + else + _values "west command" $all_cmds + fi +} + +# Completion script for Zephyr's meta-tool, west +_west() { + + + # Global options for all commands + local -a global_opts=( + # (: * -) as exclusion list means exclude everything else + '(: * -)'{-h,--help}'[show help]' + # An exclusion list with the very option means only allow once + {-v,--verbose}'[enable verbosity]' + '(: * -)'{-V,--version}'[print version]' + '(-z --zephyr-base)'{-z,--zephyr-base}'[zephyr base folder]:zephyr base folder:_directories' + ) + + typeset -A opt_args + local curcontext="$curcontext" context state state_descr line + local -a orig_words + + orig_words=( ${words[@]} ) + + _arguments -S -C \ + $global_opts \ + "1: :->cmds" \ + "*::arg:->args" \ + + case "$state" in + cmds) + _west_cmds + ;; + + args) + _opt_args=( ${(@kv)opt_args} ) + _call_function ret _west_$line[1] + ;; + esac +} + +__west_x() +{ + west 2>/dev/null "$@" +} + +_get_west_projs() { + local extra_args + [[ -v _opt_args[-z] ]] && extra_args="-z $_opt_args[-z]" + [[ -v _opt_args[--zephyr-base] ]] && extra_args="-z $_opt_args[--zephyr-base]" + + _west_projs=($(__west_x $extra_args list --format={name})) + _describe 'projs' _west_projs +} + +_get_west_boards() { + _west_boards=($(__west_x boards --format={name})) + _describe 'boards' _west_boards +} + +_west_init() { + local -a opts=( + '(-l --local)'{--mr,--manifest-rev}'[manifest revision]:manifest rev:' + {--mf,--manifest-file}'[manifest file]:manifest file:' + '(-l --local)'{-m,--manifest}'[manifest URL]:manifest URL:_directories' + '(-m --manifest --mr --manifest-rev)'{-l,--local}'[use local directory as manifest repository]:local manifest repository directory:_directories' + ) + + _arguments -S $opts \ + "1:workspace directory:" +} + +_west_update() { + local -a opts=( + '--stats[print performance stats]' + '--name-cache[name-based cache]:name cache folder:_directories' + '--path-cache[path-based cache]:path cache folder:_directories' + {-f,--fetch}'[fetch strategy]:fetch strategy:(always smart)' + {-o,--fetch-opt}'[fetch options]:fetch options:' + {-n,--narrow}'[narrow fetch]' + {-k,--keep-descendants}'[keep manifest-rev descendants checked out]' + {-r,--rebase}'[rebase checked out branch onto the new manifest-rev]' + ) + + _arguments -S $opts \ + "1:west proj:_get_west_projs" +} + +_west_list() { + local -a opts=( + {-a,--all}'[include inactive projects]' + '--manifest-path-from-yaml[print performance stats]' + {-f,--format}'[format string]:format string:' + ) + + _arguments -S $opts \ + "1:west proj:_get_west_projs" +} + +_west_manifest() { + local -a opts=( + '--resolve[resolve into single manifest]' + '--freeze[resolve into single manifest, with SHAs]' + '--validate[silently validate manifest]' + '--path[print the path to the top level manifest file]' + {-o,--out}'[output file]:output file:_files' + ) + + _arguments -S $opts +} + +_west_diff() { + local -a opts=( + {-a,--all}'[include inactive projects]' + ) + + _arguments -S $opts \ + "1:west proj:_get_west_projs" +} + +_west_status() { + local -a opts=( + {-a,--all}'[include inactive projects]' + ) + + _arguments -S $opts \ + "1:west proj:_get_west_projs" +} + +_west_forall() { + local -a opts=( + '-c[command to execute]:command:' + {-a,--all}'[include inactive projects]' + ) + + _arguments -S $opts \ + "1:west proj:_get_west_projs" +} + +_west_config() { + local -a opts=( + {-l,--list}'[list all options and values]' + {-d,--delete}'[delete an option in one config file]' + {-D,--delete-all}"[delete an option everywhere it\'s set]" + + '(mutex)' + '--system[system-wide file]' + '--global[global user-wide file]' + "--local[this workspace\'s file]" + ) + + _arguments -S $opts +} + +_west_help() { + _west_cmds +} + +_west_completion() { + + _arguments -S "1:shell:(bash zsh)" +} + +_west_boards() { + local -a opts=( + {-f,--format}'[format string]:format string:' + {-n,--name}'[name regex]:regex:' + '*--arch-root[Add an arch root]:arch root:_directories' + '*--board-root[Add a board root]:board root:_directories' + ) + + _arguments -S $opts +} + +_west_build() { + local -a opts=( + '(-b --board)'{-b,--board}'[board to build for]:board:_get_west_boards' + '(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories' + '(-f --force)'{-f,--force}'[ignore errors and continue]' + '--sysbuild[create multi-domain build system]' + '--no-sysbuild[do not create multi-domain build system]' + '(-c --cmake)'{-c,--cmake}'[force a cmake run]' + '--cmake-only[just run cmake]' + '--domain[execute build tool (make or ninja) for a given domain]:domain:' + '(-t --target)'{-t,--target}'[run build system target]:target:' + '(-T --test-item)'{-T,--test-item}'[Build based on test data in .yml]:test item:' + {-o,--build-opt}'[options to pass to build tool (make or ninja)]:tool opt:' + '(-n --just-print --dry-run --recon)'{-n,--just-print,--dry-run,--recon}"[just print build commands, don't run them]" + '(-p --pristine)'{-p,--pristine}'[pristine build setting]:pristine:(auto always never)' + ) + _arguments -S $opts \ + "1:source_dir:_directories" +} + +_west_sign() { + local -a opts=( + '(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories' + '(-q --quiet)'{-q,--quiet}'[suppress non-error output]' + '(-f --force)'{-f,--force}'[ignore errors and continue]' + '(-t --tool)'{-t,--tool}'[image signing tool name]:tool:(imgtool rimage)' + '(-p --tool-path)'{-p,--tool-path}'[path to the tool]:tool path:_directories' + '(-D --tool-data)'{-D,--tool-data}'[path to tool data]:tool data path:_directories' + '(--no-bin)--bin[produce a signed bin file]' + '(--bin)--no-bin[do not produce a signed bin file]' + '(-B --sbin)'{-B,--sbin}'[signed .bin filename]:bin filename:_files' + '(--no-hex)--hex[produce a signed hex file]' + '(--hex)--no-hex[do not produce a signed hex file]' + '(-H --shex)'{-H,--shex}'[signed .hex filename]:hex filename:_files' + ) + + _arguments -S $opts +} + +typeset -a -g _west_runner_opts=( + '(-H --context)'{-H,--context}'[print runner-specific options]' + '--board-dir[board directory]:board dir:_directories' + '--elf-file[path to zephyr.elf]:path to zephyr.elf:_files' + '--hex-file[path to zephyr.hex]:path to zephyr.hex:_files' + '--bin-file[path to zephyr.bin]:path to zephyr.bin:_files' + '--gdb[path to GDB]:path to GDB:_files' + '--openocd[path to openocd]:path to openocd:_files' + '--openocd-search[path to add to openocd search path]:openocd search:_directories' +) + +_west_flash() { + local -a opts=( + '(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories' + '(-r --runner)'{-r,--runner}'[override default runner from build-dir]:runner:' + '--skip-rebuild[do not refresh cmake dependencies first]' + '--domain[execute build tool (make or ninja) for a given domain]:domain:' + ) + + local -a all_opts=(${_west_runner_opts} ${opts}) + _arguments -S $all_opts +} + +_west_debug() { + _west_flash +} + +_west_debugserver() { + _west_flash +} + +_west_attach() { + _west_flash +} + +_west_spdx() { + local -a opts=( + '(-i --init)'{-i,--init}'[initialize CMake file-based API]' + '(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories' + '(-n --namespace-prefix)'{-n,--namespace-prefix}'[namespace prefix]:namespace prefix:' + '(-s --spdx-dir)'{-d,--spdx-dir}'[SPDX output directory]:spdx output dir:_directories' + '--analyze-includes[also analyze included header files]' + '--include-sdk[also generate SPDX document for SDK]' + ) + _arguments -S $opts +} + +_west_blobs() { + local -a blob_cmds=( + 'list[list binary blobs]' + 'fetch[fetch binary blobs]' + 'clean[clean working tree of binary blobs]' + ) + + local line state + + _arguments -S -C \ + "1: :->cmds" \ + "*::arg:->args" \ + + case "$state" in + cmds) + _values "west blob cmds" $blob_cmds + ;; + + args) + _opt_args=( ${(@kv)opt_args} ) + _call_function ret _west_blob_$line[1] + ;; + esac +} + +_west_blob_list () { + local -a opts=( + {-f,--format}'[format string]:format string:' + ) + + _arguments -S $opts \ + "1:west proj:_get_west_projs" +} + +_west_blob_fetch () { + _arguments -S "1:west proj:_get_west_projs" +} + +_west_blob_clean () { + _arguments -S "1:west proj:_get_west_projs" +} + +# don't run the completion function when being source-ed or eval-ed +if [ "$funcstack[1]" = "_west" ]; then + _west +fi + diff --git a/.zshrc.pre b/.zshrc.pre new file mode 100644 index 0000000..2a7f176 --- /dev/null +++ b/.zshrc.pre @@ -0,0 +1,2 @@ +# so that i can autoload -Uz local functions +fpath=( ~/.config/zsh/functions $fpath)