Дайте этому попытку:
_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
Положите его в файл, ~/.input.ksh
, например, и источник его из ~/.kshrc
или аналогичный.
Нажатие кнопки «j» переведет ее на удержание. Если время истекает до нажатия другого «j», будет выведен первый «j», а следующий будет удерживаться. Если нажата другая клавиша, кроме «j», удерживаемые «j» и следующий символ выводятся вместе. Если после истечения времени нажать второе «j», будет выведена повторная последовательность.
Пример: Нажатие «j», пауза, а затем нажмите «jj», сначала не даст никакого ответа, а затем «j < < Esc >>« все сразу.
Разница между этим и vim
заключается в том, что vim
будет продолжать и выводить удерживаемый символ после истечения времени, даже если еще не нажата еще одна клавиша. Кроме того, таймаут в этом целых секунды, а в vim
- в миллисекундах.
Я проверил это немного и только с ksh93.
Редактировать: Добавлено изменение цвета курсора.
Большое спасибо, все, что мне пришлось изменить, это '' << Esc>> '' до $ '\ E', и он отлично работает. –
@ Крис: Я рад, что это сработало. Я не был уверен, что ваш намеченный выход был, поэтому я просто скопировал его буквально. Я написал функцию таким образом, что добавлять дополнительные сопоставления не должно быть слишком сложно. Не забудьте отметить этот ответ, как принято. –