zsh-workers
 help / color / mirror / code / Atom feed
From: Haakon Riiser <haakon.riiser@netview.no>
To: Haakon Riiser <haakon.riiser@fys.uio.no>,
	zsh-workers@zsh.org, Peter.Stephenson@csr.com
Subject: Re: New completion function (nmcli) and patch for _ffmpeg
Date: Mon, 7 Nov 2011 22:35:25 +0100	[thread overview]
Message-ID: <CAHJ3XyDJp_Cbzt4Sc_gYP=yk2Y-wCRvWpa_yOK7TXWPuD9w8cw@mail.gmail.com> (raw)
In-Reply-To: <20111107194600.GA3526@soljaris10.fritz.box>

[-- Attachment #1: Type: text/plain, Size: 942 bytes --]

On Mon, Nov 7, 2011 at 20:46, Sebastian Tramp
<tramp@informatik.uni-leipzig.de> wrote:
> On Mon, Nov 07, 2011 at 07:05:36PM +0100, Haakon Riiser wrote:
>
>> Here's a new completion function for nmcli, the command line interface
>> to Linux' Network Manager. [...]
>
> Haakon,
>
> +1 - like it very much.
> Tested with an older 0.8.3.998 and works smooth!
>
> thank you

Glad to hear it was immediately useful to someone. :)

Anyway, I have an updated version already. There are no changes to the
completion itself, I've only tried to make it more portable and in
line with other completion functions:

* Use _call_program so that users can override the calls

* Use _describe, _wanted and _message instead of compadd directly (to
avoid using ANSI escape codes to set the bold attribute in the
description line)

* Use _net_interfaces to generate completion for network interfaces

* Fixed some weird indenting

That's it for now.

--
 Haakon

[-- Attachment #2: _nmcli --]
[-- Type: application/octet-stream, Size: 8973 bytes --]

#compdef nmcli

local context state line expl
typeset -A opt_args

if [[ -z $_nmcli_version ]]; then
    _nmcli_version="${"$(_call_program nmcli $words[1] --version)"##*version }"
fi

(( $+functions[_nmcli_is_running] )) || _nmcli_is_running() {
    [[ $(_call_program nmcli $words[1] -f running nm) != *'not running'* ]]
}

(( $+functions[_nmcli_con_ids] )) || _nmcli_con_ids() {
    _nmcli_is_running || return
    local -a con_ids
    con_ids=(${(f)"$(_call_program nmcli $words[1] -f name con)"})
    con_ids=(${con_ids[2,-2]})
    con_ids=(${con_ids[@]%%\ ##})
    _describe 'select connection' con_ids
}

(( $+functions[_nmcli_con_uuids] )) || _nmcli_con_uuids() {
    _nmcli_is_running || return
    local -a con_uuids
    con_uuids=(${(f)"$(_call_program nmcli $words[1] -f uuid con)"})
    con_uuids=(${con_uuids[2,-2]})
    con_uuids=(${con_uuids[@]%%\ ##})
    _describe 'select connection' con_uuids
}
 
(( $+functions[_nmcli_objects] )) || _nmcli_objects() {
    local -a objects_array
    objects_array=(
        'nm:NetworkManager status'
        'con:NetworkManager connections'
        'dev:devices managed by NetworkManager'
    )
    _describe 'nmcli object' objects_array
}

(( $+functions[_nmcli_nm] )) || _nmcli_nm() {
    local -a nm_array
    nm_array=(
        'status:show overall status of NetworkManager'
        'enable:get status or enable/disable networking'
        'sleep:get sleep status or put to sleep/awake NetworkManager'
        'wifi:inquire or set status of WiFi in NetworkManager'
        'wwan:inquire or set status of WWAN in NetworkManager'
    )
    _describe 'inquire and change state of NetworkManager' nm_array
}

(( $+functions[_nmcli_con] )) || _nmcli_con() {
    local -a con_array
    con_array=(
        'list:list configured connections'
        'status:print status of active connections'
        'up:activate a connection'
        'down:deactivate a connection'
    )
    if [[ $_nmcli_version == 0.9.[1-9]* ]]; then
        con_array[5]="delete:delete a connection"
    fi
    _describe "get information about NetworkManager's connections" con_array
}

(( $+functions[_nmcli_con_list] )) || _nmcli_con_list() {
    local -a con_list_array
    con_list_array=(
        'id:get details on connection specified by id'
        'uuid:get details on connection specified by uuid'
    )
    if [[ $_nmcli_version == 0.8* ]]; then
        con_list_array[3]='system:only list system connections'
        con_list_array[4]='user:only list user connections'
    fi
    _describe 'list configured connections' con_list_array
}

(( $+functions[_nmcli_con_up] )) || _nmcli_con_up() {
    local -a con_up_array
    con_up_array=(
        'id:activate connection specified by id'
        'uuid:activate connection specified by uuid'
    )
    _describe 'activate connection by id or uuid' con_up_array
}

(( $+functions[_nmcli_con_down] )) || _nmcli_con_down() {
    local -a con_down_array
    con_down_array=(
        'id:deactivate connection specified by id'
        'uuid:deactivate connection specified by uuid'
    )
    _describe 'deactivate connection by id or uuid' con_down_array
}

(( $+functions[_nmcli_con_delete] )) || _nmcli_con_delete() {
    local -a con_delete_array
    con_delete_array=(
        'id:delete connection specified by id'
        'uuid:delete connection specified by uuid'
    )
    _describe 'delete connection by id or uuid' con_delete_array
}

(( $+functions[_nmcli_con_up_extraargs] )) || _nmcli_con_up_extraargs() {
    local -a con_up_extraargs_array
    con_up_extraargs_array=(
        'iface:require a particular interface'
        'ap:require a specific access point'
        '--nowait:don''t wait for command completion'
        '--timeout:specify how long to wait for operation to complete'
    )
    _describe 'extra options for "con up"' con_up_extraargs_array
}

(( $+functions[_nmcli_dev_disconnect_extraargs] )) || _nmcli_dev_disconnect_extraargs() {
    local -a dev_disconnect_extraargs_array
    dev_disconnect_extraargs_array=(
        '--nowait:don''t wait for command completion'
        '--timeout:specify how long to wait for operation to complete'
    )
    _describe 'extra options for "dev disconnect"' dev_disconnect_extraargs_array
}

(( $+functions[_nmcli_dev_wifi_list] )) || _nmcli_dev_wifi_list() {
    local -a dev_wifi_list_array
    dev_wifi_list_array=(
        'iface:list APs for a particular interface'
    )
    if [[ $_nmcli_version == 0.8* || $_nmcli_version == 0.9.0* ]]; then
        dev_wifi_list_array[2] = 'hwaddr:list a specific AP by MAC address'
    elif [[ $_nmcli_version == 0.9.[1-9]* ]]; then
        dev_wifi_list_array[2] = 'bssid:list a specific AP by BSSID'
    fi
    _describe 'options for specifying the AP to list' dev_wifi_list_array
}

(( $+functions[_nmcli_dev] )) || _nmcli_dev() {
    local -a dev_array
    dev_array=(
        'status:print status of devices'
        'list:get detailed information about devices'
        'disconnect:disconnect device and prevent it from automatically activating'
        'wifi:list available WiFi access points'
    )
    _describe "get information about devices" dev_array
}

(( $+functions[_nmcli_truefalse] )) || _nmcli_truefalse() {
    _wanted boolean expl 'use true/false to modify (nothing = query status)' compadd true false
}

(( $+functions[_nmcli_onoff] )) || _nmcli_onoff() {
    _wanted onoff expl 'use on/off to modify (nothing = query status)' compadd on off
}

local w1="${words[$#words - 1]}"
local w2="${words[$#words - 2]}"
local w3="${words[$#words - 3]}"
local w4="${words[$#words - 4]}"

if [[ $w2 == nm && $w1 == (sleep|enable) ]]; then
    _nmcli_truefalse && return
elif [[ $w2 == nm && $w1 == (wifi|wwan) ]]; then
    _nmcli_onoff && return
elif [[ $w1 == nm ]]; then
    _nmcli_nm && return
elif [[ $w3 == con && $w2 == list && $w1 == id ]]; then
    _nmcli_con_ids && return
elif [[ $w3 == con && $w2 == list && $w1 == uuid ]]; then
    _nmcli_con_uuids && return
elif [[ $w2 == con && $w1 == list ]]; then
    _nmcli_con_list && return
elif [[ $w3 == con && $w2 == (up|down) && $w1 == id ]]; then
    _nmcli_con_ids && return
elif [[ $_nmcli_version == 0.9.[1-9]* && $w3 == con && $w2 == delete && $w1 == id ]]; then
    _nmcli_con_ids && return
elif [[ $w3 == con && $w2 == (up|down) && $w1 == uuid ]]; then
    _nmcli_con_uuids && return
elif [[ $_nmcli_version == 0.9.[1-9]* && $w3 == con && $w2 == delete && $w1 == uuid ]]; then
    _nmcli_con_uuids && return
elif [[ ${(pj:\0:)words} == *$'\0con\0up\0'(id|uuid)$'\0'* ]]; then
     if [[ $w1 == iface ]]; then
         _net_interfaces && return
     elif [[ $w1 == ap ]]; then
         _message -e descriptions 'enter MAC address' && return
     elif [[ $w1 == --timeout ]]; then
         _message -e descriptions 'enter timeout' && return
     else
         _nmcli_con_up_extraargs && return
     fi
elif [[ $w2 == con && $w1 == up ]]; then
    _nmcli_con_up && return
elif [[ $w2 == con && $w1 == down ]]; then
    _nmcli_con_down && return
elif [[ $_nmcli_version == 0.9.[1-9]* && $w2 == con && $w1 == delete ]]; then
    _nmcli_con_delete && return
elif [[ $w1 == con ]]; then
    _nmcli_con && return
elif [[ $w3 == dev && $w2 == (list|disconnect) && $w1 == iface ]]; then
    _net_interfaces && return
elif [[ ${(pj:\0:)words} == *$'\0dev\0disconnect\0iface\0'* ]]; then
     if [[ $w1 == --timeout ]]; then
         _message -e descriptions 'enter timeout' && return
     else
         _nmcli_dev_disconnect_extraargs && return
     fi
elif [[ $w2 == dev && $w1 == list ]]; then
    compadd iface && return
elif [[ $w2 == dev && $w1 == disconnect ]]; then
    compadd iface && return
elif [[ $w4 == dev && $w3 == wifi && $w2 == list && $w1 == iface ]]; then
    _net_interfaces && return
elif [[ $w4 == dev && $w3 == wifi && $w2 == list && $w1 == hwaddr ]]; then
    _message -e descriptions 'enter MAC address' && return
elif [[ $w3 == dev && $w2 == wifi && $w1 == list ]]; then
    _nmcli_dev_wifi_list && return
elif [[ $w2 == dev && $w1 == wifi ]]; then
    compadd list && return
elif [[ $w1 == dev ]]; then
    _nmcli_dev && return
else
    _arguments \
      {'(--terse)-t','(-t)--terse'}'[terse output]' \
      {'(--pretty)-p','(-p)--pretty'}'[pretty output]' \
      {'(--mode)-m','(-m)--mode'}'[output mode]:output mode:(tabular multiline)' \
      {'(--fields)-f','(-f)--fields'}'[specify fields to output]: :->fields' \
      {'(--escape)-e','(-e)--escape'}'[escape columns separators in values]:escape columns separators in values:(yes no)' \
      {'(--version)-v','(-v)--version'}'[show program version]' \
      {'(--help)-h','(-h)--help'}'[print this help]' \
      '*::nmcli object:_nmcli_objects' \
      && return
fi

[[ "$state" == "fields" ]] &&
 _values -s , 'fields to be printed' \
   all common \
   autoconnect dbus-path device name net-enabled readonly running \
   scope state timestamp timestamp-real type uuid wifi wifi-hardware \
   wwan wwan-hardware \
   && return

      reply	other threads:[~2011-11-07 21:41 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-07 18:05 Haakon Riiser
2011-11-07 19:46 ` Sebastian Tramp
2011-11-07 21:35   ` Haakon Riiser [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAHJ3XyDJp_Cbzt4Sc_gYP=yk2Y-wCRvWpa_yOK7TXWPuD9w8cw@mail.gmail.com' \
    --to=haakon.riiser@netview.no \
    --cc=Peter.Stephenson@csr.com \
    --cc=haakon.riiser@fys.uio.no \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).