-KEYTIMEOUT=1
-# xorg
-bindkey "^[[7~" beginning-of-line #Home
-bindkey -a "^[[7~" beginning-of-line
-bindkey "^[[8~" end-of-line #End
-bindkey -a "^[[8~" end-of-line
-bindkey "^[[3~" delete-char #Del
-bindkey -a "^[[3~" delete-char
-# bsd vt
-bindkey "^[[H" beginning-of-line #Home
-bindkey -a "^[[H" beginning-of-line
-bindkey "^[[F" end-of-line #End
-bindkey -a "^[[F" end-of-line
-
+KEYTIMEOUT=10
+## populate key array
+if (( $#terminfo == 0 )) {
+ # terminfo is not set or empty
+ function find_keymap {
+ for f in ${ZDOTDIR:-$HOME}/.zkbd/${TERM}{-${DISPLAY:-${VENDOR}-${OSTYPE}},}
+ [[ -f $f ]] && keymap=$f && break
+ }
+ find_keymap
+ if [[ -z $keymap ]] {
+ if read -q "?Can't read terminfo. Add new zkbd keymap? [y/N]"; then
+ echo
+ autoload -Uz zkbd && zkbd
+ unfunction zkbd
+ find_keymap
+ fi
+ echo
+ }
+ if [[ -n $keymap ]] {
+ source $keymap
+ } else {
+ echo "Failed to source keymap file $keymap" >&2
+ }
+ unfunction find_keymap; unset keymap
+} else {
+ # activate application mode for zle so terminfo keys work
+ # NOTE: don't do this for zkbd since application mode shouldn't have been
+ # enabled by zkbd when the keymap file was generated
+ if [[ -v terminfo[smkx] && -v terminfo[rmkx] ]] {
+ autoload -Uz add-zle-hook-widget
+ function _enter-application-mode { echoti smkx }
+ add-zle-hook-widget line-init _enter-application-mode
+ function _exit-application-mode { echoti rmkx }
+ add-zle-hook-widget line-finish _exit-application-mode
+ trap _exit-application-mode EXIT
+ }
+ # match zkbd hash as best we can to terminfo
+ typeset -gA key
+ key=(F1 kf1 F2 kf2 F3 kf3 F4 kf4 F5 kf5 F6 kf6 F7 kf7 F8 kf8 F9 kf9
+ F10 kf10 F11 kf11 F12 kf12
+ Backspace kbs
+ Backtab kcbt
+ Shift-Tab kcbt
+ Insert kich1
+ Home khome
+ PageUp kpp
+ Delete kdch1
+ End kend
+ PageDown knp
+ Up kcuu1
+ Down kcud1
+ Left kcub1
+ Right kcuf1
+ )
+ for k v in ${(kv)key}; do
+ key[$k]=$terminfo[$v]
+ done; unset k v
+}
+## load history search