2011-01-14 4 views
2

В моем .vimrc файле у меня есть строкаПереотображения ключей для режима VI КШ

inoremap jj << Esc>> 

(я не могу жить без этого :))

Я хотел бы иметь такие же переназначить при использовании Ksh в set -o vi режим, любые советы о том, как это сделать, приветствуются.

ответ

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», пауза, а затем нажмите «jj», сначала не даст никакого ответа, а затем «j < < Esc >>« все сразу.

Разница между этим и vim заключается в том, что vim будет продолжать и выводить удерживаемый символ после истечения времени, даже если еще не нажата еще одна клавиша. Кроме того, таймаут в этом целых секунды, а в vim - в миллисекундах.

Я проверил это немного и только с ksh93.

Редактировать: Добавлено изменение цвета курсора.

+0

Большое спасибо, все, что мне пришлось изменить, это '' << Esc>> '' до $ '\ E', и он отлично работает. –

+0

@ Крис: Я рад, что это сработало. Я не был уверен, что ваш намеченный выход был, поэтому я просто скопировал его буквально. Я написал функцию таким образом, что добавлять дополнительные сопоставления не должно быть слишком сложно. Не забудьте отметить этот ответ, как принято. –