GNU screen で「tab」と「shift+tab」をバインドするにはどうすればいいですか?

GNU screen で「tab」と「shift+tab」をバインドするにはどうすればいいですか?

画面でキーTabとをバインドするにはどうすればいいですかShiftTab? 問題は、これらのキーストロークを指定するために画面コマンドに何を渡せばいいかわからないことですbind

ところで、私はGNU スクリーン: 領域間を移動するしかし、答えはそこにはありません。

以下のすべてがエラーで失敗します-X: bind: character, ^x, or (octal) \032 expected:

screen -X bind "\033[Z" focus up
screen -X bind "^[[Z" focus up
screen -X bind "\t" focus up
screen -X bind \033[Z focus up
screen -X bind ^[[Z focus up
screen -X bind \t focus up

CtrlA:コマンドを入力するために押した場合も同様です。

答え1

bindkey文字シーケンスを指定できる とは異なり、 ではbind、 を使用することが唯一の方法です。bind -k CAPここで、CAP はtermcap重要な機能です。

例えば、

bind -k ku focus up

Upは、送信された文字のシーケンスを にバインドしますfocus up。バックタブの場合、次のようになります。

bind -k kB focus up

ncurses残念ながら、何らかの理由で、動作しないようです。理由はわかりません。私の最初の解釈は間違っていました。termcapの同等のものを正しく処理していないことに関係しているようですkcbt:

$ infocmp -1 | grep Z
    cbt=\E[Z,
    kcbt=\E[Z,
$ infocmp -1C | grep Z
    :bt=\E[Z:\

(kcbt は kB に変換されません)。

以下に以下を追加すると~/.screenrc:

 termcapinfo * kr=\E[Z
 bind -k kr focus up

つまり、私screenホストターミナル(*)、F63kr)は を送信し\E[ZF63にバインドするfocus upと動作します。ただし、Shift+Tab今 を押すと が送信されます。画面内 \EOC、これは端末エミュレータが使用する文字シーケンスです画面を実装します (ホスト端末とは対照的に) 送信しますF63

答え2

bindkey -k kB stuff ^[OZ
bind -k kB focus up

私の場合、問題はCtrl+ A- Shift+を押したときに挿入される文字列が+の後にTab来ることです。^[[ZCtrlA

  • ^[コピー/スクロールバックモードに入る
  • [アボート
  • そして表示するZ

つまり、標準の VT100 スタイルのエスケープ シーケンスの文字は、コピー/スクロールバック モードの文字シーケンスと競合します。そのため、バックタブ termcap 名のキー バインディングを追加して、+が押されたkBときに入力バッファーに挿入される文字列を変更しました。ShiftTab^[OB

screen のマニュアルページの「入力変換」セクションを参照してください。

関連情報