You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
2.8 KiB
133 lines
2.8 KiB
#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
|
|
|