From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15895 invoked by alias); 10 Nov 2017 00:35:19 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 42000 Received: (qmail 28683 invoked by uid 1010); 10 Nov 2017 00:35:19 -0000 X-Qmail-Scanner-Diagnostics: from mail-lf0-f53.google.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(209.85.215.53):SA:0(-1.9/5.0):. Processed in 1.54596 secs); 10 Nov 2017 00:35:19 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,HTML_MESSAGE,HTML_NONELEMENT_30_40, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_PASS, T_DKIM_INVALID autolearn=ham autolearn_force=no version=3.4.1 X-Envelope-From: andrei@shvchk.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shvchk.com; s=google; h=sender:date:from:subject:to:message-id:mime-version; bh=olWz4sfHQZ+J8hTNN/ePxh46vIfeZ6zLxg04yltlx3c=; b=e0xLAookTGomvxBhTcHPelE0Q6k+q5BsvRxdCc4AXKNy4ejaX8ZIO+jmQkFIRXk5fP c4Uaa8OveJyKbz8T6IZWYvWTBzv8+PLOcJCB5/OB6Ma4Izm3UG8o5nyPeL45ZIOmud+V NQuPmeNzgj1Zy8FYUs/AMME4BBpJBuoJeCLYw= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shevchuk.co; s=google; h=sender:date:from:subject:to:message-id:mime-version; bh=olWz4sfHQZ+J8hTNN/ePxh46vIfeZ6zLxg04yltlx3c=; b=VVz7V0WvsqD8Tul9tMo2BJwH7XiLB3jLv7IOFH8YtzuncCm1aiNoncWugkPATtrNeL aO2tB1FPwglX6YB1uNQ97z8XQIM5JuFYSTHwe/DuXiIB4n8a0DTdFCAbkBnJwUdeDnAx uBn+ludDpMWmT2ccxC9yrIYuy1YU9TW1yu+/c= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:subject:to:message-id :mime-version; bh=olWz4sfHQZ+J8hTNN/ePxh46vIfeZ6zLxg04yltlx3c=; b=d7+0xW/XdkIOYiyYWsDr86fWF9UCBb/400IlegG38fVVdiZroPwnxc4qiAsfibOj3F kVo/7lGMjQ615NRdalTffl9K4q3La5Pw4ApPGrQASFENJ30k6OpjJpdYlanPUCDDV0xJ znL9JRI3y+zbb+LMpJB0UIEJJ5qC/ikJfJuU6ye5oH38LDRrpgKZy7MutT2eTjO3kqP3 K9ZUrGDXrzP3PUBJgxdVQCeAB32/B8AfUSIM/LtC+SNP0D0JF2LtDHNVZ09pkxdtBlFw UrOhFlPF3FSJ4sGjlnqHp8EGZMM6kFRZTi+nFH6n95v69HH4t1a1j1faIjtTkdxSuEQx PdKg== X-Gm-Message-State: AJaThX5xtc8hYUynZrSWQy2wR8AUqI66AXNDmoG7j3xiR2TiBP0zI9OW NhgGiqXW9hCKOgwoLtcx1e0RY6GuyaY= X-Google-Smtp-Source: ABhQp+QPPjKgh0HKaJloU0YBAchlk5XIhCGoBkWjbZMmhMBKAN4fiTx7fB46gGcmfPeRSib/abcHfw== X-Received: by 10.46.15.2 with SMTP id 2mr917460ljp.30.1510274108455; Thu, 09 Nov 2017 16:35:08 -0800 (PST) Sender: =?UTF-8?B?0JDQvdC00YDQtdC5INCo0LXQstGH0YPQug==?= Date: Fri, 10 Nov 2017 03:35:04 +0300 From: Andrei Shevchuk Subject: PATCH: Improve Mosh completion To: zsh-workers@zsh.org Message-Id: <1510274104.17218.0@smtp.gmail.com> X-Mailer: geary/0.12-dev MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-fU3yENjgfk6VSxW/AD1s" --=-fU3yENjgfk6VSxW/AD1s Content-Type: text/plain; charset=us-ascii; format=flowed This adds ~/.ssh/config based completion support (_ssh_hosts and _ssh_users functions and userhost state handling taken without modifications from ssh completion file), existing code was just wrapped into _mosh function without modifications (except userhost state handling mentioned above). --- Andrei Shevchuk diff --git a/Completion/Unix/Command/_mosh b/Completion/Unix/Command/_mosh index 431fdbf..086aaf3 100644 --- a/Completion/Unix/Command/_mosh +++ b/Completion/Unix/Command/_mosh @@ -1,26 +1,84 @@ #compdef mosh -local curcontext="$curcontext" state line -local -a _comp_priv_prefix - -_arguments -C \ - '(-)--help[display help information]' \ - '(-)--version[display version information]' \ - "--no-init[don't set terminal init string]" \ - '--ssh=[specify ssh command to setup session]:ssh command:_normal' \ - '--port=[specify server-side port range]:port:_sequence -n 2 -s \: _ports' \ - '(-a -n)--predict=[control speculative local echo]:mode:(adaptive always never)' \ - '(--predict -n)-a[synonym for --predict=always]' \ - '(--predict -a)-n[synonym for --predict=never]' \ - '--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 - -case $state in - userhost) - _hosts || _user_at_host && return - ;; -esac - -return 1 +_mosh () { + local curcontext="$curcontext" state line expl tmp ret=1 + local -a _comp_priv_prefix + typeset -A opt_args + + _arguments -C \ + '(-)--help[display help information]' \ + '(-)--version[display version information]' \ + "--no-init[don't set terminal init string]" \ + '--ssh=[specify ssh command to setup session]:ssh command:_normal' \ + '--port=[specify server-side port range]:port:_sequence -n 2 -s \: _ports' \ + '(-a -n)--predict=[control speculative local echo]:mode:(adaptive always never)' \ + '(--predict -n)-a[synonym for --predict=always]' \ + '(--predict -a)-n[synonym for --predict=never]' \ + '--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 + + case $state in + userhost) + if compset -P '*@'; then + _wanted hosts expl 'remote host name' _ssh_hosts && ret=0 + elif compset -S '@*'; then + _wanted users expl 'login name' _ssh_users -S '' && ret=0 + else + if (( $+opt_args[-l] )); then + tmp=() + else + tmp=( 'users:login name:_ssh_users -qS@' ) + fi + _alternative \ + 'hosts:remote host name:_ssh_hosts' \ + "$tmp[@]" && ret=0 + fi + ;; + esac + + return ret +} + +_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 hosts host + while IFS=$'=\t ' read -r key hosts; do + if [[ "$key" == (#i)host ]]; then + for host in ${(z)hosts}; do + case $host in + (*[*?]*) ;; + (*) config_hosts+=("$host") ;; + esac + done + fi + done < "$config" + 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 +} + +_mosh "$@" --=-fU3yENjgfk6VSxW/AD1s--