# completion settings for the bindkey built-in
# written by magicant
# vim: set ft=sh ts=8 sts=8 sw=8 noet:

complete -C "$1" -X -F comp/bindkey

complete -C "$1" -O a -O --vi-command \
	-D "change or print vi-command-mode key bindings"
complete -C "$1" -O e -O --emacs \
	-D "change or print emacs-mode key bindings"
complete -C "$1" -O l -O --list \
	-D "print all key binding command names"
complete -C "$1" -O v -O --vi-insert \
	-D "change or print vi-insert-mode key bindings"
complete -C "$1" -O --help

function comp/bindkey {
	# skip options
	shift
	while [ $# -gt 1 ]; do
		case "$1" in
			--)  shift; break;;
			-?*) shift;;
			*)   break;;
		esac
	done

	if [ $# -le 1 ]; then
		# complete a key sequence
		typeset word="${@[-1]}"
		word=${word//\\\\/}
		case "$word" in (*\\*)
			word=\\${word##*\\}
			complete -W "$word"
			complete '\\' \
				-D "backslash"
			complete '\B' \
				-D "backspace"
			complete '\D' \
				-D "down arrow"
			complete '\E' \
				-D "end"
			complete '\H' \
				-D "home"
			complete '\I' \
				-D "insert"
			complete '\L' \
				-D "left arrow"
			complete '\N' \
				-D "page-down"
			complete '\P' \
				-D "page-up"
			complete '\R' \
				-D "right arrow"
			complete '\U' \
				-D "up arrow"
			complete '\X' \
				-D "delete"
			complete '\!' \
				-D "INTR (normally Ctrl-C)"
			complete '\#' \
				-D "EOF (normally Ctrl-D)"
			complete '\$' \
				-D "KILL (normally Ctrl-U)"
			complete '\?' \
				-D "ERASE (normally Ctrl-H)"
			complete '\^@' \
				-D "Ctrl-@"
			complete '\^A' \
				-D "Ctrl-A"
			complete '\^B' \
				-D "Ctrl-B"
			complete '\^C' \
				-D "Ctrl-C"
			complete '\^D' \
				-D "Ctrl-D"
			complete '\^E' \
				-D "Ctrl-E"
			complete '\^F' \
				-D "Ctrl-F"
			complete '\^G' \
				-D "Ctrl-G"
			complete '\^H' \
				-D "Ctrl-H"
			complete '\^I' \
				-D "Ctrl-I (tab)"
			complete '\^J' \
				-D "Ctrl-J (newline)"
			complete '\^K' \
				-D "Ctrl-K"
			complete '\^L' \
				-D "Ctrl-L"
			complete '\^M' \
				-D "Ctrl-M (carriage return)"
			complete '\^N' \
				-D "Ctrl-N"
			complete '\^O' \
				-D "Ctrl-O"
			complete '\^P' \
				-D "Ctrl-P"
			complete '\^Q' \
				-D "Ctrl-Q"
			complete '\^R' \
				-D "Ctrl-R"
			complete '\^S' \
				-D "Ctrl-S"
			complete '\^T' \
				-D "Ctrl-T"
			complete '\^U' \
				-D "Ctrl-U"
			complete '\^V' \
				-D "Ctrl-V"
			complete '\^W' \
				-D "Ctrl-W"
			complete '\^X' \
				-D "Ctrl-X"
			complete '\^Y' \
				-D "Ctrl-Y"
			complete '\^Z' \
				-D "Ctrl-Z"
			complete '\^[' \
				-D "Ctrl-[ (escape)"
			complete '\^\' \
				-D 'Ctrl-\'
			complete '\^]' \
				-D "Ctrl-]"
			complete '\^^' \
				-D "Ctrl-^"
			complete '\^_' \
				-D "Ctrl-_"
			complete '\^?' \
				-D "Ctrl-?"
			complete '\F00' \
				-D "F0"
			complete '\F01' \
				-D "F1"
			complete '\F02' \
				-D "F2"
			complete '\F03' \
				-D "F3"
			complete '\F04' \
				-D "F4"
			complete '\F05' \
				-D "F5"
			complete '\F06' \
				-D "F6"
			complete '\F07' \
				-D "F7"
			complete '\F08' \
				-D "F8"
			complete '\F09' \
				-D "F9"
			complete '\F10' \
				-D "F10"
			complete '\F11' \
				-D "F11"
			complete '\F12' \
				-D "F12"
			complete '\F13' \
				-D "F13"
			complete '\F14' \
				-D "F14"
			complete '\F15' \
				-D "F15"
			complete '\F16' \
				-D "F16"
			complete '\F17' \
				-D "F17"
			complete '\F18' \
				-D "F18"
			complete '\F19' \
				-D "F19"
			complete '\F20' \
				-D "F20"
			complete '\F21' \
				-D "F21"
			complete '\F22' \
				-D "F22"
			complete '\F23' \
				-D "F23"
			complete '\F24' \
				-D "F24"
			complete '\F25' \
				-D "F25"
			complete '\F26' \
				-D "F26"
			complete '\F27' \
				-D "F27"
			complete '\F28' \
				-D "F28"
			complete '\F29' \
				-D "F29"
			complete '\F30' \
				-D "F30"
			complete '\F31' \
				-D "F31"
			complete '\F32' \
				-D "F32"
			complete '\F33' \
				-D "F33"
			complete '\F34' \
				-D "F34"
			complete '\F35' \
				-D "F35"
			complete '\F36' \
				-D "F36"
			complete '\F37' \
				-D "F37"
			complete '\F38' \
				-D "F38"
			complete '\F39' \
				-D "F39"
			complete '\F40' \
				-D "F40"
			complete '\F41' \
				-D "F41"
			complete '\F42' \
				-D "F42"
			complete '\F43' \
				-D "F43"
			complete '\F44' \
				-D "F44"
			complete '\F45' \
				-D "F45"
			complete '\F46' \
				-D "F46"
			complete '\F47' \
				-D "F47"
			complete '\F48' \
				-D "F48"
			complete '\F49' \
				-D "F49"
			complete '\F50' \
				-D "F50"
			complete '\F51' \
				-D "F51"
			complete '\F52' \
				-D "F52"
			complete '\F53' \
				-D "F53"
			complete '\F54' \
				-D "F54"
			complete '\F55' \
				-D "F55"
			complete '\F56' \
				-D "F56"
			complete '\F57' \
				-D "F57"
			complete '\F58' \
				-D "F58"
			complete '\F59' \
				-D "F59"
			complete '\F60' \
				-D "F60"
			complete '\F61' \
				-D "F61"
			complete '\F62' \
				-D "F62"
			complete '\F63' \
				-D "F63"
			complete '\a1' \
				-D "keypad upper-left"
			complete '\a3' \
				-D "keypad upper-right"
			complete '\b2' \
				-D "keypad center"
			complete '\c1' \
				-D "keypad lower-left"
			complete '\c3' \
				-D "keypad lower-right"
			complete '\ca' \
				-D "clear all tabs"
			complete '\cl' \
				-D "close"
			complete '\cn' \
				-D "cancel"
			complete '\co' \
				-D "command"
			complete '\cp' \
				-D "copy"
			complete '\cr' \
				-D "create"
			complete '\cs' \
				-D "clear screen"
			complete '\ct' \
				-D "clear tab"
			complete '\dl' \
				-D "delete line"
			complete '\ei' \
				-D "exit insert mode"
			complete '\el' \
				-D "clear to end of line"
			complete '\es' \
				-D "clear to end of screen"
			complete '\et' \
				-D "enter (send)"
			complete '\fd' \
				-D "find"
			complete '\hp' \
				-D "help"
			complete '\il' \
				-D "insert line"
			complete '\ll' \
				-D "home down"
			complete '\me' \
				-D "message"
			complete '\mk' \
				-D "mark"
			complete '\ms' \
				-D "mouse event"
			complete '\mv' \
				-D "move"
			complete '\nx' \
				-D "next object"
			complete '\on' \
				-D "open"
			complete '\op' \
				-D "options"
			complete '\pr' \
				-D "print (copy)"
			complete '\pv' \
				-D "previous object"
			complete '\rd' \
				-D "redo"
			complete '\re' \
				-D "resume"
			complete '\rf' \
				-D "reference"
			complete '\rh' \
				-D "refresh"
			complete '\rp' \
				-D "replace"
			complete '\rs' \
				-D "restart"
			complete '\sf' \
				-D "scroll forward"
			complete '\sl' \
				-D "select"
			complete '\sr' \
				-D "scroll backward"
			complete '\st' \
				-D "set tab"
			complete '\su' \
				-D "suspend"
			complete '\sv' \
				-D "save"
			complete '\ud' \
				-D "undo"
			complete '\SE' \
				-D "shift + end"
			complete '\SH' \
				-D "shift + home"
			complete '\SI' \
				-D "shift + insert"
			complete '\SL' \
				-D "shift + left arrow"
			complete '\SR' \
				-D "shift + right arrow"
			complete '\SX' \
				-D "shift + delete"
			complete '\Sbg' \
				-D "shift + beginning"
			complete '\Scn' \
				-D "shift + cancel"
			complete '\Sco' \
				-D "shift + command"
			complete '\Scp' \
				-D "shift + copy"
			complete '\Scr' \
				-D "shift + create"
			complete '\Sdl' \
				-D "shift + delete line"
			complete '\Sel' \
				-D "shift + end of line"
			complete '\Sex' \
				-D "shift + exit"
			complete '\Sfd' \
				-D "shift + find"
			complete '\Shp' \
				-D "shift + help"
			complete '\Smg' \
				-D "shift + message"
			complete '\Smv' \
				-D "shift + move"
			complete '\Snx' \
				-D "shift + next"
			complete '\Sop' \
				-D "shift + options"
			complete '\Spr' \
				-D "shift + print"
			complete '\Spv' \
				-D "shift + previous"
			complete '\Srd' \
				-D "shift + redo"
			complete '\Sre' \
				-D "shift + resume"
			complete '\Srp' \
				-D "shift + replace"
			complete '\Ssu' \
				-D "shift + suspend"
			complete '\Ssv' \
				-D "shift + save"
			complete '\Sud' \
				-D "shift + undo"
		esac
	else
		# complete a key binding command name
		complete --bindkey
		complete -- -
	fi
}
