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と設定の削除アンバレッタのファイル。

おすすめ記事