在我的.vimrc
文件中,我有一行
inoremap jj << Esc>>
(没有这个我不能活着:))
我希望在set -o vi
模式下使用ksh时具有相同的重映射,任何有关如何执行此操作的建议都表示赞赏。
答案 0 :(得分:2)
尝试一下:
_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”,则将输出重新映射的序列。
示例:按“j”,暂停,然后按“jj”,首先不会产生任何响应,然后“j&lt;&lt; Esc&gt;&gt;”一下子。
这与vim
之间的区别在于vim
将继续并在时间用完后输出保留的字符,即使还没有按下另一个键。此外,此时的超时时间为整秒,而vim
中的超时时间则为毫秒。
我只测试了一点,只用ksh93。
编辑:添加了光标颜色更改。