bash 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. # vim:fdm=marker foldlevel=0 tabstop=2 shiftwidth=2 filetype=bash
  2. # This file is in the public domain.
  3. _arch_compgen() {
  4. local i r
  5. COMPREPLY=($(compgen -W '$*' -- "$cur"))
  6. for ((i=1; i < ${#COMP_WORDS[@]}-1; i++)); do
  7. for r in ${!COMPREPLY[@]}; do
  8. if [[ ${COMP_WORDS[i]} = ${COMPREPLY[r]} ]]; then
  9. unset 'COMPREPLY[r]'; break
  10. fi
  11. done
  12. done
  13. }
  14. _arch_ptr2comp() {
  15. local list= x y
  16. for x; do
  17. for y in '0 --' '1 -'; do
  18. eval 'set -- ${'$x'[${y% *}]}'
  19. list+=\ ${@/#/${y#* }}
  20. done
  21. done
  22. _arch_compgen $list
  23. }
  24. _arch_incomp() {
  25. local r="\s-(-${1#* }\s|\w*${1% *})"; [[ $COMP_LINE =~ $r ]]
  26. }
  27. _pacman_keyids() {
  28. \pacman-key --list-keys 2>/dev/null | awk '
  29. $1 == "pub" {
  30. # key id
  31. split($2, a, "/"); print a[2]
  32. }
  33. $1 == "uid" {
  34. # email
  35. if (match($NF, /<[^>]+>/))
  36. print substr($NF, RSTART + 1, RLENGTH - 2)
  37. }'
  38. }
  39. _pacman_pkg() {
  40. _arch_compgen "$(
  41. if [[ $2 ]]; then
  42. \pacman -$1 2>/dev/null | \cut -d' ' -f1 | \sort -u
  43. else
  44. \pacman -$1 2>/dev/null
  45. fi
  46. )"
  47. }
  48. _yay() {
  49. local common core cur database prev query remove sync upgrade yays print o
  50. COMPREPLY=()
  51. _get_comp_words_by_ref cur prev
  52. database=('asdeps asexplicit')
  53. files=('list machinereadable owns search refresh regex' 'l o s x y')
  54. query=('changelog check deps explicit file foreign groups info list owns
  55. search unrequired upgrades' 'c e g i k l m o p s t u')
  56. remove=('cascade dbonly nodeps assume-installed nosave print recursive unneeded' 'c n p s u')
  57. sync=('asdeps asexplicit clean dbonly downloadonly force groups ignore ignoregroup
  58. info list needed nodeps assume-installed print refresh recursive search sysupgrade'
  59. 'c g i l p s u w y')
  60. upgrade=('asdeps asexplicit force needed nodeps assume-installed print recursive' 'p')
  61. yays=('clean gendb' 'c')
  62. print=('complete defaultconfig config numberupgrades stats upgrades news' 'c d g n
  63. s u w')
  64. common=('arch cachedir color config confirm dbpath debug gpgdir help hookdir logfile
  65. noconfirm noprogressbar noscriptlet quiet save mflags buildir editor
  66. makepkg pacman tar git gpg gpgflags config requestsplitn sudoloop nosudoloop
  67. redownload noredownload redownloadall rebuild rebuildall rebuildtree norebuild
  68. sortby answerclean answerdiff answeredit answerupgrade noanswerclean noanswerdiff
  69. noansweredit noanswerupgrade cleanmenu diffmenu editmenu upgrademenu
  70. nocleanmenu nodiffmenu noupgrademenu provides noprovides pgpfetch nopgpfetch
  71. useask nouseask combinedupgrade nocombinedupgrade root verbose aur repo'
  72. 'a b d h q r v')
  73. core=('database files help query remove sync upgrade version' 'D F Q R S U V h')
  74. for o in 'D database' 'F files' 'Q query' 'R remove' 'S sync' 'U upgrade' 'Y yays' 'P print'; do
  75. _arch_incomp "$o" && break
  76. done
  77. if [[ $? != 0 ]]; then
  78. _arch_ptr2comp core
  79. elif [[ ! $prev =~ ^-\w*[Vbhr] &&
  80. ! $prev = --@(cachedir|color|config|dbpath|help|hookdir|gpgdir|logfile|root|version) ]]
  81. then
  82. [[ $cur = -* ]] && _arch_ptr2comp ${o#* } common ||
  83. case ${o% *} in
  84. D|R)
  85. _pacman_pkg Qq;;
  86. F)
  87. _arch_incomp 'l list' && _pacman_pkg Slq;
  88. ;;
  89. Q)
  90. { _arch_incomp 'g groups' && _pacman_pkg Qg sort; } ||
  91. { _arch_incomp 'p file' && _pacman_file; } ||
  92. _arch_incomp 'o owns' || _arch_incomp 'u upgrades' ||
  93. _pacman_pkg Qq;;
  94. S)
  95. { _arch_incomp 'g groups' && _pacman_pkg Sg; } ||
  96. { _arch_incomp 'l list' && _arch_compgen "$(yay -Pc | \sort -u)"; } ||
  97. _arch_compgen "$(yay -Pc )";;
  98. U)
  99. _pacman_file;;
  100. esac
  101. fi
  102. true
  103. }
  104. _pacman_file() {
  105. compopt -o filenames; _filedir 'pkg.tar*'
  106. }
  107. complete -F _yay -o default yay
  108. # ex:et ts=2 sw=2 ft=sh