xkb-options-zsh-completion.zsh 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #compdef -value-,XKB_DEFAULT_OPTIONS,-default-
  2. local options_yaml
  3. options_yaml="$(_call_program -l xkb-yaml xkbcli list)"
  4. case $status in
  5. 127 ) _message "xkb option completion requires xkbcli" && return 127 ;;
  6. <1->) _message "error listing xkb options" && return 1 ;;
  7. esac
  8. local yq_prog='.option_groups[] as $grp | $grp.options[].name | sub(":.*", "") as $name | "*\($name)[\($grp.description)]: :->option-\($name)"'
  9. local -Ua option_groups
  10. option_groups=( ${(@f)"$(printf '%s\n' $options_yaml | _call_program -l xkb-parse-yaml yq ${(q)yq_prog})"} )
  11. case $status in
  12. 127 )
  13. # fallback with sed
  14. local sed_options='/^option_groups:/,/^$/p'
  15. local sed_names="s/ - name: '([^']+)'/\\1/p" sed_descs="s/ description: '([^']+)'/\\1/p"
  16. local options_sed="$(printf '%s\n' $options_yaml | _call_program -l sed sed -n ${(q)sed_options})"
  17. local -a options_names=( ${(@f)"$(_call_program -l sed-names sed -En ${(q)sed_names} <<< $options_sed)"})
  18. local -a options_descs=( ${(@f)"$(_call_program -l sed-desc sed -En ${(q)sed_descs} <<< $options_sed)"})
  19. local -a xkb_options
  20. printf -v xkb_options '%s:%s' ${${options_names:s/:/\\:}:^options_descs}
  21. _describe -t xkb-option 'xkb option' xkb_options
  22. return
  23. ;;
  24. <1->) _message "error completing xkb options" && return 1 ;;
  25. esac
  26. local context state state_descr line
  27. typeset -A val_args
  28. _values -s, -S: 'xkb option' ${option_groups}
  29. if [[ $state == option-* ]]; then
  30. local optname=${state#option-}
  31. local -a xkb_options
  32. yq_prog='.option_groups[].options[] | select(.name | test("'$optname'" + ":")) | "\(.name):\(.description)"'
  33. xkb_options=( ${${(@f)"$(printf '%s\n' $options_yaml | _call_program -l xkb-parse-yaml yq ${(q)yq_prog})"}#*:} )
  34. _describe -t xkb-option 'xkb option' xkb_options -qS,
  35. fi