Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix ksh vi模式的重新映射键_Unix_Vi_Ksh - Fatal编程技术网

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:我很高兴它成功了。我不确定你的预期输出是什么,所以我只是照本宣科。我编写函数的方式应该不会太难添加其他映射。别忘了把这个答案标记为已接受。