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