Mapeamento de chave KSH no modo emacs: ctrl + tecla de seta

1

Sou novo no KSH, tenho que usá-lo no meu trabalho. A versão é:

sh (AT&T Research) 93u+ 2012-08-01

no RHEL. Eu usei anteriormente o tcsh e usei seu recurso bindkey para fornecer alguns bons atalhos de manipulação de linha de comando. Eu encontrei o código para uma função "keybind" no KSH, e usei isso para fazer o home, end e delete trabalhar do jeito que eu quero:

keybind $'\eOH'  $'
keybind $'\eOH'  $'%pre%1'
keybind $'\eOF'  $'%pre%5'
keybind $'\e[F'  $'%pre%5'
keybind $'\e[3~'  $'%pre%4'
1' keybind $'\eOF' $'%pre%5' keybind $'\e[F' $'%pre%5' keybind $'\e[3~' $'%pre%4'

Eu realmente não tenho certeza porque eu tenho dois que correspondem a "End", mas eu faço. Em qualquer caso, a parte complicada é que eu quero ctrl + seta para a esquerda / direita para pular uma palavra, em vez de usar M-f ou M-b. Quando tento obter o código da seta para a esquerda, mostra:

^[[1;5D

mas não consigo fazer isso funcionar no comando keybind. Parece quase como uma combinação de teclas devido ao ponto e vírgula. Eu também não vi essa pergunta antes, então qualquer ajuda seria apreciada.

Obrigado Matt

    
por Matt 22.02.2018 / 18:58

1 resposta

1

O trap KEYBD documentado na página man do ksh é chamado para uma seqüência de caracteres de entrada que começa com escape. O final desta seqüência não é descrito, mas parece que ; terminará.

Supondo que sua função de atalho seja fornecida neste artigo , sua vinculação falha porque o código da armadilha é chamado primeiro por \e[1; , depois por 5 e D .

Uma solução é alterar o código de interceptação para lembrar a sequência inicial e usá-la mais tarde, da seguinte maneira:

# original code from http://www.bolthole.com/solaris/ksh-oddthings.html
typeset -A Keytable
# trap 'eval "${Keytable[${.sh.edchar}]}"' KEYBD
function keybind # key action
{
    typeset key=$(print -f "%q" "$2")
    case $# in
    2)      Keytable[$1]=' .sh.edchar=${.sh.edmode}'"$key" ;;
    1)      unset Keytable[$1] ;;
    *)      print -u2 "Usage: $0 key [action]" ;;
    esac
}

# new function to handle ";" causing end of sequence
# https://unix.stackexchange.com/a/425980/119298
function myfn {
    typeset -S state
    case "$state${.sh.edchar}" in
    $'\e[1;')   state=${.sh.edchar}
                .sh.edchar=
                return ;;
    $'\e[1;5')  state="$state${.sh.edchar}"
                .sh.edchar=
                return ;;
    $'\e[1;5'?) state=
                .sh.edchar=$'\e[1;5'"${.sh.edchar}" ;;
    esac
    eval "${Keytable[${.sh.edchar}]}"
}

trap myfn KEYBD

keybind $'\e[1;5D' $'\eb'
keybind $'\e[1;5C' $'\ef'
    
por 22.02.2018 / 21:49