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

おすすめ記事