O trap KEYBD documentado na página man do ksh é chamado para uma seqüência de caracteres de entrada que começa com escape. O final desta seqüência não é descrito, mas parece que ;
terminará.
Supondo que sua função de atalho seja fornecida neste artigo , sua vinculação falha porque o código da armadilha é chamado primeiro por \e[1;
, depois por 5
e D
.
Uma solução é alterar o código de interceptação para lembrar a sequência inicial e usá-la mais tarde, da seguinte maneira:
# original code from http://www.bolthole.com/solaris/ksh-oddthings.html
typeset -A Keytable
# trap 'eval "${Keytable[${.sh.edchar}]}"' KEYBD
function keybind # key action
{
typeset key=$(print -f "%q" "$2")
case $# in
2) Keytable[$1]=' .sh.edchar=${.sh.edmode}'"$key" ;;
1) unset Keytable[$1] ;;
*) print -u2 "Usage: $0 key [action]" ;;
esac
}
# new function to handle ";" causing end of sequence
# https://unix.stackexchange.com/a/425980/119298
function myfn {
typeset -S state
case "$state${.sh.edchar}" in
$'\e[1;') state=${.sh.edchar}
.sh.edchar=
return ;;
$'\e[1;5') state="$state${.sh.edchar}"
.sh.edchar=
return ;;
$'\e[1;5'?) state=
.sh.edchar=$'\e[1;5'"${.sh.edchar}" ;;
esac
eval "${Keytable[${.sh.edchar}]}"
}
trap myfn KEYBD
keybind $'\e[1;5D' $'\eb'
keybind $'\e[1;5C' $'\ef'