Emacs 모드의 KSH 키 매핑: Ctrl + 화살표 키

Emacs 모드의 KSH 키 매핑: Ctrl + 화살표 키

저는 KSH를 처음 접했고 직장에서 KSH를 사용해야 합니다. 버전은 다음과 같습니다:

sh (AT&T리서치) 93u+ 2012-08-01

RHEL에서. 저는 이전에 tcsh를 사용해 본 적이 있으며 그 바인딩키 도구는 명령줄 작업에 대한 몇 가지 훌륭한 단축키를 제공했습니다. KSH에서 "keybind" 기능에 대한 코드를 찾았고 이를 사용하여 원하는 방식으로 작업을 시작하고 종료하고 삭제했습니다.

keybind $'\eOH'  $'\001'
keybind $'\eOF'  $'\005'
keybind $'\e[F'  $'\005'
keybind $'\e[3~'  $'\004'

실제로 왜 "End"에 해당하는 두 개가 있는지 잘 모르겠지만 그렇습니다. 어쨌든 까다로운 부분은 Mf 또는 Mb를 사용하지 않고 Ctrl+왼쪽/오른쪽 화살표를 사용하여 단어를 건너뛰기를 원한다는 것입니다. ctrl-왼쪽 화살표에 대한 코드를 얻으려고 하면 다음과 같이 표시됩니다.

^[[1;5D

하지만 keybind 명령 내에서 작동하도록 할 수는 없는 것 같습니다. 세미콜론 때문에 거의 복합 키처럼 보입니다. 나는 이전에도 이 문제를 본 적이 없으므로 도움을 주시면 대단히 감사하겠습니다.

고마워요, 매트

답변1

ksh 매뉴얼 페이지에 문서화된 KEYBD 트랩은 이스케이프로 시작하는 들어오는 문자 시퀀스를 처리하기 위해 호출됩니다. 이 시퀀스의 끝은 설명되지 않지만 ;끝나는 것 같습니다.

키 바인딩 기능이 다음과 같다고 가정해 보겠습니다.기사\e[1;을 사용하면 에 대한 트랩 코드가 먼저 호출되고 그 다음에는 5및 에 대한 트랩 코드가 호출되므로 바인딩이 실패합니다 D.

한 가지 해결책은 다음과 같이 초기 시퀀스를 기억하고 나중에 사용하도록 트랩 코드를 변경하는 것입니다.

# 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'

관련 정보