Geben Sie diesen einen Versuch:
_key_handler() {
# by Dennis Williamson - 2011-01-14
# for http://stackoverflow.com/questions/4690695/remapping-keys-for-ksh-vi-mode
# 2011-01-15 - added cursor color change
typeset timeout=1 # whole seconds
# the cursor color change sequences are for xterms that support this feature
if [[ $TERM == *xterm*color* ]]
then
typeset color=true # change cursor color when chars are held
# cursor colors - set them as you like
typeset nohold="\E]12;green\a" hold="\E]12;red\a"
else
typeset color=false
fi
if [[ ${.sh.edmode} == $'\x1b' ]] # vi edit mode
then
case ${.sh.edchar} in
j)
if [[ $_kh_prevchar == j ]]
then
if (($SECONDS < _kh_prevtime + timeout))
then
.sh.edchar=$'\E' # remapped sequence
_kh_prevchar=''
$color && printf "$nohold"
fi
else
_kh_prevchar=${.sh.edchar}
.sh.edchar=''
$color && printf "$hold" &&
# jiggle the cursor so the color change shows
tput cuf1 && sleep .02 && tput cub1
fi
_kh_prevtime=$SECONDS
;;
*)
if [[ -n $_kh_prevchar ]]
then
.sh.edchar=$_kh_prevchar${.sh.edchar}
fi
_kh_prevchar=''
$color && printf "$nohold"
;;
esac
fi
}
trap _key_handler KEYBD
set -o vi
es in einer Datei ~/.input.ksh
zum Beispiel, und die Quelle von ihm Ihren ~/.kshrc
oder ähnlichem Put.
Durch Drücken von "j" wird das Gespräch gehalten. Wenn die Zeit abgelaufen ist, bevor ein anderes "j" gedrückt wird, wird das erste "j" ausgegeben und das nächste wird gehalten. Wenn eine andere Taste neben "j" gedrückt wird, werden das gehaltene "j" und das nächste Zeichen zusammen ausgegeben. Wenn ein zweites "j" gedrückt wird, bevor die Zeit abgelaufen ist, wird die neu zugeordnete Sequenz ausgegeben.
Beispiel: Wenn Sie "j" drücken, pausieren und dann "jj" drücken, wird zunächst keine Antwort und dann "j < < Esc >>" auf einmal ausgegeben.
Ein Unterschied zwischen diesem und vim
besteht darin, dass vim
vorausgeht und das gehaltene Zeichen nach Ablauf der Zeit ausgibt, auch wenn noch keine andere Taste gedrückt wurde. Auch das Zeitlimit in diesem ist in ganzen Sekunden, während in vim
es in Millisekunden ist.
Ich habe das nur ein bisschen getestet und nur mit ksh93.
Bearbeiten: Hinzugefügt Cursor Farbe ändern.
Vielen Dank, alles, was ich ändern musste, war die "<< Esc>>" zu $ "\ E" und es funktioniert perfekt. –
@Chris: Ich bin froh, dass es funktioniert hat. Ich war mir nicht sicher, was Ihre beabsichtigte Ausgabe war, also kopierte ich es buchstäblich. Ich habe die Funktion so geschrieben, dass es nicht zu schwierig sein sollte, zusätzliche Mappings hinzuzufügen. Vergessen Sie nicht, diese Antwort als akzeptiert zu markieren. –