1#compdef xmodmap 2 3local curcontext="$curcontext" state line ret=1 4typeset -A opt_args 5 6_x_arguments -C \ 7 -{help,grammar,verbose,quiet} \ 8 '-n[only show what would be done]' \ 9 '*-e[specify expression]:expression:->expr' \ 10 '-pm[print modifier map]' \ 11 '-pk[print keymap table]' \ 12 '-pke[print keymap table as expressions]' \ 13 '-pp[print pointer map]' \ 14 ':X mapping file:_files' && ret=0 15 16if [[ -n "$state" ]]; then 17 local expl expr="${PREFIX##[ ]#}" what suf 18 19 if compset -P '[^ ]##[ ]##'; then 20 case "$expr" in 21 keycode*) 22 if compset -P '*=[ ]#'; then 23 compset -P '*[ ]' 24 what=ksyms 25 elif [[ "$expr" = *[\ \ ]##[^\ \ ]##[\ \ ] ]]; then 26 IPREFIX="${IPREFIX}${PREFIX}" 27 PREFIX='' 28 compadd -S ' ' '=' && ret=0 29 else 30 _message -e keys 'key code or `any'"'" 31 fi 32 ;; 33 keysym*) 34 if compset -P '*=[ ]#'; then 35 compset -P '*[ ]' 36 what=ksyms 37 elif [[ "$expr" = *[\ \ ]##[^\ \ ]##[\ \ ] ]]; then 38 IPREFIX="${IPREFIX}${PREFIX}" 39 PREFIX='' 40 compadd -S ' ' '=' && ret=0 41 else 42 what=ksym-eq 43 fi 44 ;; 45 clear*) 46 what=mods 47 ;; 48 (add|remove)*) 49 if compset -P '*[ ]##'; then 50 what=ksyms 51 else 52 what=mods-eq 53 fi 54 ;; 55 pointer*) 56 if compset -P '*=[ ]#'; then 57 compset -P '*[ ]' 58 _description values expl 'button code' 59 compadd "$expl[@]" -qS ' ' 1 2 3 4 5 default 60 return 61 else 62 IPREFIX="${IPREFIX}${PREFIX}" 63 PREFIX='' 64 compadd -S ' ' '=' && ret=0 65 fi 66 ;; 67 esac 68 69 if [[ "$what" = *eq* ]]; then 70 suf=(-S ' = ') 71 elif [[ "$what" = *ksyms* ]]; then 72 if [[ -n "$compstate[quote]" ]]; then 73 suf=(-S "$compstate[quote] " -r "$compstate[quote] ") 74 else 75 suf=(-qS ' ') 76 fi 77 else 78 suf=() 79 fi 80 81 [[ "$what" = *mods* ]] && _x_modifier "$suf[@]" && ret=0 82 [[ "$what" = *ksym* ]] && _x_keysym "$suf[@]" && ret=0 83 84 else 85 _tags commands 86 while _tags; do 87 while _next_label commands expl command; do 88 compadd "$expl[@]" -S ' ' keycode keysym clear add remove && ret=0 89 compadd "$expl[@]" -S ' = ' pointer && ret=0 90 done 91 (( ret )) || return 0 92 done 93 fi 94fi 95 96return ret 97