我目前正在使用tmux和xterm-256color $ TERM变量.当在tmux下的bash中时,按home/end会插入波形符(〜).在tmux之外,home/end键工作正常.
使用cat和tput,我可以看到生成序列和预期序列之间存在不匹配:
$ cat -v # pressing home, then end
^[[1~^[[4~
$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我决定将以下内容添加到我的.bashrc中:
if [[ -n "$TMUX" ]]; then
bind '"\e[1~":"\eOH"'
bind '"\e[4~":"\eOF"'
fi
Run Code Online (Sandbox Code Playgroud)
这解决了bash的问题,但是在其他readline程序中,例如在诸如ipython之类的REPL中,它仍然为home/end插入了代字号.
为什么这首先是一个问题呢?当我在tmux内部与外部时,为什么生成的序列不同?如何解决这个问题,以免在任何程序中出现问题?
Ben*_*vis 43
似乎主要问题是使用xterm-256color作为$ TERM.我将$ TERM切换到屏幕256色,问题就消失了.
小智 30
在tmux 2.0中,您可以在以下内容中添加以下两行.tmux.conf:
bind -n End send-key C-e
bind -n Home send-key C-a
Run Code Online (Sandbox Code Playgroud)
在我的情况下,tmux 中的 zsh 有问题(tmux 中的 bash 没问题)。这里的其他答案都不适合我。
但是添加这个来.zshrc修复它:
bindkey "\E[1~" beginning-of-line
bindkey "\E[4~" end-of-line
Run Code Online (Sandbox Code Playgroud)
除此之外,我还有:
bindkey "\E[H" beginning-of-line
bindkey "\E[F" end-of-line
bindkey "\E[3~" delete-char
Run Code Online (Sandbox Code Playgroud)
来自tmux 常见问题解答:
请注意:大多数显示问题都是由于错误的术语造成的!在报告问题之前,请确保 tmux 内部和外部的 TERM 设置正确。
tmux 内部的 TERM 必须是“screen”、“tmux”或类似的(例如“tmux-256color”)。不要费心报告不存在的问题!
在外部,它应该与您的终端匹配:特别是,使用“rxvt”表示 rxvt 和衍生产品。
将以下命令添加到您的~/.tmux.conf:
set -g default-terminal tmux-256color
Run Code Online (Sandbox Code Playgroud)
PS:任何涉及显式绑定密钥的解决方案都是黑客行为,因此必然会失败。
在尝试了每种方法以及其他几种方法并仔细阅读其他答案和文档后,这最终在我提出的每种情况下对我都有效。我不能为您保证相同,因为每个人的情况都不同,但这就是我最终的目的。
将以下内容添加到您的.tmux.conf:
bind-key -n Home send Escape "OH"
bind-key -n End send Escape "OF"
Run Code Online (Sandbox Code Playgroud)
这是在此相关文章中引入了相同的尝试/错误和逻辑后发现的。唯一的区别是发生翻译的位置(在内.tmux.conf,而不是.bashrc或.zshrc;主要是因为我的家庭/终端在tmux之外工作正常)
您可以使用cat -v上面的文章中引用的类似内容调试此问题。
运行cat -v,然后按Home和End键。使用Ctrl+ 退出C。
$ cat -v
Run Code Online (Sandbox Code Playgroud)
下面是我的输出看起来像内tmux using zsh,zsh和bash:
多路复用器
? ~ cat -v
^[[1~^[[4~^C
Run Code Online (Sandbox Code Playgroud)
sh
? ~ cat -v
^[[H^[[F
Run Code Online (Sandbox Code Playgroud)
重击
bash-3.2$ cat -v
^[[H^[[F
Run Code Online (Sandbox Code Playgroud)
通过tput与配对,将以上示例与我们期望看到的进行比较cat -v:
$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF
Run Code Online (Sandbox Code Playgroud)
因为此问题仅存在于tmux,而不存在于仿真器本身内,所以我选择在tmux配置内进行绑定更改。通过使用bind-key与配对send,我们可以将Escape关键字与想要实现翻译的序列配对使用。从而:
bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE
Run Code Online (Sandbox Code Playgroud)
此调试和解决过程可以应用于任何其他关键转换问题。但是,不要太疯狂了。由于某些原因,某些键被映射到某些转义序列。注意而不是; 如何bash和zsh接收^[[H序列; 除非我们在中遇到重大问题,否则可能不建议您在我们的手册中覆盖它。Home^[OH.zshrczsh