Emacs編集モードのZshには、主キーバインディング+カーソルのALT右側Backspaceの単語削除とALT+D左側の単語削除が付属しています。ALT+に後者の機能を追加したいですDEL。
terminfo
各キーの組み合わせに対してエスケープシーケンスを正しく設定するためにデータベースを使用しようとしています$TERM
。 Capnameになることman terminfo
を読んだときは、+kDC3
にその名前を使用する必要があります。ALTDEL
私のエントリに次の行を追加しました~/.zshrc
。
bindkey -e `tput kDC3` kill-word
$TERM
SSH(is)を介して自分のコンピュータに直接接続すると、これはうまく機能しますxterm
。ただし、Tmuxセッション($TERM
is 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)
完全性のために代わりに使用したいかもしれませんDC
。grepUp、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
。 - すでに
tmux
kDC3
テーブル、電話しないuse_extended_names
この機能を有効にします。 - ncurses
tput
はわかりますkDC3
。もしこれは現在の端末記述で定義されています。
screen
(tmux
模倣した)プログラムも正しいです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
可能性があるようです。