From 4977ec13982bc851668e85924e30a57c4e304b6e Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Sat, 24 Mar 2018 00:09:12 +0100 Subject: 42491 based on 42000 (Andrei Shevchuk): factor ssh host completion for use for mosh and git --- Completion/Unix/Command/_git | 4 ---- Completion/Unix/Command/_mosh | 16 ++++++++++++---- Completion/Unix/Command/_ssh | 42 ----------------------------------------- Completion/Unix/Type/_ssh_hosts | 41 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 50 deletions(-) create mode 100644 Completion/Unix/Type/_ssh_hosts (limited to 'Completion') diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git index 4df851c98..0eb16987d 100644 --- a/Completion/Unix/Command/_git +++ b/Completion/Unix/Command/_git @@ -6892,10 +6892,6 @@ __git_tree_files () { (( $+functions[__git_remote_repositories] )) || __git_remote_repositories () { - local service - - service= _ssh - if compset -P '*:'; then _remote_files -/ -- ssh else diff --git a/Completion/Unix/Command/_mosh b/Completion/Unix/Command/_mosh index 431fdbf9e..aa97587bb 100644 --- a/Completion/Unix/Command/_mosh +++ b/Completion/Unix/Command/_mosh @@ -1,6 +1,6 @@ #compdef mosh -local curcontext="$curcontext" state line +local curcontext="$curcontext" state line expl ret=1 local -a _comp_priv_prefix _arguments -C \ @@ -15,12 +15,20 @@ _arguments -C \ '--server[specify command to run server helper]:remote file:_files' \ '--client[specify command to run client helper]:_command_names -e' \ '1:remote host name:->userhost' \ - '*:::args:_normal' && return + '*:::args:_normal' && ret=0 case $state in userhost) - _hosts || _user_at_host && return + if compset -P '*@'; then + _wanted hosts expl 'remote host name' _ssh_hosts && ret=0 + elif compset -S '@*'; then + _wanted users expl 'login name' _combination -s '[:@]' my-accounts users-hosts users -S '' && ret=0 + else + _alternative \ + 'hosts:remote host name:_ssh_hosts' \ + 'users:login name:_combination -s "[:@]" my-accounts users-hosts users -qS@' && ret=0 + fi ;; esac -return 1 +return ret diff --git a/Completion/Unix/Command/_ssh b/Completion/Unix/Command/_ssh index 8a122a5b3..20a5536ee 100644 --- a/Completion/Unix/Command/_ssh +++ b/Completion/Unix/Command/_ssh @@ -647,46 +647,4 @@ _ssh_users () { _combination -s '[:@]' my-accounts users-hosts users "$@" } -_ssh_hosts () { - local -a config_hosts - local config - integer ind - - # If users-hosts matches, we shouldn't complete anything else. - if [[ "$IPREFIX" == *@ ]]; then - _combination -s '[:@]' my-accounts users-hosts "users=${IPREFIX/@}" hosts "$@" && return - else - _combination -s '[:@]' my-accounts users-hosts \ - ${opt_args[-l]:+"users=${opt_args[-l]:q}"} hosts "$@" && return - fi - if (( ind = ${words[(I)-F]} )); then - config=${~words[ind+1]} 2>/dev/null - else - config="$HOME/.ssh/config" - fi - if [[ -r $config ]]; then - local key line host - local -a lines=("${(@f)$(<"$config")}") 2>/dev/null - while (($#lines)); do - IFS=$'=\t ' read -r key line <<<"${lines[1]}" - case "$key" in - ((#i)include) - lines[1]=("${(@f)$(cd $HOME/.ssh; cat ${(z)~line})}") 2>/dev/null;; - ((#i)host(|name)) - for host in ${(z)line}; do - case $host in - (*[*?]*) ;; - (*) config_hosts+=("$host") ;; - esac - done ;& - (*) shift lines;; - esac - done - if (( ${#config_hosts} )); then - _wanted hosts expl 'remote host name' \ - compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts - fi - fi -} - _ssh "$@" diff --git a/Completion/Unix/Type/_ssh_hosts b/Completion/Unix/Type/_ssh_hosts new file mode 100644 index 000000000..e20142cfd --- /dev/null +++ b/Completion/Unix/Type/_ssh_hosts @@ -0,0 +1,41 @@ +#autoload + +local -a config_hosts +local config +integer ind + +# If users-hosts matches, we shouldn't complete anything else. +if [[ "$IPREFIX" == *@ ]]; then + _combination -s '[:@]' my-accounts users-hosts "users=${IPREFIX/@}" hosts "$@" && return +else + _combination -s '[:@]' my-accounts users-hosts \ + ${opt_args[-l]:+"users=${opt_args[-l]:q}"} hosts "$@" && return +fi +if (( ind = ${words[(I)-F]} )); then + config=${~words[ind+1]} 2>/dev/null +else + config="$HOME/.ssh/config" +fi +if [[ -r $config ]]; then + local key line host + local -a lines=("${(@f)$(<"$config")}") 2>/dev/null + while (($#lines)); do + IFS=$'=\t ' read -r key line <<<"${lines[1]}" + case "$key" in + ((#i)include) + lines[1]=("${(@f)$(cd $HOME/.ssh; cat ${(z)~line})}") 2>/dev/null;; + ((#i)host(|name)) + for host in ${(z)line}; do + case $host in + (*[*?]*) ;; + (*) config_hosts+=("$host") ;; + esac + done ;& + (*) shift lines;; + esac + done + if (( ${#config_hosts} )); then + _wanted hosts expl 'remote host name' \ + compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts + fi +fi -- cgit 1.4.1