#compdef lsusb local usbidsline vendorid pair ret=1 local curcontext="$curcontext" state line expl typeset -A opt_args _arguments -C \ '(-v --verbose -t --tree)'{-v,--verbose}'[be verbose]' \ '-s+[filter devices by bus and/or device number]:bus and/or devnum to show' \ '-d+[filter devices by vendor/product ID]:vendor and product to show:->vendorproduct' \ '-D+[display only specified device]:device:_files -g "*(-%)" -P / -W /' \ '(-t --tree -v --verbose)'{-t,--tree}'[dump the physical USB device hierarchy as a tree]' \ '(-)'{-V,--version}'[print version information]' \ '(-)'{-h,--help}'[print help information]' && ret=0 if [[ -n $state && ${+_lsusb_vendors} -eq 0 ]]; then typeset -A _lsusb_vendors _lsusb_devices cat /usr/share/(misc|hwdata)/usb.ids | while IFS="" read usbidsline do case "$usbidsline" in ((#b)([0-9a-f]##) ##(*)) vendorid="$match[1]" _lsusb_vendors[$vendorid]="$match[2]" ;; ( (#b)([0-9a-f]##) ##(*))) pair="$vendorid:$match[1]" _lsusb_devices[${pair}]="$match[2]" ;; esac done fi _wanted products expl 'vendor ID:product ID' compadd -k _lsusb_devices && ret=0 return ret