#compdef lsusb local context state line typeset -A opt_args _arguments \ '(-v --verbose)'{-v,--verbose}'[be verbose]' \ '-s[Narrow to some devices]:bus and/or devnum to show:->bus_devnum' \ '-d:vendor and product to show:->vendor_product' \ '-D:device to show:_files -g "*(%)"' \ '-t[dump the physical USB device hierarchy as a tree]' \ '(-)'{-V,--version}'[print version info and exit]' && return 0 case "$state" in (bus_devnum) local B bus D device I id descr bus_dev _call_program usb_devices lsusb \ | while IFS=" " read -r B bus D device I id descr do if [[ $B$D$I != BusDeviceID ]] then echo "Internal error: Unknown lsusb output line:" \ "$B $bus $D $device $I $id $descr" >&2 else bus_dev+=(${(M)bus%%[1-9]*}\\:${${(M)device%%[1-9]*}%:}:$descr) fi done _describe -t usb_addresses 'usb device address' bus_dev ;; (vendor_product) if ! (( ${+_cache_lsusb_devices} )) then local id name last_vendor_id while IFS=" " read -r id name do case "$id" in (*\#*|) ;; (' '*) # interface interface_name ;; (' '*) # device_id device_name _cache_lsusb_devices+=($last_vendor_id\\:${id# }:$name) ;; ([!0-9a-f]*) # Here start other entries like classes (C) and languages (L) break ;; (*) last_vendor_id=$id ;; esac done < /var/lib/usbutils/usb.ids fi _describe -t usb_device_ids 'usb device ids' _cache_lsusb_devices ;; (*) echo "Internal error: Unknown state: $state" >&2 return 1 ;; esac