Gnu-Screen

為什麼在 xterm + tmux 中按 Ctrl-h 會發送“^?”?

  • June 17, 2017

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

在外面時tmuxCtrl- v Ctrl-h輸出^H。在裡面tmux,我開始得到^?if run from xterm。從它內部screen執行xterm仍然輸出^H。這背後的原因是什麼?它應該輸出^H還是^??如何解決這個問題?

原因是在您的 xterm 中,^Herase字元,並且tmux顯然將erase字元轉換為它所模擬的終端的相應控製字元 ( ^?),因此擦除在熟模式下按預期工作(例如,當您鍵入時會發生什麼cat) . 如果您使用帶有擦除字元(由密鑰生成)的終端,則需要進行翻譯^?,然後使用用作擦除字元(由密鑰生成)Backspace的終端恢復會話。不幸的是,這在某些情況下會產生明顯的副作用,例如,如果您鍵入+ 。^H``Backspace``Ctrl``H

唯一好的補救措施是確保您的所有終端(真實的或在 tmux 中)使用相同的erase字元,這應該是^?(這是現在的標準)。看來您的 xterm 配置錯誤。這不是預設配置,AFAIK。

在任何情況下,您都需要確保使用TERMwhich 的值kbs=\177。但是,官方 ncurses並非如此xterm-256color。因此,您要麼需要選擇不同的TERM值,要麼需要修復kbs條目xterm-256color(這可以由最終使用者使用: infocmp > file、 modifyfile和來完成tic file)。一些 Linux 發行版沒有這個問題;例如,Debian 已經通過其源包debian/xterm.ti中的一個文件解決了這個問題,給出:ncurses

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

你還應該有:

$ appres XTerm | grep backarrowKeyIsErase:
*backarrowKeyIsErase:   true

請注意,您可以stty erase '^?'在 xterm 中執行(在執行其他任何操作之前),但這只是一種解決方法(它可能會破壞Backspace密鑰的行為)。預設情況下,您實際上應該擁有erase = ^?(如 所示)!stty -a

如果問題Backspace和/或Delete仍然存在,我推薦 Anne Baretta 的Consistent BackSpace and Delete Configuration文件。

引用自:https://unix.stackexchange.com/questions/180087