xkb-layout-zsh-completion.zsh 1.4 KB

12345678910111213141516171819202122232425262728293031
  1. #compdef -value-,XKB_DEFAULT_LAYOUT,-default-
  2. local layouts_yaml
  3. layouts_yaml="$(_call_program -l xkb-yaml xkbcli list)"
  4. case $status in
  5. 127 ) _message "xkb layout completion requires xkbcli" && return 127 ;;
  6. <1->) _message "error listing xkb layouts" && return 1 ;;
  7. esac
  8. local yq_prog='.layouts[] | select(.variant == "") | "\(.layout):\(.description)"'
  9. local -a xkb_layouts
  10. xkb_layouts=( ${(@f)"$(printf '%s\n' $layouts_yaml | _call_program -l xkb-parse-yaml yq ${(q)yq_prog})"} )
  11. case $status in
  12. 127)
  13. local sed_layouts='/^layouts:/,/^$/p'
  14. local sed_names="s/- layout: '([^']+)'/\\1/p" sed_variant="s/ variant: '([^']*)'/v\1/p" sed_descs="s/ description: //p"
  15. local layouts_sed="$(_call_program -l sed sed -n ${(q)sed_layouts} <<< $layouts_yaml)"
  16. local -a layout_names=( ${(@f)"$(_call_program -l sed-names sed -En ${(q)sed_names} <<< $layouts_sed)"} )
  17. local -a layout_variants=( ${(@f)"$(_call_program -l sed-variant sed -En ${(q)sed_variant} <<< $layouts_sed)"} )
  18. local -a layout_descs=( ${(@f)"$(_call_program -l sed-descs sed -n ${(q)sed_descs} <<< $layouts_sed)"} )
  19. local -a xkb_layouts1 xkb_layouts2
  20. printf -v xkb_layouts1 '%s:%s' ${layout_names:^layout_variants}
  21. printf -v xkb_layouts2 '%s:%s' ${xkb_layouts1:^layout_descs}
  22. xkb_layouts=( ${${(M)xkb_layouts2:#*:v:*}:s/:v:/:} )
  23. ;;
  24. <1->) _message "error completing xkb layouts" && return 1 ;;
  25. esac
  26. _describe -t xkb-layout 'xkb layout' xkb_layouts "$@"