ZSH完了時にコマンド文字列を取得する

ZSH完了時にコマンド文字列を取得する

`次のように完成したら:

$ cat _anssh
#compdef anssh

_anssh () {
    _arguments '-i[inventory file]:filename:->files'
    case "$state" in
        files)
            _anssh_inventories_show
            ;;
        *)
            _anssh_hosts_show
            ;;
    esac
}

_anssh_inventories_show () {
    local -a inventories
    inventories=("${(@f)$(find hosts -maxdepth 1 -type f -printf 'hosts/%f\n')}")
    _multi_parts / inventories
}

_anssh_hosts_show () {
    local inv=$(echo $@ | sed 's/.*\-i\s*//g' | awk '{print $1}')
    local invflag=""
    if [ "$inv" != "" ]; then
        invflag="--inventory $inv"
    fi
    local hosts=("${(s/ /)$(anssh $invflag -l)}")
    _values 'hosts' $hosts
}

機能しない部分は、定義方法(定義されている場合)_anssh_host_showによって-i異なる値を返す必要があることです。-ifromの値を抽出してみましたが$@(これはこれまでに入力した完全なコマンドであると予想しました)、$@完了コンテキストでは空です。その文字列をどのように取得しますか?

ベストアンサー1

これにより、トリックを実行できます。

#compdef anssh

local -a command

_anssh () {
    command="$words"
    _arguments '-i[inventory file]:filename:->files'
    case "$state" in
        files)
            _anssh_inventories_show
            ;;
        *)
            _anssh_hosts_show
            ;;
    esac
}

_anssh_inventories_show () {
    local -a inventories
    inventories=("${(@f)$(find hosts -maxdepth 1 -type f -printf 'hosts/%f\n')}")
    _multi_parts / inventories
}

_anssh_hosts_show () {
    local inv=$(echo $command | grep ' -i' | sed 's/.*\-i\s*//g' | awk '{print $1}')
    local invflag=""
    if [ "$inv" != "" ]; then
        invflag="-i $inv"
    fi
    local hosts=("${(s/ /)$(anssh $invflag -l)}")
    _values 'hosts' $hosts
}

_anssh

おすすめ記事