90 lines
1.7 KiB
Plaintext
90 lines
1.7 KiB
Plaintext
#compdef copy_files
|
|
|
|
_copy_files() {
|
|
local -a dirs
|
|
local -a cp_hosts_default
|
|
local -a used_hosts avail_hosts
|
|
local _dotfiles="${DOTFILES:-$HOME/.dotfiles}"
|
|
local i host_mode=0 host_arg_index=0
|
|
|
|
cp_hosts_default=( $(_copy_files_ssh_hosts) )
|
|
|
|
[[ -d "$_dotfiles" ]] || return 1
|
|
dirs=(${(f)"$(print -rl -- $_dotfiles/*(/N:t))"})
|
|
|
|
for (( i = 2; i < CURRENT; i++ )); do
|
|
case "${words[i]}" in
|
|
-h|--hosts)
|
|
host_mode=1
|
|
host_arg_index=$i
|
|
;;
|
|
--)
|
|
(( host_mode )) && host_mode=0
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if (( host_mode )); then
|
|
used_hosts=()
|
|
|
|
for (( i = host_arg_index + 1; i < CURRENT; i++ )); do
|
|
[[ "${words[i]}" == "--" ]] && break
|
|
used_hosts+=("${words[i]}")
|
|
done
|
|
|
|
avail_hosts=( "${(@)cp_hosts_default:|used_hosts}" )
|
|
compadd -S '' -- "${avail_hosts[@]}" --
|
|
return
|
|
fi
|
|
|
|
_describe -t dotfiles 'dotfiles subdirectory' dirs
|
|
compadd -S '' -- -h --hosts
|
|
}
|
|
|
|
_copy_files_ssh_hosts() {
|
|
local cfg="${HOME}/.ssh/config"
|
|
[[ -r "$cfg" ]] || return 0
|
|
|
|
awk '
|
|
BEGIN {
|
|
in_block = 0
|
|
has_hostname = 0
|
|
aliases = ""
|
|
}
|
|
|
|
/^[[:space:]]*#/ { next }
|
|
/^[[:space:]]*$/ { next }
|
|
|
|
tolower($1) == "host" {
|
|
if (in_block && has_hostname && aliases != "") {
|
|
print aliases
|
|
}
|
|
|
|
in_block = 1
|
|
has_hostname = 0
|
|
aliases = ""
|
|
|
|
for (i = 2; i <= NF; i++) {
|
|
if ($i ~ /[*?\[]/) {
|
|
continue
|
|
}
|
|
aliases = aliases $i "\n"
|
|
}
|
|
next
|
|
}
|
|
|
|
in_block && tolower($1) == "hostname" {
|
|
has_hostname = 1
|
|
next
|
|
}
|
|
|
|
END {
|
|
if (in_block && has_hostname && aliases != "") {
|
|
print aliases
|
|
}
|
|
}
|
|
' "$cfg" | awk '!seen[$0]++'
|
|
}
|
|
|
|
_copy_files "$@"
|