x-y*_*uri 4 gnu-screen tmux xterm gnome-terminal
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在外部时tmux,Ctrl- v Ctrl-h输出^H。在里面tmux,^?如果从xterm. screen从xterm它内部运行仍然输出^H。这背后的原因是什么?它应该输出^H还是^??如何补救?
原因是在您的 xterm 中,^H是erase字符,并且tmux显然将erase字符转换^?为它模拟的终端的相应控制字符 ( ),以便擦除在熟模式下按预期工作(例如,当您键入时会发生什么cat) . 如果您使用带有^?擦除字符(由Backspace密钥生成)的终端,然后使用^H用作擦除字符(由Backspace密钥生成)的终端恢复会话,则需要进行转换。不幸的是,这在某些情况下会产生明显的副作用,例如,如果您输入Ctrl+ H。
唯一好的补救措施是确保您的所有终端(真实的或在 tmux 中)使用相同的erase字符,这应该是^?(这是现在的标准)。您的 xterm 似乎配置不当。这不是默认配置,AFAIK。
在任何情况下,您都需要确保TERM为 which使用一个值kbs=\177。然而,这是不是对的情况下xterm-256color从官方的ncurses。因此,您要么需要选择不同的TERM值,要么需要修复kbs条目xterm-256color(这可以由最终用户使用:infocmp > file、修改file、然后tic file)。一些 Linux 发行版没有这个问题;例如,Debian 已经通过debian/xterm.ti其ncurses源包中的一个文件修复了这个问题,给出:
$ infocmp xterm-256color | grep kbs
kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
Run Code Online (Sandbox Code Playgroud)
你还应该有:
$ appres XTerm | grep backarrowKeyIsErase:
*backarrowKeyIsErase: true
Run Code Online (Sandbox Code Playgroud)
请注意,您可以stty erase '^?'在 xterm 中执行(在执行其他任何操作之前),但这只是一种解决方法(并且可能会破坏Backspace密钥的行为)。默认情况下,您实际上应该拥有erase = ^?(如 所示stty -a)!
如果问题Backspace和/或Delete仍然存在,我推荐Anne Baretta的Consistent BackSpace and Delete Configuration文档。
小智 7
这里或其他地方的解决方案都不适合我。有效的是将以下内容添加到我的$HOME/.tmux.conf文件中:
bind-key -n Bspace send-keys C-h
Run Code Online (Sandbox Code Playgroud)
这使得 tmux在按下时Ctrl发送。HBackspace
我在下面提供了一些评论、背景和咆哮,所以请随意停止阅读这里。-:)
我不同意vinc17的观点,即“唯一好的补救措施”是使退格/擦除字符仅是^?。用户应该能够按照他或她认为合适的方式进行配置。
自实际终端出现以来,对于我们许多使用 Unix 的人来说,一个常见的解决方案是使用 ^H 表示 Backspace 和 ^? 用于 DEL(即在光标之后删除,而不是之前删除)。Ctrl-H 和 Backspace 之间的区别过去和现在并不总是必要的,特别是对于 CLI/终端程序。
我一直在使用 ^H / ^? 的映射 自 80 年代末以来,在许多机器上,以及自从真实终端“消亡”以来,对于终端程序和虚拟控制台,我一直使用 Backspace / DEL 键(分别),并且不想在我的所有机器和那些机器上重新配置我的擦除字符。我的客户(很多很多机器)要使用 Backspace 发送 ^?工作。
我根据各种帖子尝试了各种方法,让 tmux 发送 Ctrl-H 进行退格键。特别是,“bind-key -n Ch send-keys Ch”不起作用让我感到沮丧,因为我在 Terminator 中使用 tmux,并且我知道我的 Terminator 设置为在按下 Backspace 键时发送 Ctrl-H。我花了很长时间才偶然发现一篇列出可用 tmux 键名称的帖子,这是我找到 Bspace 键名称的地方,幸运的是,它可以让 ^H 字符正确地通过 tmux(Ubuntu 16.04 上的 tmux 版本 2.1-3build1)。 02)。
小智 5
由于 xfce4-terminal 中滚动缓慢而切换到 xterm 后,我遇到了同样的问题。在 ~/.Xresources 中,我设置了
XTerm*ptyInitialErase: true
. 请参阅 xterm 手册页。此设置将^Hvs.^?留给伪终端。为了测试这一点,我执行了 Ctrl-V Ctrl-H,确实输出了^H。