#compdef dotfiles.sh typeset -A opt_args # Argument definition # ------------------------------------------ _dotfiles_operations=( {-F-,--file}'[display all files added to the dotfiles directory]' {-P-,--package}'[instal, print or store packages]' '(-)'{-h,--help}'[display usage message and exit]' ) _dotfiles_file_options=( '(-F --file)'{-F,--file} '(-a --add)'{-a,--add}'[add selected file paths to the dotfiles directory]' '(-l --pull)'{-l,--pull}'[pull file(s) from the system to the dotfiles directory]' '(-s --push)'{-s,--push}'[push file(s) from the dotfiles directory to the system]' ) _dotfiles_package_options=( '(-P --package)'{-P,--package} '(-a --aur-install)'{-a,--aur-install}'[install all AUR packages of the stored list]' '(-i --install)'{-i,--install}'[install all official packages of the stored list]' '(-s --store)'{-s,--store}'[stores a list of all installed packages on the system]' ) _dotfiles_dotfile_directory_target=( '*:file:_files' ) _dotfiles_home_directory_target=( '*:file:_files -W ~/' ) # Argument handling # ------------------------------------------ function _dotfiles_file_argument_handling() { case "$tmp" in -*) _arguments -s : "$_dotfiles_file_options[@]" && result=0 ;; *) # Enable matching of dotfiles without explicitly specifying the dot setopt globdots case "$args" in *a*) _arguments -s : "$_dotfiles_home_directory_target[@]" && result=0 ;; *) _arguments -s : "$_dotfiles_dotfile_directory_target[@]" && result=0 ;; esac ;; esac } function _dotfiles_package_argument_handling() { case "$tmp" in -*) _arguments -s : "$_dotfiles_package_options[@]" && result=0 ;; *) case "$args" in P) _arguments -s : '*:package:_dotfiles_completions_tracked_packages' && result=0 ;; *) ;; esac ;; esac } if ! zmodload -s zsh/mapfile; then function _dotfiles_completions_tracked_packages() {} else function _dotfiles_completions_tracked_packages() { local -a packages packages=( "${(f@)${mapfile[packages]%$'\n'}}" ) readonly packages compadd "$@" -a packages } fi # Completion control flow # ------------------------------------------ _dotfiles.sh() { local result=1 local -a args local tmp # Get all short flags args=( ${${${(M)words:#-*}#-}:#-*} ) # Get the current flag tmp="$words[-1]" case "$args" in h*) _message -e arguments "no more arguments" ;; F*) _dotfiles_file_argument_handling ;; P*) _dotfiles_package_argument_handling ;; *) case ${(M)words:#--*} in *--file*) _dotfiles_file_argument_handling ;; *--package*) _dotfiles_package_argument_handling ;; *) _arguments -s : "$_dotfiles_operations[@]" && result=0 ;; esac ;; esac return result } _dotfiles.sh