#compdef nmcli
# compatible with NetworkManager 1.8.4
_networkmanager() {
local curcontext="$curcontext" state line
_arguments -C \
'(-p -pretty -t -terse)-t'{,erse}'[terse output]' \
'(-p -pretty -t -terse)-p'{,retty}'[pretty output]' \
'(-m -mode)-m'{,ode}'[output mode]:mode:(tabular multiline)' \
'(-c -colors)-c'{,olors}'[whether to use colors in output]:value:(auto yes no)' \
'(-f -fields)-f'{,ields}'[specify fields to output]:field:_nm_fields' \
'(-f -fields -g -get-values -m -mode -p -pretty -t -terse)-g'{,et-values}'[shortcut for -m tabular -t -f]:field:_nm_fields' \
'(-e -escape)-e'{,scape}'[escape column separators in values]:value:(yes no)' \
'(-a -ask)-a'{,sk}'[ask for missing parameters]' \
'(-s -show-secrets)-s'{,how-secrets}'[allow passwords to be displayed]' \
'(-w -wait)-w'{,ait}'[set time limit on wait for operations to finish]:timeout (seconds)' \
'(- *)-v'{,ersion}'[show program version]' \
'(- *)-h'{,elp}'[print help]' \
'1:command:(general networking radio connection device agent monitor help)' \
'*::arg:->args'
case $line[1] in
g*) _nm_general ;;
n*) _nm_networking ;;
r*) _nm_radio ;;
c*) _nm_connection ;;
d*) _nm_device ;;
a*) _nm_agent ;;
esac
}
_nm_fields() {
_values -s , 'field to output' \
all common \
RUNNING VERSION STATE STARTUP CONNECTIVITY NETWORKING WIFI-HW WIFI WWAN-HW WWAN \
NAME UUID TYPE TIMESTAMP TIMESTAMP-REAL AUTOCONNECT AUTOCONNECT-PRIORITY READONLY DBUS-PATH ACTIVE DEVICE STATE ACTIVE-PATH SLAVE \
DEVICE CONNECTION CON-UUID CON-PATH BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
}
_nm_general() {
_arguments "1:command:(status hostname permissions logging help)"
# TODO: provide completions for logging
}
_nm_networking() {
local curcontext="$curcontext" state line
_arguments -C \
"1:command:(on off connectivity help)" \
"*::arg:->args"
case $line[1] in
c*) _nm_networking_connectivity ;;
esac
}
_nm_networking_connectivity() {
_arguments "1:flag:(check)"
}
_nm_radio() {
_arguments \
"1:type:(all wifi wwan help)" \
"2:switch:(on off)"
}
_nm_connection() {
local curcontext="$curcontext" state line
_arguments -C \
"1:command:(show up down add modify clone edit delete monitor reload load import export help)" \
"*::arg:->args"
case $line[1] in
s*) _nm_connection_show ;;
u*) _nm_connection_up ;;
d*) _nm_connection_down ;;
# TODO: a*) _nm_connection_add ;;
m*) _nm_connection_modify ;;
c*) _nm_connection_clone ;;
e*) _nm_connection_edit ;;
de*) _nm_connection_delete ;;
mon*) _nm_connection_monitor ;;
l*) _nm_connection_load ;;
i*) _nm_connection_import ;;
ex*) _nm_connection_export ;;
esac
}
_nm_connection_show() {
# TODO: add support for --order
_arguments \
"--active" \
"1:connection:_nm_connection_specs"
}
_nm_connection_up() {
# TODO: add support for ifname, ap and passwd-file parameters
_arguments "1:connection:_nm_connection_specs"
}
_nm_connection_down() {
_arguments "1:connection:_nm_connection_specs"
}
_nm_connection_modify() {
# TODO: add support for options and properties
_arguments \
"--temporary" \
"1:connection:_nm_connection_specs"
}
_nm_connection_clone() {
_arguments \
"--temporary" \
"1:connection:_nm_connection_specs" \
"2:new name"
}
_nm_connection_edit() {
# TODO: add support for adding new connections (type and con-name parameters)
_arguments "1:connection:_nm_connection_specs"
}
_nm_connection_delete() {
_arguments "*:connection:_nm_connection_specs"
}
_nm_connection_monitor() {
_arguments "*:connection:_nm_connection_specs"
}
_nm_connection_load() {
_files
}
_nm_connection_import() {
_arguments \
"--temporary" \
"1: :(type)" \
"2:type:(vpnc openvpn pptp openconnect openswan libreswan ssh l2tp iodine)" \
"3: :(file)" \
"4:file:_files"
}
_nm_connection_export() {
_arguments \
"1:connection:_nm_connection_specs" \
"2:file:_files"
}
_nm_connection_specs() {
# TODO: add support for uuids and D-Bus paths
_nm_connection_ids
}
_nm_connection_ids() {
local -a con_ids
con_ids=(${(f)"$(_call_program nmcli nmcli -t -f name connection)"})
_describe 'select connection' con_ids
}
_nm_device() {
local curcontext="$curcontext" state line
_arguments -C \
"1:command:(status show set connect reapply modify disconnect delete monitor wifi lldp help)" \
"*::arg:->args"
case $line[1] in
sh*) _nm_device_show ;;
se*) _nm_device_set ;;
c*) _nm_device_connect ;;
r*) _nm_device_reapply ;;
mod*) _nm_device_modify ;;
d*) _nm_device_disconnect ;;
de*) _nm_device_delete ;;
m*) _nm_device_monitor ;;
w*) _nm_device_wifi ;;
l*) _nm_device_lldp ;;
esac
}
_nm_device_show() {
_arguments "1:interface:_nm_device_ifnames"
}
_nm_device_set() {
# TODO: allow specifying both options, and in any order
_arguments \
"1:interface:_nm_device_ifnames" \
"2:property:(autoconnect managed)" \
"3:switch:(yes no)"
}
_nm_device_connect() {
_arguments "1:interface:_nm_device_ifnames"
}
_nm_device_reapply() {
_arguments "1:interface:_nm_device_ifnames"
}
_nm_device_modify() {
# TODO: add support for settings
_arguments "1:interface:_nm_device_ifnames"
}
_nm_device_disconnect() {
_arguments "*:interface:_nm_device_ifnames"
}
_nm_device_delete() {
_arguments "*:interface:_nm_device_ifnames"
}
_nm_device_monitor() {
_arguments "*:interface:_nm_device_ifnames"
}
_nm_device_wifi() {
local curcontext="$curcontext" state line
_arguments -C \
"1:command:(list connect hotspot rescan)" \
"*::arg:->args"
case $line[1] in
l*) _nm_device_wifi_list ;;
c*) _nm_device_wifi_connect ;;
ho*) _nm_device_wifi_hotspot ;;
r*) _nm_device_wifi_rescan ;;
esac
}
_nm_device_wifi_list() {
# TODO: support bssid on its own
_arguments \
"1: :(ifname)" \
"2:interface:_nm_device_ifnames" \
"3: :(bssid)" \
"4:bssid:_nm_device_wifi_bssids"
}
_nm_device_wifi_connect() {
local curcontext="$curcontext" state line
_arguments -C \
"1:ssid:_nm_device_wifi_ssids" \
"*::arg:->args"
if [[ -n $line[1] ]]; then
_nm_device_wifi_connect_opts
fi
}
_nm_device_wifi_connect_opts() {
# TODO: there must be a cleaner way to implement this
local curcontext="$curcontext" state line
_arguments -C \
"1:property:(password wep-key-type ifname bssid name private hidden)" \
"*::arg:->args"
local min_line_len=2
case $line[-2] in
password)
_arguments -C "1:password" "*::arg:->args"
;;
wep-key-type)
_arguments -C "1:wep key type:(key phrase)" "*::arg:->args"
;;
ifname)
_arguments -C "1:device:_nm_device_ifnames" "*::arg:->args"
;;
bssid)
_arguments -C "1:bssid:_nm_device_wifi_bssids" "*::arg:->args"
;;
name)
_arguments -C "1:name" "*::arg:->args"
;;
private)
_arguments -C "1:private:(yes no)" "*::arg:->args"
;;
hidden)
_arguments -C "1:hidden:(yes no)" "*::arg:->args"
;;
*)
min_line_len=1
;;
esac
if [[ $#line > $min_line_len ]]; then
_nm_device_wifi_connect_opts
fi
}
_nm_device_wifi_hotspot() {
local curcontext="$curcontext" state line
_arguments -C \
"1:property:(ifname con-name ssid band channel password)" \
"*::arg:->args"
local min_line_len=2
case $line[-2] in
ifname)
_arguments -C "1:device:_nm_device_ifnames" "*::arg:->args"
;;
con-name)
_arguments -C "1:connection name" "*::arg:->args"
;;
ssid)
_arguments -C "1:ssid" "*::arg:->args"
;;
band)
_arguments -C "1:band:(a bg)" "*::arg:->args"
;;
channel)
_arguments -C "1:channel" "*::arg:->args"
;;
password)
_arguments -C "1:password" "*::arg:->args"
;;
*)
min_line_len=1
;;
esac
if [[ $#line > $min_line_len ]]; then
_nm_device_wifi_hotspot
fi
}
_nm_device_wifi_rescan() {
# TODO: support ssid on its own and multiple ssids
_arguments \
"1: :(ifname)" \
"2:interface:_nm_device_ifnames" \
"3: :(ssid)" \
"4:ssid:_nm_device_wifi_ssids"
}
_nm_device_wifi_bssids() {
local -a bssids
bssids=(${(f)"$(_call_program nmcli nmcli -t -f bssid device wifi list)"})
_describe 'select network' bssids
}
_nm_device_wifi_ssids() {
local -a ssids
ssids=(${(f)"$(_call_program nmcli nmcli -t -f ssid device wifi list)"})
_describe 'select network' ssids
}
_nm_device_lldp() {
_arguments \
"1: :(list)" \
"2: :(ifname)" \
"3:interface:_nm_device_ifnames"
}
_nm_device_ifnames() {
local -a ifnames
ifnames=(${(f)"$(_call_program nmcli nmcli -t -f device device)"})
_describe 'select device' ifnames
}
_nm_agent() {
_arguments "1:type:(secret polkit all help)"
}
_networkmanager "$@"