저는 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'