Home / End键在tmux中不起作用

时间:2013-09-03 19:38:37

标签: linux bash tmux

我目前正在使用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内部与外部时,为什么生成的序列不同?如何解决这个问题,以免在任何程序中出现问题?

9 个答案:

答案 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 zshzshbash中的输出内容:

tmux

➜  ~ cat -v
^[[1~^[[4~^C

zsh

➜  ~ cat -v
^[[H^[[F

重击

bash-3.2$ cat -v
^[[H^[[F

解决方案

通过将tputcat -v配对,将上述示例与我们期望看到的进行比较:

$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF

结论

由于此问题仅存在于tmux中,而不存在于模拟器本身中,因此我选择在tmux配置中进行绑定更改。通过将bind-keysend配对使用,我们可以将Escape关键字与想要实现翻译的序列配对使用。因此:

bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE

此调试和解决过程可以应用于任何其他关键翻译问题。但是,不要太疯狂了。由于某些原因,某些键被映射到某些转义序列。注意bashzsh如何收到 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,因此必然会失败。