私は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」に対応する2つがあるのかよくわかりませんが、そうです。とにかくトリッキーな部分は、MfやMbを使わずにCtrl +左/右矢印を使って単語をスキップしたいということです。 ctrl - 左矢印のコードを取得しようとすると、次のように表示されます。
^[[1;5D
しかし、keybindコマンド内で動作させることはできないようです。セミコロンのため、ほぼ複合キーのように見えます。私は以前もこの問題を見たことがないので、助けてくれてありがとう。
ありがとう、マット
答え1
kshのマニュアルページに文書化されたKEYBDトラップは、エスケープで始まる着信文字シーケンスを処理するために呼び出されます。このシーケンスの終わりは説明されていませんが、;
終了するようです。
キーバインディング機能が次のとおりであるとします。記事\e[1;
を使用すると、最初にトラップコードが呼び出され、次にトラップコードと5
トラップコードが呼び出されるため、バインディングは失敗しますD
。
1つの解決策は、次のように初期シーケンスを記憶し、後で使用するようにトラップコードを変更することです。
# 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'