mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-19 05:24:23 +01:00
249 lines
6.3 KiB
Bash
249 lines
6.3 KiB
Bash
#! /bin/zsh -f
|
|
|
|
[[ -o interactive ]] && {
|
|
local -i ARGC
|
|
(ARGC=0) 2>/dev/null || {
|
|
print -u2 ${0}: must be run as a function or shell script, not sourced
|
|
return 1
|
|
}
|
|
}
|
|
|
|
emulate -RL zsh
|
|
local zkbd term key seq
|
|
|
|
zkbd=${ZDOTDIR:-$HOME}/.zkbd
|
|
[[ -d $zkbd ]] || mkdir $zkbd || return 1
|
|
|
|
print 'typeset -g -A key\n' > $zkbd/$TERM.tmp || return 1
|
|
trap "unfunction getkey getseq; command rm -f $zkbd/$TERM.tmp" 0
|
|
trap "return 1" 1 2 15
|
|
|
|
getkey () {
|
|
local k='' i
|
|
for ((i=10; i>0; --i))
|
|
do
|
|
read -t -k 1 k && break
|
|
sleep 1
|
|
done
|
|
[[ -n $k ]] || return 1
|
|
[[ $k = $'\012' || $k = $'\015' || $k = ' ' ]] && return 0
|
|
print -Rn $k
|
|
}
|
|
|
|
getseq () {
|
|
trap "stty ${$(stty -g 2>/dev/null):-echo -raw}" 0 1 2 15
|
|
stty raw -echo
|
|
local k='' seq='' i
|
|
for ((i=10; i>0; --i))
|
|
do
|
|
read -t -k 1 k && break
|
|
sleep 1
|
|
done
|
|
[[ -n $k ]] || return 1
|
|
[[ $k = $'\012' || $k = $'\015' || $k = ' ' ]] && return 0
|
|
seq=$k
|
|
while read -t -k 1 k
|
|
do
|
|
seq=$seq$k
|
|
done
|
|
print -Rn ${(V)seq}
|
|
}
|
|
|
|
read term"?Enter current terminal type: [$TERM] "
|
|
[[ -n $term ]] && TERM=$term
|
|
|
|
cat <<\EOF
|
|
|
|
We will now test some features of your keyboard and terminal.
|
|
|
|
If you do not press the requested keys within 10 seconds, key reading will
|
|
abort. If your keyboard does not have a requested key, press Space to
|
|
skip to the next key.
|
|
|
|
EOF
|
|
|
|
local ctrl alt meta
|
|
|
|
print -n "Hold down Ctrl and press X: "
|
|
ctrl=$(getkey) || return 1
|
|
print
|
|
|
|
if [[ $ctrl != $'\030' ]]
|
|
then
|
|
print "Your keyboard does not have a working Ctrl key?"
|
|
print "Giving up ..."
|
|
return 1
|
|
else
|
|
print
|
|
fi
|
|
|
|
print "Your Meta key may have a Microsoft Windows logo on the cap."
|
|
print -n "Hold down Meta and press X: "
|
|
meta=$(getkey) || return 1
|
|
print
|
|
|
|
if [[ $meta == x ]]
|
|
then
|
|
print "Your keyboard or terminal does not recognize the Meta key."
|
|
unset meta
|
|
elif [[ $meta > $'\177' ]]
|
|
then
|
|
print "Your keyboard uses the Meta key to send high-order characters."
|
|
else
|
|
unset meta
|
|
fi
|
|
print
|
|
|
|
print -n "Hold down Alt and press X: "
|
|
alt=$(getkey) || return 1
|
|
print
|
|
|
|
if [[ $alt == x ]]
|
|
then
|
|
print "Your keyboard or terminal does not recognize the Alt key."
|
|
unset alt
|
|
elif [[ $alt == $meta ]]
|
|
then
|
|
print "Your keyboard does not distinguish Alt from Meta."
|
|
elif [[ $alt > $'\177' ]]
|
|
then
|
|
print "Your keyboard uses the Alt key to send high-order characters."
|
|
else
|
|
unset alt
|
|
fi
|
|
|
|
(( $+alt + $+meta == 0 )) && cat <<EOF
|
|
|
|
---------
|
|
|
|
Your current terminal and keyboard configuration does not appear to use
|
|
high-order characters. You may be able to enable the Meta or Alt keys
|
|
with a command such as
|
|
|
|
stty pass8
|
|
|
|
If you want to use these extra keys with zsh, try adding the above command
|
|
to your ${ZDOTDIR:-$HOME}/.zshrc file.
|
|
|
|
See also "man stty" or the documentation for your terminal or emulator.
|
|
EOF
|
|
|
|
(( $+alt || $+meta )) && cat <<EOF
|
|
|
|
---------
|
|
|
|
You may enable keybindings that use the \
|
|
${meta:+Meta}${meta:+${alt:+ and }}${alt:+Alt} key${meta:+${alt:+s}} \
|
|
by adding
|
|
|
|
bindkey -m
|
|
|
|
to your ${ZDOTDIR:-$HOME}/.zshrc file.
|
|
EOF
|
|
|
|
cat <<\EOF
|
|
|
|
---------
|
|
|
|
You will now be asked to press in turn each of the 12 function keys, then
|
|
the Backspace key, the 6 common keypad keys found on typical PC keyboards,
|
|
plus the 4 arrow keys, and finally the Menu key (near Ctrl on the right).
|
|
If your keyboard does not have the requested key, press Space to skip to
|
|
the next key.
|
|
|
|
Do not type ahead! Wait at least one second after pressing each key for
|
|
zsh to read the entire sequence and prompt for the next key. If a key
|
|
sequence does not echo within 2 seconds after you press it, that key may
|
|
not be sending any sequence at all. In this case zsh is not able to make
|
|
use of that key. Press Space to skip to the next key.
|
|
|
|
EOF
|
|
|
|
read -k 1 key"?Press any key when ready to begin: "
|
|
[[ $key != $'\n' ]] && print
|
|
|
|
cat <<\EOF
|
|
|
|
If you do not press a key within 10 seconds, key reading will abort.
|
|
If you make a mistake, stop typing and wait, then run this program again.
|
|
|
|
EOF
|
|
|
|
# There are 509 combinations of the following three arrays that represent
|
|
# possible keystrokes. (Actually, Sun keyboards don't have Meta or Menu,
|
|
# though some have R{1..12} keys as well, so really there are either 433
|
|
# or 517 combinations; but some X11 apps map Shift-F{1..11} to emulate the
|
|
# unmodified Sun keys, so really only the 345 PC combinations are usable.
|
|
# Let's not even get into distinguishing Left and Right Shift/Alt/Meta.)
|
|
# No one would ever want to type them all into this program (would they?),
|
|
# so by default ask for the 23 unmodified PC keys. If you uncomment more,
|
|
# you should fix the introductory text above.
|
|
|
|
local -a pckeys sunkeys modifiers
|
|
pckeys=(F{1..12}
|
|
Backspace Insert Home PageUp
|
|
Delete End PageDown
|
|
Up
|
|
Left Down Right
|
|
Menu
|
|
)
|
|
sunkeys=(Stop Again
|
|
Props Undo
|
|
Front Copy
|
|
Open Paste
|
|
Find Cut
|
|
Help
|
|
)
|
|
modifiers=(Shift- # Control- Alt- Meta-
|
|
# Control-Shift- Alt-Shift- Meta-Shift-
|
|
# Control-Alt- Control-Meta- Alt-Meta-
|
|
# Control-Alt-Shift- Control-Meta-Shift-
|
|
# Alt-Meta-Shift- Control-Alt-Meta-Shift-
|
|
)
|
|
|
|
exec 3>/dev/tty
|
|
|
|
for key in $pckeys # $^modifiers$^pckeys $sunkeys $^modifiers$^sunkeys
|
|
do
|
|
print -u3 -Rn "Press $key: "
|
|
seq="$(getseq)" || return 1
|
|
print "key[$key]='${(q)seq}'"
|
|
print -u3 -R $seq
|
|
done >> $zkbd/$TERM.tmp
|
|
|
|
source $zkbd/$TERM.tmp || return 1
|
|
if [[ "${key[Delete]}" == "${key[Backspace]}" ]]
|
|
then
|
|
print
|
|
print Warning: Backspace and Delete key both send "${(q)key[Delete]}"
|
|
else
|
|
if [[ "${key[Delete]}" != "^?" ]]
|
|
then
|
|
print
|
|
print Warning: Delete key sends "${(q)key[Delete]}" '(not ^?)'
|
|
fi
|
|
if [[ "${key[Backspace]}" != "^H" ]]
|
|
then
|
|
print
|
|
print Warning: Backspace sends "${(q)key[Backspace]}"
|
|
fi
|
|
fi
|
|
|
|
command mv $zkbd/$TERM.tmp $zkbd/$TERM-$VENDOR-$OSTYPE
|
|
|
|
cat <<EOF
|
|
|
|
Parameter assignments for the keys you typed have been written to the file:
|
|
$zkbd/$TERM-$VENDOR-$OSTYPE
|
|
|
|
You may read this file into ${ZDOTDIR:-$HOME}/.zshrc or another startup
|
|
file with the "source" or "." commands, then reference the \$key parameter
|
|
in bindkey commands, like this:
|
|
|
|
source ${zkbd/$HOME/~}/\$TERM-\$VENDOR-\$OSTYPE
|
|
[[ -n \${key[Left]} ]] && bindkey "\${key[Left]}" backward-char
|
|
[[ -n \${key[Right]} ]] && bindkey "\${key[Right]}" forward-char
|
|
# etc.
|
|
|
|
EOF
|