Tmux TerminfoとZshキーバインディングの問題

Tmux TerminfoとZshキーバインディングの問題

Emacs編集モードのZshには、主キーバインディング+カーソルのALT右側Backspaceの単語削除とALT+D左側の単語削除が付属しています。ALT+に後者の機能を追加したいですDEL

terminfo各キーの組み合わせに対してエスケープシーケンスを正しく設定するためにデータベースを使用しようとしています$TERM。 Capnameになることman terminfoを読んだときは、+kDC3にその名前を使用する必要があります。ALTDEL

私のエントリに次の行を追加しました~/.zshrc

bindkey -e `tput kDC3` kill-word

$TERMSSH(is)を介して自分のコンピュータに直接接続すると、これはうまく機能しますxterm。ただし、Tmuxセッション($TERMis screen)でZshを起動すると、次のエラーメッセージが表示されます。

tput: unknown terminfo capability 'kDC3'

ALTこれは本当にTmuxで+に何もバインドすることが不可能であることを意味しますか?DELそれとも私が何か間違っているのでしょうか?もしkDC3順序が間違っているのではないか?

私はDebian Wheezy Beta 4 x86_64を実行しています。

答え1

最初の質問はあなたのものです用語情報項目に定義screenされた機能はありませんkDC3。これは一般的です。この機能をカスタムscreen項目に追加したり、コマンドのシーケンスを「ハードコード」したりできますbindkey


機能を追加すると、他のプログラムがキーについて学ぶのに役立ちますが、構成が断片化する可能性があります。設定を新しいコンピュータまたはユーザーアカウントに手動でコピーすると、このカスタマイズを忘れやすくなります。次のコマンドを使用して適切な項目を抽出し、infocmp次を使用して新しい項目を構築できますtic

{ infocmp -xT screen ; infocmp -x1T xterm | grep -E '^\tkDC[3-8]?=' ; } >/tmp/s
tic -x /tmp/s

走ればチックterminfoディレクトリ(たとえば/usr/share/terminfo)への書き込み権限を持つユーザーとして、新しいエントリがその場所に配置されます(元のエントリを上書きできます)。それ以外の場合、その項目は(またはその環境変数を設定した場合はTERMINFO)の下に配置されます~/.terminfo

(UP|DN|RIT|LFT|PRV|NXT|HOM|END|IC|DC)完全性のために代わりに使用したいかもしれませんDCgrepUp、Down、Right、Left、PageUp、PageDown、Home、End、Insert、およびDeleteの変更されたバージョンをキャプチャするモードです。


カスタムterminfoエントリが原因で構成された断片化が気に入らない場合は、値を「ハードコード」することができます。もう少し良い結果を得るには、kDC3まず次のことを確認してください。

bindkey -e ${$(tput kDC3 2>/dev/null):-'\e[3;3~'} kill-word

screenこの「ハードコーディング」をTERM値のみに基づいて制限するには、次のようにします。

altdel=$(tput kDC3 2>/dev/null)
[[ -z $altdel && $TERM == screen(|-*) ]] && altdel='\e[3;3~'
[[ -n $altdel ]] && bindkey -e $altdel kill-word
unset altdel

端末エミュレータ(スタック)が最終的に生成されるとすぐxtermキーのスタイルの順序が修正されました。


xterm-keysバインド後もオプションをオンにする必要があります。マルチプレクサこれにより生成されます。xtermそのウィンドウに渡されるキースタイルの順序。例えば~/.tmux.conf:

set-option -wg xterm-keys on

答え2

時によって異なります:

  • ncursesは拡張機能をサポートします(カスタマイズ可能)端子機能。
  • kDC3拡大する端末機能。
  • 誰もいないか、tmuxそれについて知ることはzshありません。emacsみんなについてkDC3
  • すでにtmuxkDC3テーブル、電話しないuse_extended_namesこの機能を有効にします。
  • ncursestputはわかりますkDC3もしこれは現在の端末記述で定義されています。

screentmux模倣した)プログラムも正しいですkDC3用語キャップそれはアプリケーションであり(それ自体では)2桁の名前にのみ興味があります。しかし、screenこの問題を直接解決する機能があります:マニュアル(16.1 ウィンドウのtermcap項目の選択) 設定の選択方法を教えてくれます。TERM ~へスクリーンセッション:

screen自分の端末名を見つけようとするときは、まず次の項目を探します。screen.学期、どこ学期変数の内容です$TERM。その項目がない場合は、画面で次のことを試みます。screen(またはscreen-w、端子が非常に広い場合(132列以上)。このアイテムでさえ見つからない場合、vt100代替品として使用されます。

端末が重要な機能(文字の削除やEOSの消去)をサポートしていない場合は、画面の新しいtermcap / terminfoエントリ(名前:screen.dumbterm)、この機能は無効になっています。このエントリがコンピュータにインストールされている場合は、rloginでき、正しいtermcap / terminfoエントリを維持することができます。端末名は$TERMすべての新しいウィンドウの変数に保存されます。また、画面は$TERMCAPシミュレートされた仮想端末の機能を反映する変数を設定します。また、この変数は$WINDOW各ウィンドウのウィンドウ番号に設定されます。

ncursesのターミナルデータベースはこの機能を利用して最も一般的なscreenバリエーションを提供します。xtermと他の同様の端末ですが、その他ファンクションキー(例:コンソール静脈血栓塞栓症(例:GNOME端末)、価値を得る。それ以外のすべてはrxvtまだTERM設定されていますxterm

デフォルト設定では、これらの端末記述は利用できない可能性があります(そして、この質問のように、ユーザーがバグを報告するように設定し、screenインセンティブを提供します)。TERM=screen例えば ​​Debian ではncursesの基本terminfoパッケージは、最小限の端末記述セットのみを提供します。あなたはインストールする必要がありますncurses-term完全な端末データベースを入手してください。

もちろん、端末記述にはscreen拡張機能キーの記述はない。ちなみに、これには次の拡張機能が含まれています。

AX, G0, E0=\E(B, S0=\E(%p1%c,

ただし、これらのアプリのどれも(除くtput)何もしません。

tmux不完全な一致の動作は状況を複雑にしますscreen。 ncursesが提供する代替名を解決しません。理由は説明する必要はありません。マニュアルページ説明する

内部で実行されるすべてのプログラムでは、環境TERM変数をに設定する必要があります。新しいウィンドウがその環境に自動的に追加されますが、シェル起動ファイルからリセットされないように注意する必要があります。“screen”tmux“TERM=screen”

考えられる理由は、開発者がこれを保証したくなかったためですscreen。ファンクションキーは別の話です。提案されているように端末の説明を変更できますが、これは解決策よりも問題が多いことが証明されています。

これ推奨スクリプトところでうまくいかないようです。この質問のすべての文脈を考慮すると、修正されたスクリプトを表示することは意味がありません。ターミナルデータベースを断片的に調整するよりも、シェルの初期化でCaseステートメントを使用してTERM設定を確認し、ターミナルデータベースに既に優れた選択肢があるかどうかを確認することをお勧めします。screen開発者が端末の機能に応じて設定することを拒否するため、TERMこれを正しく実行することはより複雑になります。ただし、環境変数を調べると、ほとんどの方法が得られますCOLORTERM

あなたの娯楽のために:

答え3

tmuxの内部を見てみると、terminfoの設定などにあまり注意を払わないようです。たとえば、xtermモードをオンにすると、次のようになります。

set-window-option -g xterm-keys on

さまざまなキーに対応する実際のエスケープシーケンスはプログラムにハードコードされており、infocmp xtermユーザーが聞いた内容と異なる場合があります。

他に、tmuxはF20ハードコーディングされたキーセットだけを認識するので、上記のすべてを無視します。だからこんな感じ

set-option -g terminal-overrides "screen:kf34=\033[21;5~"

または

tmux bind-key -t emacs-copy F34 page-up

xtermやtputが何を吐いても何も起こりません。少なくとも今はそうです。

同じ問題が同様の問題に影響するかどうかはわかりませんが、kDC3可能性があるようです。

関連情報