重新映射ksh vi模式的键

时间:2011-01-14 11:47:21

标签: unix vi ksh

在我的.vimrc文件中,我有一行

inoremap jj << Esc>> 

(没有这个我不能活着:))

我希望在set -o vi模式下使用ksh时具有相同的重映射,任何有关如何执行此操作的建议都表示赞赏。

1 个答案:

答案 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。

编辑:添加了光标颜色更改。