1
0
Fork 0
mirror of synced 2024-06-28 19:31:08 -04:00
zimfw/modules/input/init.zsh
Eric Nielsen 78611457f2 [input] Only load terminfo feature of zsh/terminfo
and use `-F` to check if the feature was not already loaded before.

Use terminfo elements for Backspace and Delete. Sort by terminfo element
keys.

Also simplify code, removing unnecessary double quotes, and replacing
if-then-fi with one command by one-liners.
2018-04-13 15:23:53 -05:00

111 lines
3.1 KiB
Bash

#
# Editor and input char assignment
#
# Return if requirements are not found.
if [[ ${TERM} == 'dumb' ]]; then
return 1
fi
# Use human-friendly identifiers.
zmodload -F zsh/terminfo +p:terminfo
typeset -gA key_info
key_info=(
'Control' '\C-'
'ControlLeft' '\e[1;5D \e[5D \e\e[D \eOd \eOD'
'ControlRight' '\e[1;5C \e[5C \e\e[C \eOc \eOC'
'Escape' '\e'
'Meta' '\M-'
'Backspace' ${terminfo[kbs]}
'BackTab' ${terminfo[kcbt]}
'Left' ${terminfo[kcub1]}
'Down' ${terminfo[kcud1]}
'Right' ${terminfo[kcuf1]}
'Up' ${terminfo[kcuu1]}
'Delete' ${terminfo[kdch1]}
'End' ${terminfo[kend]}
'F1' ${terminfo[kf1]}
'F2' ${terminfo[kf2]}
'F3' ${terminfo[kf3]}
'F4' ${terminfo[kf4]}
'F5' ${terminfo[kf5]}
'F6' ${terminfo[kf6]}
'F7' ${terminfo[kf7]}
'F8' ${terminfo[kf8]}
'F9' ${terminfo[kf9]}
'F10' ${terminfo[kf10]}
'F11' ${terminfo[kf11]}
'F12' ${terminfo[kf12]}
'Home' ${terminfo[khome]}
'Insert' ${terminfo[kich1]}
'PageDown' ${terminfo[knp]}
'PageUp' ${terminfo[kpp]}
)
# Bind the keys
local key
for key in "${(s: :)key_info[ControlLeft]}"; do
bindkey ${key} backward-word
done
for key in "${(s: :)key_info[ControlRight]}"; do
bindkey ${key} forward-word
done
[[ -n ${key_info[Home]} ]] && bindkey ${key_info[Home]} beginning-of-line
[[ -n ${key_info[End]} ]] && bindkey ${key_info[End]} end-of-line
[[ -n ${key_info[PageUp]} ]] && bindkey ${key_info[PageUp]} up-line-or-history
[[ -n ${key_info[PageDown]} ]] && bindkey ${key_info[PageDown]} down-line-or-history
[[ -n ${key_info[Insert]} ]] && bindkey ${key_info[Insert]} overwrite-mode
if [[ ${zdouble_dot_expand} == 'true' ]]; then
double-dot-expand() {
if [[ ${LBUFFER} == *.. ]]; then
LBUFFER+='/..'
else
LBUFFER+='.'
fi
}
zle -N double-dot-expand
bindkey '.' double-dot-expand
fi
[[ -n ${key_info[Backspace]} ]] && bindkey ${key_info[Backspace]} backward-delete-char
[[ -n ${key_info[Delete]} ]] && bindkey ${key_info[Delete]} delete-char
[[ -n ${key_info[Left]} ]] && bindkey ${key_info[Left]} backward-char
[[ -n ${key_info[Right]} ]] && bindkey ${key_info[Right]} forward-char
# Expandpace.
bindkey ' ' magic-space
# Clear
bindkey "${key_info[Control]}L" clear-screen
# Bind Shift + Tab to go to the previous menu item.
[[ -n ${key_info[BackTab]} ]] && bindkey ${key_info[BackTab]} reverse-menu-complete
autoload -Uz is-at-least && if ! is-at-least 5.3; then
# Redisplay after completing, and avoid blank prompt after <Tab><Tab><Ctrl-C>
expand-or-complete-with-redisplay() {
print -Pn '...'
zle expand-or-complete
zle redisplay
}
zle -N expand-or-complete-with-redisplay
bindkey "${key_info[Control]}I" expand-or-complete-with-redisplay
fi
# Put into application mode and validate ${terminfo}
zle-line-init() {
(( ${+terminfo[smkx]} )) && echoti smkx
}
zle-line-finish() {
(( ${+terminfo[rmkx]} )) && echoti rmkx
}
zle -N zle-line-init
zle -N zle-line-finish