xterm + tmuxでCtrl-hを押すと「^?」が送信されるのはなぜですか?

xterm + tmuxでCtrl-hを押すと「^?」が送信されるのはなぜですか?

xterm:

$ echo $TERM
xterm-256color
$ stty -a
speed 38400 baud; rows 52; columns 91; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany
-imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

gnome-terminal:

$ echo $TERM
xterm-256color
$ stty -a
speed 38400 baud; rows 57; columns 100; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel
iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

屋外では--output.tmux内部で実行されているかどうかを理解し始めました。内部で実行すると、まだ出力されます。その理由は何ですか?出力する必要がありますか?この問題を解決するには?Ctrlv Ctrlh^Htmux^?xtermscreenxterm^H^H^?

答え1

その理由は、xtermで^Hこれがerase文字で、tmuxそのerase文字が明らかにエミュレートする端末の対応する制御文字()に変換され、削除が^?期待どおりに機能するためです。調理モード(たとえば、入力するとどうなりますかcat?)^?削除文字(キーで生成)を持つ端末を使用し、Backspace削除文字(キーで生成)として機能する端末を使用してセッションを復元する場合は、変換する必要があります。残念ながら、+を入力した場合など、一部のケースでは重大な副作用が発生する可能性があります。^HBackspaceCtrlH

唯一の良い解決策は、すべての端末(実際またはtmux)が同じerase文字を使用していることを確認することです。^?これは今日の標準です。 xtermの設定が間違っているようです。 AFAIK、これはデフォルト設定ではありません。

TERMそれにもかかわらず、それを表現するために値を使用する必要がありますkbs=\177。しかし、これはいいえxterm-256color公式ncursesの例。したがって、別の値を選択するか、項目を変更する必要がありますTERM(エンドユーザーは、修正、およびを使用して実行できます)。一部のLinuxディストリビューションにはこの問題はありません。たとえば、Debianはソースパッケージのファイルを介してこの問題を解決します。kbsxterm-256colorinfocmp > filefiletic filedebian/xterm.tincurses

$ infocmp xterm-256color | grep kbs
        kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,

以下も必要です。

$ appres XTerm | grep backarrowKeyIsErase:
*backarrowKeyIsErase:   true

他の操作を実行する前にxtermでこれを実行できますが、stty erase '^?'これは回避策であり、キーの動作が中断される可能性がありますBackspace。基本的に実際にはerase = ^?(図のように)する必要がありますstty -a

問題が続くBackspaceDelete続く場合は、以下をお勧めします。一貫したBackSpaceと設定の削除アンバレッタのファイル。

答え2

ここや他の場所では、どのソリューションも私には役に立ちませんでした。効果があったのは、私の$HOME/.tmux.confファイルに以下を追加することでした。

bind-key -n Bspace send-keys C-h

押すとtmuxが送信されますCtrlHBackspace


以下にいくつかのコメント、背景、および豪言のおしゃべりを提供しましたので、ここで読むのをやめてください。 -:)


私は「唯一の良い解決策」がバックスペース/消去文字だけを作成するというvinc17のコメントに同意しません^? 。ユーザーは自分が適切であると思うように構成できる必要があります。

実際の端末が登場して以来、Unixを使用する多くの人にとって一般的な解決策は、バックスペースに^ Hを使用し、DELに^?を使用することです(つまり、カーソルの前ではなく削除)。 Ctrl-Hとバックスペースの違いは、特にCLI /ターミナルプログラムの場合は必ずしも必要ではなく、必ずしも必要ではありません。

私は80年代後半から多くのコンピュータで^ H / ^?マッピングを使用しており、実際の端末が「死んだ」以来、端末プログラムと仮想コンソールにBackspace / DELキーを使用してきました(それぞれ)、そして私のすべてのコンピュータとそのコンピュータで消去文字を再構成したくありません。私の顧客(非常に多くのコンピュータ)がバックスペースを使って送信したいですか?働く

私はtmuxがバックスペースのためにCtrl-Hを送るようにするために、さまざまな投稿に基づいてさまざまな方法を試しました。具体的には、Terminatorでtmuxを使用しているため、「bind-key -n Ch send-keys Ch」が機能しないことがわかります。そして、私のTerminatorがバックスペースキーを押すとCtrl-Hを送信するように設定されていることを知っています。キーを押しました。利用可能なtmuxキー名をリストした投稿を誤って発見するのに長い時間がかかりました。ここでBspaceキー名を見つけました。幸いなことに、^ H文字はtmuxを正しく渡すことができました(Ubuntu 16.04バージョン2.1-3build1のtmux)。 。 02)。

答え3

xfce4-terminalの遅いスクロールが原因でxtermに切り替えた後も同じ問題が発生しました。 ~/.Xresourcesで私は設定しました XTerm*ptyInitialErase: true 。 xterm のマニュアルページを参照してください。この設定はvs。疑似端末^Hに残ります。^?これをテストするためにCtrl-V Ctrl-Hを実行し、出力は^H

関連情報