2011-01-14 3 views
2

In meiner .vimrc Datei habe ich die LinieRemapping Tasten für KSH vi Modus

inoremap jj << Esc>> 

(Ich kann nicht ohne diese :) leben)

Ich möchte die gleiche remap haben, während KSH Verwendung in set -o vi Modus, jeder Hinweis, wie dies zu tun ist, wird geschätzt.

Antwort

2

Geben Sie diesen einen Versuch:

_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 

es in einer Datei ~/.input.ksh zum Beispiel, und die Quelle von ihm Ihren ~/.kshrc oder ähnlichem Put.

Durch Drücken von "j" wird das Gespräch gehalten. Wenn die Zeit abgelaufen ist, bevor ein anderes "j" gedrückt wird, wird das erste "j" ausgegeben und das nächste wird gehalten. Wenn eine andere Taste neben "j" gedrückt wird, werden das gehaltene "j" und das nächste Zeichen zusammen ausgegeben. Wenn ein zweites "j" gedrückt wird, bevor die Zeit abgelaufen ist, wird die neu zugeordnete Sequenz ausgegeben.

Beispiel: Wenn Sie "j" drücken, pausieren und dann "jj" drücken, wird zunächst keine Antwort und dann "j < < Esc >>" auf einmal ausgegeben.

Ein Unterschied zwischen diesem und vim besteht darin, dass vim vorausgeht und das gehaltene Zeichen nach Ablauf der Zeit ausgibt, auch wenn noch keine andere Taste gedrückt wurde. Auch das Zeitlimit in diesem ist in ganzen Sekunden, während in vim es in Millisekunden ist.

Ich habe das nur ein bisschen getestet und nur mit ksh93.

Bearbeiten: Hinzugefügt Cursor Farbe ändern.

+0

Vielen Dank, alles, was ich ändern musste, war die "<< Esc>>" zu $ ​​"\ E" und es funktioniert perfekt. –

+0

@Chris: Ich bin froh, dass es funktioniert hat. Ich war mir nicht sicher, was Ihre beabsichtigte Ausgabe war, also kopierte ich es buchstäblich. Ich habe die Funktion so geschrieben, dass es nicht zu schwierig sein sollte, zusätzliche Mappings hinzuzufügen. Vergessen Sie nicht, diese Antwort als akzeptiert zu markieren. –