為什麼在 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
在外面時
tmux
,Ctrl
-v
Ctrl
-h
輸出^H
。在裡面tmux
,我開始得到^?
if run fromxterm
。從它內部screen
執行xterm
仍然輸出^H
。這背後的原因是什麼?它應該輸出^H
還是^?
?如何解決這個問題?
原因是在您的 xterm 中,
^H
是erase
字元,並且tmux
顯然將erase
字元轉換為它所模擬的終端的相應控製字元 (^?
),因此擦除在熟模式下按預期工作(例如,當您鍵入時會發生什麼cat
) . 如果您使用帶有擦除字元(由密鑰生成)的終端,則需要進行翻譯^?
,然後使用用作擦除字元(由密鑰生成)Backspace
的終端恢復會話。不幸的是,這在某些情況下會產生明顯的副作用,例如,如果您鍵入+ 。^H``Backspace``Ctrl``H
唯一好的補救措施是確保您的所有終端(真實的或在 tmux 中)使用相同的
erase
字元,這應該是^?
(這是現在的標準)。看來您的 xterm 配置錯誤。這不是預設配置,AFAIK。在任何情況下,您都需要確保使用
TERM
which 的值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文件。