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」に対応する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'

おすすめ記事