Unix ksh vi模式的重新映射键
在我的Unix ksh vi模式的重新映射键,unix,vi,ksh,Unix,Vi,Ksh,在我的.vimrc文件中,我有一行 inoremap jj << Esc>> inoremap jj> (我不能没有这个:)) 我希望在set-o vi模式下使用ksh时能有相同的重新映射,请提供有关如何执行此操作的任何建议。尝试一下: _key_handler () { # by Dennis Williamson - 2011-01-14 # for http://stackoverflow.com/questions/4690695/remap
.vimrc
文件中,我有一行
inoremap jj << Esc>>
inoremap jj>
(我不能没有这个:))
我希望在set-o vi
模式下使用ksh时能有相同的重新映射,请提供有关如何执行此操作的任何建议。尝试一下:
_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
\u键\u处理程序(){
#丹尼斯·威廉姆森-2011-01-14
#为了http://stackoverflow.com/questions/4690695/remapping-keys-for-ksh-vi-mode
#2011-01-15-添加光标颜色更改
排版超时=1整秒
#光标颜色更改序列适用于支持此功能的XTERM
如果[[$TERM==*xterm*color*]]
然后
typeset color=true#在保留字符时更改光标颜色
#光标颜色-根据需要进行设置
字体设置nohold=“\E]12;绿色\a”hold=“\E]12;红色\a”
其他的
字体颜色=假
fi
如果[${.sh.edmode}=$'\x1b']\vi编辑模式
然后
中的案例${.sh.edchar}
(j)
如果[$\u kh\u prevchar==j]]
然后
如果($SECONDS<\u kh\u prevtime+超时))
然后
.sh.edchar=$'\E'#重新映射序列
_kh_prevchar=“”
$color&&printf“$nohold”
fi
其他的
_kh_prevchar=${.sh.edchar}
.sh.edchar=“”
$color&&printf“$hold”&&
#晃动光标以显示颜色更改
t输出cuf1&&sleep.02&&t输出cub1
fi
_kh_prevtime=$秒
;;
*)
如果[-n$\u kh\u prevchar]]
然后
.sh.edchar=$\u kh\u prevchar${.sh.edchar}
fi
_kh_prevchar=“”
$color&&printf“$nohold”
;;
以撒
fi
}
陷阱键处理器键BD
set-o vi
将其放入一个文件中,例如,~/.input.ksh
,并从您的~/.kshrc
或类似文件中获取它
按“j”键将使其保持不变。如果在按下另一个“j”之前时间已过,则将输出第一个“j”,并保持下一个“j”。如果按下除“j”之外的另一个键,则保持的“j”和下一个字符一起输出。如果在时间结束前按下第二个“j”,将输出重新映射的序列
示例:按“j”,暂停,然后按“jj”将首先不产生响应,然后立即按“j>”
这与vim
之间的区别在于vim
将在时间结束后继续并输出保持的字符,即使尚未按下另一个键。此外,在本例中,超时以整秒为单位,而在vim
中,超时以毫秒为单位
我只用ksh93测试了一点
编辑:添加了光标颜色更改。非常感谢,我只需将“>”更改为$“\E”,效果非常好。@Chris:我很高兴它成功了。我不确定你的预期输出是什么,所以我只是照本宣科。我编写函数的方式应该不会太难添加其他映射。别忘了把这个答案标记为已接受。