我目前正在使用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
为了解决这个问题,我决定将以下内容添加到我的.bashrc中:
if [[ -n "$TMUX" ]]; then
bind '"\e[1~":"\eOH"'
bind '"\e[4~":"\eOF"'
fi
这解决了bash的问题,但是在其他readline程序中,例如在诸如ipython之类的REPL中,它仍然为home / end插入了代字号。
为什么这首先是一个问题?当我在tmux内部与外部时,为什么生成的序列不同?如何解决这个问题,以免在任何程序中出现问题?
答案 0 :(得分:38)
似乎主要问题是使用xterm-256color作为$ TERM。我将$ TERM切换到了屏幕256色,问题就消失了。
答案 1 :(得分:29)
在tmux 2.0中,您只需在.tmux.conf
中添加以下两行:
bind -n End send-key C-e
bind -n Home send-key C-a
答案 2 :(得分:8)
如果由于某种原因想要在tmux中使用xterm-256color,请将arch solution与inputrc一起使用。我在tmux中测试了它与rxvt,ruby irb,python,lua和home / end键都可以。可能每个readline应用程序都可以。
来自arch wiki:
首先要做的事情:
不要手动设置$ TERM - 让终端执行此操作。
许多命令行应用程序使用Readline库来读取输入。因此,在许多情况下,正确配置Readline可以修复Home和End。
默认的/ etc / inputrc文件不包含home / end键的映射。
要检查这些键的发生转义序列是什么:
1. Ctrl + V
2. Home
3. Spacebar
4. Ctrl + V
5. End
这可能会打印:$ ^[[1~ ^[[4~
。因此,您必须将这些序列的映射添加到inputrc(/ etc / inputrc为全局,或仅为您的用户〜/ .inputrc):
"\e[1~": beginning-of-line
"\e[4~": end-of-line
答案 3 :(得分:2)
尝试了每种方法以及其他几种方法,同时仔细阅读了其他答案和文档后,这最终在我遇到的每种情况下对我都有效。我不能向您保证相同,因为每个人的情况都不同,但这就是我最终的目的。
将以下内容添加到您的.tmux.conf
:
bind-key -n Home send Escape "OH"
bind-key -n End send Escape "OF"
这是在引入this somewhat related article中相同的试验/错误和逻辑之后发现的。唯一的区别是发生翻译的位置(在.tmux.conf
内,而不是.bashrc
或.zshrc
内;主要是因为我的家庭/办公室在tmux之外工作正常)
您可以使用cat -v
来调试此问题,如上一篇文章中所述。
运行cat -v
,然后按 Home 和 End 键。使用 Ctrl + C 退出。
$ cat -v
这是我在tmux using zsh
,zsh
和bash
中的输出内容:
tmux
➜ ~ cat -v
^[[1~^[[4~^C
zsh
➜ ~ cat -v
^[[H^[[F
重击
bash-3.2$ cat -v
^[[H^[[F
通过将tput
与cat -v
配对,将上述示例与我们期望看到的进行比较:
$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF
由于此问题仅存在于tmux
中,而不存在于模拟器本身中,因此我选择在tmux配置中进行绑定更改。通过将bind-key
与send
配对使用,我们可以将Escape
关键字与想要实现翻译的序列配对使用。因此:
bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE
此调试和解决过程可以应用于任何其他关键翻译问题。但是,不要太疯狂了。由于某些原因,某些键被映射到某些转义序列。注意bash
和zsh
如何收到 Home 而不是^[[H
的{{1}}序列;除非我们在^[OH
中遇到重大问题,否则建议不要在.zshrc
中覆盖它。
答案 4 :(得分:2)
在我的情况下,这是tmux中的zsh问题(tmux中的重击是可以的)。 这里没有其他帮工为我工作。
但是将其添加到.zshrc
可以解决此问题:
bindkey "\E[1~" beginning-of-line
bindkey "\E[4~" end-of-line
除了我也有:
bindkey "\E[H" beginning-of-line
bindkey "\E[F" end-of-line
bindkey "\E[3~" delete-char
答案 5 :(得分:2)
set-window-option -g xterm-keys on
这应该适用于 tmux 2.6 及更高版本。 (tmux -V
检查)如果您使用的是旧版本,则您可能运行的是旧版 Ubuntu,您绝对应该考虑指向具有向后移植的 ppa。
这绝对不适用于 kitty,并且在输入方面有效地“硬编码”了终端,但它比硬编码特定键要好。
答案 6 :(得分:1)
所以我没有足够的意见要发表,所以我在这里说。我相信首选的解决方案是使用
set -g default-terminal "screen-256color"
中的~/.tmux.conf
。实际上,我前段时间遇到了这个问题,决定采用sumanta的解决方案:
bind -n End send-key C-e
bind -n Home send-key C-a
但是我忘记了,我把它留在这里,最后遇到了与vim类似的问题(home和end是从寄存器复制粘贴)而不是zsh。总之,绑定会影响vim。
答案 7 :(得分:0)
我浪费了很多时间尝试上述所有方法。 最后,我回到野蛮时代:
sudo apt purge tmux
sudo apt install tmux
为我修复了该问题。
答案 8 :(得分:0)
来自tmux FAQ:
请注意:大多数显示问题是由于不正确的术语造成的!之前 报告问题可确保TERM设置在内部和 在tmux之外。
tmux内部的TERM必须为“ screen”,“ tmux”或类似名称(例如 “ tmux-256color”)。不要在不存在的地方报告问题!
在外部,它应该与您的终端匹配:特别是,对于“ rxvt”使用 rxvt及其衍生物。
将以下命令添加到您的~/.tmux.conf
:
set -g default-terminal tmux-256color
PS:任何涉及显式绑定密钥的解决方案都是hack,因此必然会失败。